From 5ac73176b4286702a6883fcb2e01fddb29877d05 Mon Sep 17 00:00:00 2001 From: zevo <95449138+Zevotech@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:51:49 -0400 Subject: [PATCH 01/57] Fixes a few missing sprites I caused (#2343) ## About The Pull Request Junglebushes a b and c use some interesting naming conventions for randomizing sprites which flew under the radar of me fixing them. This was noticed quickly due to the new error fauna sprites, thankfully. ## Why It's Good For The Game Error rock bushes bad! ![imageArbitraryName](https://media.discordapp.net/attachments/837744059291533395/1149589714161111090/whatthefuckisthis.gif) (gif courtesy of genericDM) ## Changelog :cl: fix: fixed the icon states for junglebushes a, b, and c. /:cl: --- code/game/objects/structures/flora.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 286fda25fbfe..2c56b9d7a095 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -492,7 +492,7 @@ desc = "A wild plant that is found in jungles." icon = 'icons/obj/flora/jungleflora.dmi' icon_state = "busha" - base_icon_state = "bush" + base_icon_state = "busha" /obj/structure/flora/junglebush/Initialize() icon_state = "[base_icon_state][rand(1, 3)]" @@ -500,9 +500,11 @@ /obj/structure/flora/junglebush/b icon_state = "bushb" + base_icon_state = "bushb" /obj/structure/flora/junglebush/c icon_state = "bushc" + base_icon_state = "bushc" /obj/structure/flora/junglebush/large icon_state = "bush" From c49066fae42d5a945c2d0d8fe13ba5f174055a48 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 8 Sep 2023 15:09:58 -0500 Subject: [PATCH 02/57] Automatic changelog generation for PR #2343 [ci skip] --- html/changelogs/AutoChangeLog-pr-2343.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2343.yml diff --git a/html/changelogs/AutoChangeLog-pr-2343.yml b/html/changelogs/AutoChangeLog-pr-2343.yml new file mode 100644 index 000000000000..85a7537072ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2343.yml @@ -0,0 +1,4 @@ +author: Zevotech +delete-after: true +changes: + - bugfix: fixed the icon states for junglebushes a, b, and c. From eb50f62c52e1395f643ea3e0738263aafc65b983 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 9 Sep 2023 00:43:30 +0000 Subject: [PATCH 03/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2343.yml | 4 ---- html/changelogs/archive/2023-09.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2343.yml diff --git a/html/changelogs/AutoChangeLog-pr-2343.yml b/html/changelogs/AutoChangeLog-pr-2343.yml deleted file mode 100644 index 85a7537072ce..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2343.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zevotech -delete-after: true -changes: - - bugfix: fixed the icon states for junglebushes a, b, and c. diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index dd0ce607f9ba..b06920b70419 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -34,3 +34,6 @@ - bugfix: Most rocks are now visible again - rscadd: Most flora files now have missing texture sprites to make it easier to spot when something has gone wrong. +2023-09-09: + Zevotech: + - bugfix: fixed the icon states for junglebushes a, b, and c. From 2a91fd6e96aaf77920d6e37a7b62e839c58f3df8 Mon Sep 17 00:00:00 2001 From: GenericDM <34109002+GenericDM@users.noreply.github.com> Date: Sat, 9 Sep 2023 13:08:23 -0700 Subject: [PATCH 04/57] Removes Solarian invisibility technology (#2342) fixes #2269 ![hatfix](https://github.com/shiptest-ss13/Shiptest/assets/34109002/4c337d0d-9fd2-4ce7-b24a-e7c09b7b1dbe) :cl: fix: The SolGov surgical cap no longer turns invisible when handled. /:cl: --- code/modules/clothing/head/misc.dm | 5 +++++ code/modules/clothing/head/soft_caps.dm | 7 ------- code/modules/clothing/outfits/solgov.dm | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 4f74a1e80295..0ac57271c0b0 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -510,3 +510,8 @@ desc = "You feel ashamed about what you had to do to get this hat" icon_state = "cowboy" item_state = "cowboy" + +/obj/item/clothing/head/solgov_surgery + name = "SolGov surgery cap" + desc = "It's a surgery cap utilized by solarian doctors." + icon_state = "solgov_surgery" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 96f5d8d7737b..dd689223380c 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -136,13 +136,6 @@ soft_type = "paramedic" dog_fashion = null -/obj/item/clothing/head/soft/solgov - name = "SolGov surgery cap" - desc = "It's a surgery cap utilized by solarian doctors." - icon_state = "solgov_surgery" - soft_type = "solgov_surgery" - dog_fashion = null - /obj/item/clothing/head/soft/cybersun name = "cybersun medic cap" desc = "A turquoise baseball hat emblazoned with a reflective cross. Typical of Cybersun Industries field medics." diff --git a/code/modules/clothing/outfits/solgov.dm b/code/modules/clothing/outfits/solgov.dm index 94024240e308..56addfb34813 100644 --- a/code/modules/clothing/outfits/solgov.dm +++ b/code/modules/clothing/outfits/solgov.dm @@ -126,7 +126,7 @@ uniform = /obj/item/clothing/under/solgov/formal accessory = /obj/item/clothing/accessory/armband/medblue shoes = /obj/item/clothing/shoes/laceup - head = /obj/item/clothing/head/soft/solgov + head = /obj/item/clothing/head/solgov_surgery suit = /obj/item/clothing/suit/solgov/jacket l_hand = /obj/item/storage/firstaid/medical From f3044797404ecdc950b100cac59788a4e89ba2f8 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 9 Sep 2023 15:23:55 -0500 Subject: [PATCH 05/57] Automatic changelog generation for PR #2342 [ci skip] --- html/changelogs/AutoChangeLog-pr-2342.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2342.yml diff --git a/html/changelogs/AutoChangeLog-pr-2342.yml b/html/changelogs/AutoChangeLog-pr-2342.yml new file mode 100644 index 000000000000..3c5d387219db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2342.yml @@ -0,0 +1,4 @@ +author: GenericDM +delete-after: true +changes: + - bugfix: The SolGov surgical cap no longer turns invisible when handled. From 25c2e08d7a6364ff3af4173756f15797407dbb52 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 10 Sep 2023 00:48:25 +0000 Subject: [PATCH 06/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2342.yml | 4 ---- html/changelogs/archive/2023-09.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2342.yml diff --git a/html/changelogs/AutoChangeLog-pr-2342.yml b/html/changelogs/AutoChangeLog-pr-2342.yml deleted file mode 100644 index 3c5d387219db..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2342.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: GenericDM -delete-after: true -changes: - - bugfix: The SolGov surgical cap no longer turns invisible when handled. diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index b06920b70419..f80cbf64b492 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -37,3 +37,6 @@ 2023-09-09: Zevotech: - bugfix: fixed the icon states for junglebushes a, b, and c. +2023-09-10: + GenericDM: + - bugfix: The SolGov surgical cap no longer turns invisible when handled. From 7d19bef51facb6a3cf2ff13ccb6cba784cf32490 Mon Sep 17 00:00:00 2001 From: Dethstorm <88121917+Dethstorm@users.noreply.github.com> Date: Sun, 10 Sep 2023 08:18:47 -0300 Subject: [PATCH 07/57] Revamps wasteplanet_unhonorable (#2256) ## About The Pull Request Revamps all of wasteplanet_unhonorable to not be a mess of a ruin. Screenshot_2370 Screenshot_2371 ## Why It's Good For The Game Because bad ruins are bad. ## Changelog :cl: add: new stuff to wasteplanet_unhonorable add: new areas for wasteplanet_unhonorable /:cl: --------- Signed-off-by: Dethstorm <88121917+Dethstorm@users.noreply.github.com> Co-authored-by: Bjarl <94164348+Bjarl@users.noreply.github.com> Co-authored-by: spockye <79304582+spockye@users.noreply.github.com> --- .../WasteRuins/wasteplanet_unhonorable.dmm | 2519 ++++++++++++++--- _maps/map_catalogue.txt | 4 +- code/game/area/areas/ruins/wasteplanet.dm | 14 + 3 files changed, 2205 insertions(+), 332 deletions(-) diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm index 37b6d1321dd1..e7e459f7f670 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_unhonorable.dmm @@ -1,397 +1,2256 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"c" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/ruin) -"d" = ( -/obj/structure/radioactive, +"aF" = ( +/obj/item/clothing/head/radiation, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"aP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"bc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/road/line/edge/transparent/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"bX" = ( +/obj/effect/decal/cleanable/greenglow/filled, +/obj/effect/dummy/lighting_obj{ + light_color = "#80B425"; + light_power = 2 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"bZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs/old, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"cd" = ( +/obj/structure/fence/corner{ + dir = 1 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"e" = ( -/obj/structure/reagent_dispensers/fueltank, +/area/ruin/wasteplanet/wasteplanet_radiation) +"cn" = ( +/obj/structure/sign/warning/radiation/rad_area{ + pixel_x = 32 + }, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"dC" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"dU" = ( +/obj/structure/salvageable/circuit_imprinter, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"g" = ( +/area/ruin/wasteplanet/wasteplanet_radiation) +"eD" = ( +/obj/item/clothing/suit/radiation, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"eO" = ( +/turf/closed/wall/r_wall/rust/yesdiag, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"eW" = ( +/obj/machinery/portable_atmospherics/canister/tritium, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"fb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/miskilamo_big/one{ + color = "#580818" + }, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"fK" = ( +/obj/effect/decal/remains/xeno/larva, +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"gn" = ( +/obj/item/clothing/suit/radiation, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"i" = ( -/obj/effect/gibspawner, +/area/ruin/wasteplanet/wasteplanet_radiation) +"gr" = ( +/turf/open/floor/plating/wasteplanet, +/area/ruin/wasteplanet/wasteplanet_radiation) +"gx" = ( +/mob/living/simple_animal/hostile/hivebot/wasteplanet, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"j" = ( -/obj/item/grenade/syndieminibomb, -/obj/item/ammo_box/magazine/aknt, +/area/ruin/wasteplanet/wasteplanet_radiation) +"gM" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"gX" = ( +/obj/effect/decal/cleanable/shreds, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"k" = ( -/obj/structure/radioactive/stack, +/area/ruin/wasteplanet/wasteplanet_radiation) +"ig" = ( +/obj/item/reagent_containers/pill/potassiodide{ + pixel_x = 4; + pixel_y = -6 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"iA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer2{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"iQ" = ( +/turf/closed/wall/r_wall, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"iS" = ( +/obj/item/circuitboard/machine/rad_collector, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"iT" = ( +/obj/structure/spawner/wasteplanet/hivebot/low_threat, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"l" = ( -/obj/structure/table/reinforced, -/obj/item/ammo_box/magazine/aknt{ - pixel_x = -15; - pixel_y = -9 +/area/ruin/wasteplanet/wasteplanet_radiation) +"jh" = ( +/obj/structure/sign/warning/radiation/rad_area{ + pixel_y = 31 + }, +/turf/open/floor/plating/wasteplanet, +/area/ruin/wasteplanet/wasteplanet_radiation) +"kd" = ( +/obj/machinery/door/airlock/public/glass{ + dir = 8 }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"kq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/fullysynthetic, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"kS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/isf_big/seven{ + color = "#580818" + }, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"lJ" = ( +/obj/effect/radiation/waste/intense, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"lL" = ( +/obj/structure/fence/cut/large, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"m" = ( -/obj/effect/radiation, +/area/ruin/wasteplanet/wasteplanet_radiation) +"lS" = ( +/obj/structure/sign/warning/longtermwaste{ + pixel_y = 32 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"n" = ( -/obj/item/ammo_box/magazine/aknt, +/area/ruin/wasteplanet/wasteplanet_radiation) +"mi" = ( +/obj/item/clothing/head/radiation, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"o" = ( -/obj/structure/fence/door, +/area/ruin/wasteplanet/wasteplanet_radiation) +"my" = ( +/obj/structure/fence, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"p" = ( -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/mine/shrapnel, +/area/ruin/wasteplanet/wasteplanet_radiation) +"mF" = ( +/obj/machinery/door/airlock/maintenance/external{ + dir = 4 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"mQ" = ( +/obj/machinery/power/rad_collector, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"mV" = ( +/obj/structure/fence{ + dir = 8 + }, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"mZ" = ( +/mob/living/simple_animal/bot/secbot{ + hacked = 1 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"q" = ( -/obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/assualt/ak47/nt, +/area/ruin/wasteplanet/wasteplanet_radiation) +"no" = ( +/obj/machinery/vending/sovietsoda, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"nN" = ( +/obj/structure/radioactive{ + pixel_x = 7 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"oA" = ( +/obj/machinery/light/dim{ + dir = 1; + pixel_y = 20 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"oF" = ( +/obj/effect/decal/cleanable/oil/slippery, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"r" = ( -/obj/item/stack/sheet/mineral/uranium/five, +/area/ruin/wasteplanet/wasteplanet_radiation) +"oY" = ( +/obj/machinery/door/airlock/maintenance/glass{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"ph" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 4; + piping_layer = 2 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"pp" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"pr" = ( +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"s" = ( -/obj/structure/fence/corner{ - dir = 10 +/area/ruin/wasteplanet/wasteplanet_radiation) +"pZ" = ( +/obj/structure/fence/cut/medium{ + dir = 8 }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"t" = ( -/obj/item/stack/sheet/mineral/uranium/five, -/obj/structure/radioactive/stack, +/area/ruin/wasteplanet/wasteplanet_radiation) +"qy" = ( +/obj/structure/closet/radiation{ + anchored = 1 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"qF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"rI" = ( +/mob/living/simple_animal/bot/cleanbot{ + hacked = 1 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"v" = ( -/obj/machinery/door/airlock/vault, -/obj/effect/mapping_helpers/airlock/locked, +/area/ruin/wasteplanet/wasteplanet_radiation) +"sh" = ( +/obj/structure/radioactive/stack{ + pixel_y = -12 + }, +/obj/structure/radioactive{ + pixel_y = 6 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"sw" = ( +/obj/structure/table/greyscale, +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 6; + pixel_y = 17 + }, +/obj/item/storage/fancy/cigarettes/dromedaryco, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin/powered) -"x" = ( -/obj/item/stack/sheet/mineral/uranium/five, -/obj/structure/radioactive, +/area/ruin/wasteplanet/wasteplanet_radiation) +"sR" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"tl" = ( +/obj/item/stack/ore/uranium, +/obj/effect/turf_decal/industrial/warning/dust/corner, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"ty" = ( +/turf/template_noop, +/area/template_noop) +"tA" = ( +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"tN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"uf" = ( +/obj/structure/girder, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"uF" = ( +/obj/machinery/light/broken{ + dir = 1; + pixel_y = 20 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"uZ" = ( +/obj/structure/salvageable/autolathe, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"y" = ( -/obj/structure/table/reinforced, -/obj/item/gun/energy/e_gun/nuclear, +/area/ruin/wasteplanet/wasteplanet_radiation) +"vL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/spawner/structure/window/hollow/reinforced, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"vV" = ( +/obj/item/clothing/head/helmet/r_trapper{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/clothing/under/syndicate/soviet, +/obj/structure/closet/radiation/empty{ + anchored = 1 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"wn" = ( +/obj/structure/flora/ash/glowshroom, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"z" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall/rust, -/area/ruin) -"A" = ( -/obj/item/grenade/frag, -/obj/structure/reagent_dispensers/fueltank, +/area/ruin/wasteplanet/wasteplanet_radiation) +"wG" = ( +/obj/machinery/power/rad_collector, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"wI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"xj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/firealarm/directional/north, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"xt" = ( +/turf/closed/wall/r_wall/rust/yesdiag, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"yj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"yu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"yW" = ( +/obj/effect/spawner/structure/window/hollow, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"zv" = ( +/obj/structure/mecha_wreckage/ripley/firefighter, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"B" = ( +/area/ruin/wasteplanet/wasteplanet_radiation) +"zC" = ( +/turf/closed/wall/r_wall, +/area/ruin/wasteplanet/wasteplanet_radiation) +"zH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/vault, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"zL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/sheet/mineral/uranium/five, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Aa" = ( +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/machinery/power/port_gen/pacman/super/not_very{ + anchored = 1; + sheet_left = 1; + sheets = 10 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/sign/poster/contraband/cybersun{ + pixel_y = 31 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"AV" = ( +/obj/effect/turf_decal/industrial/warning/dust/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/radiation/waste/intense, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"BH" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/directional/north{ + emergency_lights = 1 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"BI" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Dd" = ( +/obj/effect/turf_decal/road/line/edge/transparent/yellow, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"DJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible/layer4{ + dir = 1 + }, +/obj/machinery/light/small/broken{ + dir = 1; + pixel_y = 16 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Er" = ( +/obj/structure/railing/modern{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/road/line/transparent/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/road/line/transparent/yellow, +/obj/effect/turf_decal/road/line/transparent/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/road/line/edge/transparent/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/road/line/edge/transparent/yellow, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"EF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Gc" = ( /turf/closed/wall/r_wall/rust, -/area/ruin) -"C" = ( -/obj/item/ammo_box/magazine/aknt, -/obj/structure/reagent_dispensers/fueltank, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"Gl" = ( +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Gn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Hf" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Hm" = ( +/obj/machinery/door/airlock/maintenance/external{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Hn" = ( +/obj/structure/sign/warning/radiation/rad_area{ + pixel_y = -32 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"D" = ( +/area/ruin/wasteplanet/wasteplanet_radiation) +"HJ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"HR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/isf_big/three{ + color = "#580818" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Im" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"IE" = ( +/obj/item/stack/ore/uranium, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Jq" = ( +/obj/item/stack/ore/uranium, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Jw" = ( +/obj/structure/girder, +/turf/open/floor/plating/wasteplanet, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Jy" = ( +/obj/item/chair/stool/bar{ + pixel_x = 10; + pixel_y = -6 + }, +/obj/item/reagent_containers/pill/potassiodide{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Kl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/broken{ + dir = 8; + pixel_x = -23 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Kp" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/syndicake{ + pixel_x = 4; + pixel_y = 13 + }, +/obj/item/reagent_containers/food/snacks/syndicake{ + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1; + pixel_y = 17 + }, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Ku" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"KA" = ( /obj/structure/fence, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Ld" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Lh" = ( +/obj/machinery/advanced_airlock_controller{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Ln" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"E" = ( -/obj/effect/radiation, -/turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"F" = ( -/turf/closed/wall/r_wall, -/area/ruin) -"G" = ( -/obj/item/stack/sheet/mineral/uranium/five, -/obj/effect/gibspawner, -/turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"H" = ( -/obj/item/grenade/stingbang, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Lp" = ( +/mob/living/simple_animal/bot/hygienebot{ + hacked = 1 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"I" = ( -/obj/item/flashlight/lantern, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Mh" = ( +/mob/living/simple_animal/hostile/hivebot/wasteplanet/ranged/rapid, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"K" = ( -/obj/effect/mine/shrapnel, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Mq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"MV" = ( +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"L" = ( -/obj/structure/sign/warning/radiation, +/area/ruin/wasteplanet/wasteplanet_radiation) +"MX" = ( +/obj/item/stack/cable_coil/cut/red, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"M" = ( +/area/ruin/wasteplanet/wasteplanet_radiation) +"Na" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Nj" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Nx" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/components/binary/pump/on/layer2{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"Ny" = ( +/obj/item/stack/ore/uranium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"NG" = ( +/obj/structure/closet/crate/radiation{ + anchored = 1 + }, +/obj/item/nuke_core, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"NO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/road/line/transparent/yellow, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"OK" = ( +/obj/structure/fence/corner{ + dir = 10 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"O" = ( -/obj/structure/marker_beacon, +/area/ruin/wasteplanet/wasteplanet_radiation) +"PB" = ( +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"P" = ( -/obj/effect/gibspawner, +/area/ruin/wasteplanet/wasteplanet_radiation) +"PV" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Qp" = ( +/obj/effect/radiation/waste/intense, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Qz" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"QB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"QU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/radiation/waste, +/obj/effect/turf_decal/industrial/warning/dust{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Rg" = ( +/obj/structure/flippedtable{ + dir = 4 + }, +/obj/item/storage/pill_bottle/potassiodide{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Rv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Rz" = ( /obj/structure/radioactive/waste, +/obj/effect/decal/cleanable/greenglow/filled, +/obj/effect/dummy/lighting_obj{ + light_color = "#80B425"; + light_power = 2 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"RU" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating/asteroid/wasteplanet, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Sf" = ( +/turf/closed/wall/r_wall, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Sg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plating/wasteplanet/rust, +/area/ruin/wasteplanet/wasteplanet_radiation) +"SQ" = ( +/obj/structure/sign/warning/nosmoking/burnt{ + pixel_x = -27 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Tf" = ( +/obj/structure/radioactive{ + pixel_x = -1; + pixel_y = 7 + }, +/obj/structure/radioactive{ + pixel_x = 8 + }, +/obj/structure/radioactive{ + pixel_x = 8; + pixel_y = 19 + }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Th" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"Tm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/advanced_airlock_controller/internal{ + dir = 4; + pixel_x = 26 + }, +/obj/structure/sign/warning/radiation{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"TE" = ( +/obj/structure/fence, +/obj/machinery/atmospherics/pipe/simple/scrubbers, /turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) -"Q" = ( -/obj/structure/fence/corner, +/area/ruin/wasteplanet/wasteplanet_radiation) +"UR" = ( /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"R" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation{ - pixel_y = 8 +/area/ruin/wasteplanet/wasteplanet_radiation) +"Va" = ( +/obj/structure/radioactive/stack, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Vg" = ( +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Vn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"VA" = ( +/obj/structure/radioactive{ + pixel_x = -6; + pixel_y = 9 + }, +/obj/structure/radioactive{ + pixel_x = 3; + pixel_y = 4 }, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"VE" = ( +/turf/closed/wall/r_wall/rust/yesdiag, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"VP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/miskilamo_big/five{ + color = "#580818" + }, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"VY" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"S" = ( -/obj/structure/sign/warning/longtermwaste{ - pixel_y = 32 +/area/ruin/wasteplanet/wasteplanet_radiation) +"Wa" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"WB" = ( +/obj/structure/radioactive{ + pixel_x = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Xc" = ( +/obj/item/geiger_counter{ + pixel_y = 1 }, -/obj/structure/radioactive, +/obj/item/trash/syndi_cakes{ + pixel_y = 1 + }, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"Xi" = ( +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Xl" = ( +/turf/closed/mineral/random/wasteplanet, +/area/ruin/wasteplanet/wasteplanet_radiation) +"XC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow, +/obj/machinery/power/terminal, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/maint) +"XO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"XU" = ( +/obj/structure/fence/door, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"U" = ( -/obj/structure/radioactive, +/area/ruin/wasteplanet/wasteplanet_radiation) +"Yd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Yk" = ( +/obj/item/trash/can, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Yl" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"Yp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/industrial/warning/dust, +/turf/open/floor/plating/rust, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) +"YO" = ( +/obj/structure/fence/post{ + dir = 4 + }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"W" = ( +/area/ruin/wasteplanet/wasteplanet_radiation) +"Zd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"Zg" = ( +/obj/structure/railing/modern{ + dir = 6 + }, +/obj/effect/turf_decal/road/line/transparent/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/road/line/transparent/yellow, +/obj/effect/turf_decal/road/line/transparent/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/road/line/edge/transparent/yellow, +/obj/effect/turf_decal/road/line/edge/transparent/yellow{ + dir = 4 + }, +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/plasteel/dark, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"ZC" = ( /obj/structure/fence{ dir = 8 }, /turf/open/floor/plating/asteroid/wasteplanet, -/area/overmap_encounter/planetoid/wasteplanet/explored) -"Z" = ( -/obj/effect/mine/shrapnel, -/turf/open/floor/plating/asteroid/wasteplanet, -/area/ruin) +/area/ruin/wasteplanet/wasteplanet_radiation) +"ZJ" = ( +/turf/closed/wall/r_wall, +/area/ruin/wasteplanet/wasteplanet_radiation/main) +"ZP" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/wasteplanet/wasteplanet_radiation/containment) (1,1,1) = {" -c -B -F -B -F -F -F -F -z -a -a -a -a -a -a -a -a +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty "} (2,1,1) = {" -B -F -B -F -B -F -B -F -F -D -D -D -D -D -D -s -a +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +UR +UR +UR +ty +ty +UR +UR +Gl +UR +Gl +Gl +ty +ty +ty "} (3,1,1) = {" -B -B -x -d -e -i -t -B -F -M -k -M -M -U -M -W -a +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +UR +UR +Gl +UR +Gl +Gl +UR +UR +UR +Xl +Xl +MV +Xl +ty +ty "} (4,1,1) = {" -B -B -d -G -g -j -g -F -B -S -M -M -M -M -M -W -a +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +wn +UR +OK +KA +my +my +lL +cd +Xl +Xl +Xl +Xl +Xl +Xl +UR +ty "} (5,1,1) = {" -F -F -y -n -p -e -r -B -F -M -M -M -K -M -M -W -a +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +UR +UR +ZC +UR +UR +UR +gX +ZC +UR +Xl +Xl +Xl +Xl +UR +UR +ty "} (6,1,1) = {" -F -B -q -A -E -g -I -B -O -M -m -M -M -M -k -L -O +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +Gl +UR +pZ +UR +UR +UR +UR +ZC +UR +Xl +Xl +Xl +Xl +UR +UR +ty "} (7,1,1) = {" -B -B -l -n -i -C -Z -v -M -M -U -M -M -M -M -o -M +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +UR +UR +UR +UR +mV +UR +wn +UR +Gl +ZC +UR +Xl +Gl +UR +UR +UR +UR +ty "} (8,1,1) = {" -B -F -r -p -H -g -i -B -O -M -M -M -U -M -M -W -O +ty +ty +ty +UR +ty +ty +ty +ty +ty +UR +UR +ty +ty +ty +ty +ty +UR +Xl +UR +UR +mV +RU +UR +UR +Gl +YO +UR +Gl +UR +UR +UR +wn +UR +ty "} (9,1,1) = {" -F -F -P -g -e -r -d -B -F -M -M -M -M -M -M -W -a +ty +UR +UR +UR +UR +ty +ty +ty +UR +UR +UR +Lp +ty +ty +ty +UR +UR +Xl +UR +UR +mV +UR +UR +UR +Sg +XU +UR +Gl +UR +MX +UR +UR +UR +ty "} (10,1,1) = {" -F -F -F -F -B -B -F -F -F -D -D -D -D -D -D -Q -a +ty +UR +Xl +Xl +Xl +Xl +Xl +UR +UR +MX +UR +UR +UR +UR +UR +UR +UR +UR +UR +Gl +Hf +lS +gx +UR +UR +YO +Gl +gr +UR +UR +gr +UR +UR +ty "} (11,1,1) = {" -z -F -F -B -B -B -B -B -c -a -a -a -a -a -R -a -a +ty +UR +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +UR +UR +UR +UR +Gl +Gl +UR +UR +UR +Gl +zC +UR +UR +UR +UR +ZC +Gl +Gl +Mh +UR +Gl +UR +UR +ty +"} +(12,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +UR +UR +Gl +Gl +Gl +UR +UR +UR +UR +Xl +ZJ +xt +Gn +cn +Na +Ku +UR +UR +UR +uZ +Xl +Xl +UR +ty +"} +(13,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +eO +Yl +Sf +Sf +Yl +Yl +Yl +Yl +xt +Gl +Xl +Xl +Ku +Ku +gM +Hm +Ku +sw +Ln +Xl +Xl +Xl +Xl +UR +ty +"} +(14,1,1) = {" +ty +Xl +Gl +UR +UR +UR +UR +UR +eO +Yl +Yl +Yl +Sf +Sf +Sf +Yl +Yl +Ku +xt +Xl +Xl +ZJ +Ku +Lh +Nj +ZJ +TE +Xl +Xl +Xl +Xl +Xl +UR +ty +"} +(15,1,1) = {" +ty +UR +gr +UR +UR +UR +BI +UR +Sf +Sf +Yl +VA +iS +EF +eD +NG +Sf +ZJ +Xl +Xl +Xl +Xl +Ku +DJ +iA +ZJ +mi +Gl +Xl +Xl +Xl +Xl +UR +ty +"} +(16,1,1) = {" +ty +ty +UR +UR +wn +UR +uf +UR +Sf +Yl +sh +bX +Xi +Jq +lJ +WB +Yl +Ku +Ku +ZJ +ZJ +Ku +Ku +mF +Ku +Ku +gn +Xl +Xl +Xl +Xl +Xl +UR +ty +"} +(17,1,1) = {" +ty +ty +ty +UR +UR +UR +UR +UR +Sf +Yl +wG +zL +Ld +nN +Rz +eO +Yl +Ku +oA +PV +pp +SQ +Kl +Im +XO +ZJ +Xl +Xl +Xl +Xl +Xl +UR +UR +ty +"} +(18,1,1) = {" +ty +ty +ty +UR +UR +UR +UR +rI +Yl +Yl +Qp +Ld +tl +Yl +Yl +Sf +xt +Dd +Er +Vg +fb +VP +Rv +tN +Yk +ZJ +Xl +Xl +Xl +UR +UR +UR +UR +ty +"} +(19,1,1) = {" +ty +ty +ty +UR +gr +MX +UR +Hn +Yl +Sf +BH +ZP +Yp +Vn +Tm +zH +QU +NO +bZ +Yd +HR +kS +Yd +qF +Rv +Ku +jh +Gl +Gl +UR +wn +UR +ty +ty +"} +(20,1,1) = {" +ty +ty +UR +UR +UR +MV +UR +UR +Yl +Sf +vV +fK +AV +Yl +Sf +Sf +xt +bc +Zg +Rv +Rv +yj +yj +yu +kq +ZJ +Gl +gr +gr +UR +UR +ty +ty +ty +"} +(21,1,1) = {" +ty +UR +Xl +UR +UR +UR +wn +UR +Sf +Yl +IE +Xi +aF +tA +Ny +eO +Yl +ZJ +uF +yj +XO +Gc +iQ +oY +Gc +Gc +uZ +Xl +Xl +Xl +UR +ty +ty +ty +"} +(22,1,1) = {" +ty +UR +Xl +UR +UR +UR +UR +UR +Sf +Yl +Va +tA +Xi +Qp +Ld +eW +Yl +ZJ +yW +kd +yW +Gc +ph +Mq +Xc +Gc +Xl +Xl +Xl +Xl +UR +UR +ty +ty +"} +(23,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +UR +Yl +Yl +Yl +Rz +mQ +Tf +qy +Rz +Sf +ZJ +no +dC +Zd +Gc +Nx +HJ +Th +iQ +UR +Xl +Xl +pr +UR +UR +UR +ty +"} +(24,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +UR +eO +Yl +Yl +Sf +Sf +Yl +Yl +Sf +Sf +Ku +Kp +Qz +Jy +iQ +xj +aP +wI +Gc +UR +Xl +Xl +Xl +UR +UR +UR +ty +"} +(25,1,1) = {" +ty +Xl +Xl +UR +Xl +Xl +Xl +UR +UR +eO +Yl +Yl +Sf +Sf +Yl +Yl +Yl +Ku +Wa +ig +Rg +iQ +Aa +XC +sR +iQ +UR +dU +UR +UR +mZ +UR +UR +ty +"} +(26,1,1) = {" +ty +Xl +Xl +Xl +Xl +UR +UR +UR +dU +UR +UR +UR +Xl +Xl +Xl +UR +UR +xt +ZJ +Ku +Ku +Gc +Gc +vL +Gc +VE +UR +wn +UR +MX +UR +wn +UR +ty +"} +(27,1,1) = {" +ty +UR +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +UR +Xl +Xl +Xl +UR +wn +UR +UR +UR +Xl +Xl +Xl +Xl +QB +Xl +UR +UR +UR +UR +UR +UR +UR +UR +ty +"} +(28,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Gl +Jw +UR +UR +UR +UR +MX +UR +UR +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +UR +UR +BI +UR +UR +ty +"} +(29,1,1) = {" +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Gl +UR +UR +UR +UR +Gl +Gl +UR +UR +Xl +Xl +Xl +VY +Xl +Xl +UR +UR +gr +Gl +Xl +Xl +Xl +ty +ty +"} +(30,1,1) = {" +ty +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +UR +Xl +UR +iT +UR +UR +oF +UR +UR +Xl +UR +UR +UR +UR +UR +Gl +Jw +Xl +Xl +Xl +ty +ty +"} +(31,1,1) = {" +ty +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +UR +UR +UR +UR +UR +uf +UR +UR +UR +UR +UR +UR +UR +Xl +Xl +Xl +ty +ty +"} +(32,1,1) = {" +ty +ty +ty +ty +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +Xl +UR +UR +Gl +Xl +ty +Xl +UR +wn +UR +gr +Gl +UR +UR +UR +zv +Xl +Xl +ty +ty +ty +"} +(33,1,1) = {" +ty +ty +ty +ty +gr +PB +UR +Gl +Xl +ty +ty +Xl +Xl +UR +UR +UR +ty +ty +ty +ty +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +ty +ty +ty +ty +"} +(34,1,1) = {" +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty +ty "} diff --git a/_maps/map_catalogue.txt b/_maps/map_catalogue.txt index d766b2a849fd..94750d30b542 100644 --- a/_maps/map_catalogue.txt +++ b/_maps/map_catalogue.txt @@ -599,8 +599,8 @@ Find the key for using this catalogue in "map_catalogue_key.txt" Tags "No combat", "Medium loot", "hospitable" File name ="_maps\RandomRuins\wasteruins\wasteplanet_unhonorable.dmm" - Size = (x = 11)(y = 17)(z = 1) - Tags = "No Combat", "Medium Loot", "Shelter", "Hazardous" + Size = (x = 34)(y = 34)(z = 1) + Tags = "Minor Combat Challenge", "Medium Loot", "Shelter", "Hazardous" File name = "_maps\RandomRuins\wasteruins\wasteplanet_abandoned_mechbay Size = (x = 45)(y = 47)(z = 1) diff --git a/code/game/area/areas/ruins/wasteplanet.dm b/code/game/area/areas/ruins/wasteplanet.dm index b4150a9bae38..4b1e69b456d2 100644 --- a/code/game/area/areas/ruins/wasteplanet.dm +++ b/code/game/area/areas/ruins/wasteplanet.dm @@ -29,3 +29,17 @@ /area/ruin/wasteplanet/abandoned_mechbay/engineering name = "Abandoned Mechbay Engineering" icon_state = "engine" + +//Abandoned Waste Site + +/area/ruin/wasteplanet/wasteplanet_radiation/main + name = "Abandoned Waste Site" + icon_state = "green" + +/area/ruin/wasteplanet/wasteplanet_radiation/maint + name = "Abandoned Maintenance Area" + icon_state = "engine" + +/area/ruin/wasteplanet/wasteplanet_radiation/containment + name = "Abandoned Waste Containment Vault" + icon_state = "disposal" From 9384058d6dd53776c7447ca19461b9cc4d1c43c7 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 10 Sep 2023 06:34:10 -0500 Subject: [PATCH 08/57] Automatic changelog generation for PR #2256 [ci skip] --- html/changelogs/AutoChangeLog-pr-2256.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2256.yml diff --git a/html/changelogs/AutoChangeLog-pr-2256.yml b/html/changelogs/AutoChangeLog-pr-2256.yml new file mode 100644 index 000000000000..2fb4d2a215c5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2256.yml @@ -0,0 +1,5 @@ +author: Dethstorm +delete-after: true +changes: + - rscadd: new stuff to wasteplanet_unhonorable + - rscadd: new areas for wasteplanet_unhonorable From 79de19d55010fd61d2e9ed2438b7052feeef56d3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 11 Sep 2023 00:45:29 +0000 Subject: [PATCH 09/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2256.yml | 5 ----- html/changelogs/archive/2023-09.yml | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2256.yml diff --git a/html/changelogs/AutoChangeLog-pr-2256.yml b/html/changelogs/AutoChangeLog-pr-2256.yml deleted file mode 100644 index 2fb4d2a215c5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2256.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Dethstorm -delete-after: true -changes: - - rscadd: new stuff to wasteplanet_unhonorable - - rscadd: new areas for wasteplanet_unhonorable diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index f80cbf64b492..8eb857771e62 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -40,3 +40,7 @@ 2023-09-10: GenericDM: - bugfix: The SolGov surgical cap no longer turns invisible when handled. +2023-09-11: + Dethstorm: + - rscadd: new stuff to wasteplanet_unhonorable + - rscadd: new areas for wasteplanet_unhonorable From e37c686154ff4be32a85eb736c88a2576f03cb10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 12:37:14 -0500 Subject: [PATCH 10/57] Bump gitpython from 3.1.32 to 3.1.34 in /tools (#2338) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.32 to 3.1.34.
Release notes

Sourced from gitpython's releases.

3.1.34 - fix resource leaking

What's Changed

New Contributors

Full Changelog: https://github.com/gitpython-developers/GitPython/compare/3.1.33...3.1.34

v3.1.33 - with security fix

What's Changed

New Contributors

Full Changelog: https://github.com/gitpython-developers/GitPython/compare/3.1.32...3.1.33

Commits
  • 2a2ae77 prepare patch release
  • 4714740 Merge pull request #1639 from skshetry/close-lockfile
  • 3e829eb util: close lockfile after opening successfully
  • f882cd8 update instructions for how to create a release
  • 993f045 prepare for next release
  • a1c472b Merge pull request #1619 from HageMaster3108/bugfix/use-python-builtin-open-m...
  • 70924c4 Skip now permanently failing test with note on how to fix it
  • 8b75434 Merge pull request #1636 from EliahKagan/cve-2023-40590
  • 7611cd9 Don't check form of version number
  • 94e0fb0 Add a unit test for CVE-2023-40590
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gitpython&package-manager=pip&previous-version=3.1.32&new-version=3.1.34)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/shiptest-ss13/Shiptest/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/requirements.txt b/tools/requirements.txt index 782c622eac64..90d6435e470b 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -5,7 +5,7 @@ Pillow==9.3.0 # check_regex.py colorama==0.4.4 PyYaml==6.0 -gitpython==3.1.32 +gitpython==3.1.34 unidiff==0.7.0 # changelogs From 46178d14e526b4404f3a8a08281948121fb6697e Mon Sep 17 00:00:00 2001 From: thgvr <81882910+thgvr@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:37:31 -0700 Subject: [PATCH 11/57] disable ion storms (#2345) ## About The Pull Request title ## Why It's Good For The Game Sucks for players and admins alike ## Changelog :cl: del: ion storms are removed /:cl: --- code/modules/overmap/missions/research_mission.dm | 4 ++-- code/modules/overmap/objects/event_datum.dm | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/overmap/missions/research_mission.dm b/code/modules/overmap/missions/research_mission.dm index c1de1318b5b5..c80686039f8d 100644 --- a/code/modules/overmap/missions/research_mission.dm +++ b/code/modules/overmap/missions/research_mission.dm @@ -56,7 +56,7 @@ if(!over_obj || !scanner.is_operational || scanner_port?.current_ship != servant) return num_current++ - +/* commented out until ion storms aren't literal torture /datum/mission/research/ion name = "Ion storm research mission" desc = "We require data on the behavior of ion storms in the system for an ongoing study. \ @@ -64,7 +64,7 @@ It must be powered to collect the data." value = 3500 objective_type = /datum/overmap/event/emp - +*/ /datum/mission/research/meteor name = "Asteroid field research mission" desc = "We require data on the behavior of asteroid fields in the system for an ongoing study. \ diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm index f63c2ceae82a..bfed840a1acd 100644 --- a/code/modules/overmap/objects/event_datum.dm +++ b/code/modules/overmap/objects/event_datum.dm @@ -90,7 +90,7 @@ /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1 ) - +/* commented out until ion storms aren't literal torture ///ION STORM - explodes your IPCs /datum/overmap/event/emp name = "ion storm (moderate)" @@ -128,7 +128,7 @@ chance_to_affect = 25 chain_rate = 4 strength = 6 - +*/ ///ELECTRICAL STORM - explodes your computer and IPCs /datum/overmap/event/electric name = "electrical storm (moderate)" @@ -338,9 +338,11 @@ GLOBAL_LIST_INIT(overmap_event_pick_list, list( /datum/overmap/event/electric/minor = 45, /datum/overmap/event/electric = 40, /datum/overmap/event/electric/major = 35, + /* commented out until ion storms aren't literal torture /datum/overmap/event/emp/minor = 45, /datum/overmap/event/emp = 40, /datum/overmap/event/emp/major = 45, + */ /datum/overmap/event/meteor/minor = 45, /datum/overmap/event/meteor = 40, /datum/overmap/event/meteor/major = 35, From bea48e56b9572b706d248acf990cc48bebef41b2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 13:13:33 -0500 Subject: [PATCH 12/57] Automatic changelog generation for PR #2345 [ci skip] --- html/changelogs/AutoChangeLog-pr-2345.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2345.yml diff --git a/html/changelogs/AutoChangeLog-pr-2345.yml b/html/changelogs/AutoChangeLog-pr-2345.yml new file mode 100644 index 000000000000..7b097aa9fc47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2345.yml @@ -0,0 +1,4 @@ +author: thgvr +delete-after: true +changes: + - rscdel: ion storms are removed From c4b2ff644d45ae8e85f370c002f1279e170de3ea Mon Sep 17 00:00:00 2001 From: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Wed, 13 Sep 2023 12:38:12 -0500 Subject: [PATCH 13/57] kills soul departed message on unowned bodies (#2349) ## About The Pull Request Alternative message for when a body doesn't have a ckey attached to it ![image](https://github.com/shiptest-ss13/Shiptest/assets/98909416/dafbce97-e469-45ce-97bc-448494f6a4de) ## Why It's Good For The Game 1) Removes soul 2) Direct references to souls are generally frowned upon by the Great State of Lorema, Democratic Nation of Shiptest, Setting Building, and Intellectual Discourse 3) Less confusing to new players (soul departed means absolutely nothing to anyone who hasn't played SS13) ## Changelog :cl: spellcheck: Bodies that lack ownership are no longer described as "soulless" /:cl: --- code/modules/mob/living/carbon/human/examine.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 42dd3f9ba1e3..a260f164829f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,6 +1,7 @@ /mob/living/carbon/human/examine(mob/user) //this is very slightly better than it was because you can use it more places. still can't do \his[src] though. var/t_He = p_they(TRUE) + var/t_he = p_they() var/t_His = p_their(TRUE) var/t_his = p_their() var/t_him = p_them() @@ -126,7 +127,7 @@ . += "[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible." . += "" if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(FALSE, TRUE)) - . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed..." + . += "[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_he] won't be coming back..." else . += "[t_He] [t_is] limp and unresponsive; there are no signs of life..." From 1a12dce11d2f5d23903f6f3765ff9b53ab2dc480 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 13:28:48 -0500 Subject: [PATCH 14/57] Automatic changelog generation for PR #2349 [ci skip] --- html/changelogs/AutoChangeLog-pr-2349.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2349.yml diff --git a/html/changelogs/AutoChangeLog-pr-2349.yml b/html/changelogs/AutoChangeLog-pr-2349.yml new file mode 100644 index 000000000000..5017aab394e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2349.yml @@ -0,0 +1,4 @@ +author: Skrem7 +delete-after: true +changes: + - spellcheck: Bodies that lack ownership are no longer described as "soulless" From 2f56f54cccd129675ccca09f6398632e815bc06e Mon Sep 17 00:00:00 2001 From: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Wed, 13 Sep 2023 12:38:28 -0500 Subject: [PATCH 15/57] MAKES IT SO THE NT PDW-RIFLE HAS A PROPER DESCRIPtION (#2347) ## About The Pull Request spellfix moment ## Why It's Good For The Game clarity in descriptions is good I think :) ## Changelog :cl: spellcheck: typo moment in nt-svg rifle ammo type /:cl: --- code/modules/projectiles/guns/ballistic/assault.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index 6b0d14616ef7..fff17d1b8e07 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -21,7 +21,7 @@ /obj/item/gun/ballistic/automatic/assualt/ak47/nt name = "\improper NT-SVG" - desc = "An even cheaper version of the already-cheap SVG-67, rechambered for the lightweight 4.6x38mm PDW cartridge. The flimsy folding stock and light construction make for a highly portable rifle lacking in accuracy and stopping power." + desc = "An even cheaper version of the already-cheap SVG-67, rechambered for the lightweight 4.6x30mm PDW cartridge. The flimsy folding stock and light construction make for a highly portable rifle lacking in accuracy and stopping power." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/shot.ogg' icon_state = "ak47_nt" From 498e5e701bf2174ae5a86ddcd50d269e2ec87b68 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 13:46:11 -0500 Subject: [PATCH 16/57] Automatic changelog generation for PR #2347 [ci skip] --- html/changelogs/AutoChangeLog-pr-2347.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2347.yml diff --git a/html/changelogs/AutoChangeLog-pr-2347.yml b/html/changelogs/AutoChangeLog-pr-2347.yml new file mode 100644 index 000000000000..9c97f71efd96 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2347.yml @@ -0,0 +1,4 @@ +author: Skrem7 +delete-after: true +changes: + - spellcheck: typo moment in nt-svg rifle ammo type From a61007b421d0007ae710cc2eba2ed8370dfb3121 Mon Sep 17 00:00:00 2001 From: zevo <95449138+Zevotech@users.noreply.github.com> Date: Wed, 13 Sep 2023 13:38:54 -0400 Subject: [PATCH 17/57] Makes the exosuit fabricator able to connect to the RND server via multitool (#2336) # THE LONG AWAITED CHANGE ## About The Pull Request You can now finally connect the exosuit fabricator to the RND server using a multitool, no RND console needed. ![image](https://github.com/shiptest-ss13/Shiptest/assets/95449138/98485444-98c4-4896-b883-2abbfe22beb0) ![image](https://github.com/shiptest-ss13/Shiptest/assets/95449138/ab353cea-cccb-4a36-9288-c086a3aacc5d) ![image](https://github.com/shiptest-ss13/Shiptest/assets/95449138/935aac66-6252-425e-a5dc-f6f148feaed0) ## Why It's Good For The Game Needing an RND console near an exofab was a leftover thing from days long past. This is convenient, standardized with other machines, and much clearer to most players. It even updates automatically instead of needing to press a button to update it! ## Changelog :cl: add: exosuit fabricatiors can now be connected to the RND server via multitool /:cl: --- code/game/mecha/mech_fabricator.dm | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index c547b9385296..160b6a27ab3d 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -12,7 +12,7 @@ var/time_coeff = 1 var/component_coeff = 1 var/datum/techweb/specialized/autounlocking/exofab/stored_research - var/sync = 0 + var/linked_to_server = FALSE //if a server is linked to the exofab var/part_set var/datum/design/being_built var/list/queue = list() @@ -113,11 +113,11 @@ var/output output += "
Mecha Fabricator
" output += "Security protocols: [(obj_flags & EMAGGED)? "Disabled" : "Enabled"]
" + output += "Linked to server: [(linked_to_server == FALSE)? "Unlinked" : "Linked"]
" if (rmat.mat_container) output += "Material Amount: [rmat.format_amount()]" else output += "No material storage connected, please contact the quartermaster." - output += "
Sync with R&D servers
" output += "Main Screen" output += "
" output += "
\ @@ -277,17 +277,6 @@ output += "Process queue | Clear queue" return output -/obj/machinery/mecha_part_fabricator/proc/sync() - for(var/obj/machinery/computer/rdconsole/RDC in oview(7,src)) - RDC.stored_research.copy_research_to(stored_research) - updateUsrDialog() - say("Successfully synchronized with R&D server.") - return - - temp = "Unable to connect to local R&D Database.
Please check your connections and try again.
Return" - updateUsrDialog() - return - /obj/machinery/mecha_part_fabricator/proc/get_resource_cost_w_coeff(datum/design/D, datum/material/resource, roundto = 1) return round(D.materials[resource]*component_coeff, roundto) @@ -412,8 +401,6 @@ if(href_list["clear_queue"]) queue = list() return update_queue_on_page() - if(href_list["sync"]) - sync() if(href_list["part_desc"]) var/T = href_list["part_desc"] for(var/v in stored_research.researched_designs) @@ -471,7 +458,15 @@ if(default_deconstruction_crowbar(W)) return TRUE - return ..() + if(istype(W, /obj/item/multitool)) + var/obj/item/multitool/multi = W + if(multi.buffer && istype(multi.buffer, /obj/machinery/rnd/server) && multi.buffer != src) + var/obj/machinery/rnd/server/server = multi.buffer + stored_research = server.stored_research + visible_message("Linked to [server]!") + linked_to_server = TRUE + else + return ..() /obj/machinery/mecha_part_fabricator/proc/is_insertion_ready(mob/user) From c37d319da37f5858ef184839c2b9c4b7eeed98b9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 14:01:39 -0500 Subject: [PATCH 18/57] Automatic changelog generation for PR #2336 [ci skip] --- html/changelogs/AutoChangeLog-pr-2336.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2336.yml diff --git a/html/changelogs/AutoChangeLog-pr-2336.yml b/html/changelogs/AutoChangeLog-pr-2336.yml new file mode 100644 index 000000000000..352948273c45 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2336.yml @@ -0,0 +1,4 @@ +author: Zevotech +delete-after: true +changes: + - rscadd: exosuit fabricatiors can now be connected to the RND server via multitool From 77ea22e7a0eb5ca4ff6da07ab11e8303706f5ab4 Mon Sep 17 00:00:00 2001 From: BarteG44 <105491762+BarteG44@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:42:42 +0200 Subject: [PATCH 19/57] Adds a voice log to the wideband (#2307) ## About The Pull Request Adds a voice log to the wideband that stores the last 50 messages spoken along with their timestamps to make the wideband more usable without having to be glued to it ![image](https://github.com/shiptest-ss13/Shiptest/assets/105491762/e2897056-4cb2-4530-b6ed-464b7f48157c) ## Why It's Good For The Game it's sure to make ships interact more with each other by taking on a role similar to a chatroom ## Changelog :cl: add: Added a voice log for the wideband /:cl: --------- Signed-off-by: BarteG44 <105491762+BarteG44@users.noreply.github.com> Co-authored-by: Mark Suckerberg --- code/game/machinery/telecomms/broadcasting.dm | 9 +++- .../objects/items/devices/radio/intercom.dm | 1 + .../game/objects/items/devices/radio/radio.dm | 9 ++++ tgui/packages/tgui/interfaces/Radio.js | 43 ++++++++++++++++++- 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index e3e9534a384f..9f2711ebb7a7 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -179,7 +179,14 @@ if(radio.last_chatter_time + 1 SECONDS < world.time && source != radio) playsound(radio, "sound/effects/radio_chatter.ogg", 20, FALSE) radio.last_chatter_time = world.time - //WS edit end + if(radio.log) + var/name = data["name"] + var/list/log_details = list() + log_details["name"] = "[name]▸" + log_details["message"] = "\"[html_decode(message)]\"" + log_details["time"] = station_time_timestamp() + radio.loglist.Insert(1, list(log_details)) + radio.log_trim() // From the list of radios, find all mobs who can hear those. var/list/receive = get_mobs_in_radio_ranges(radios) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 35d8be6efa55..3c35294f8e3f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -167,6 +167,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/radio/intercom, 31) frequency = FREQ_WIDEBAND freqlock = TRUE freerange = TRUE + log = TRUE wallframe = /obj/item/wallframe/intercom/wideband /obj/item/radio/intercom/wideband/Initialize(mapload, ndir, building) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index a46f6e2ea55d..2a5a043656c2 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -34,6 +34,8 @@ var/freqlock = FALSE // Frequency lock to stop the user from untuning specialist radios. var/use_command = FALSE // If true, broadcasts will be large and BOLD. var/command = FALSE // If true, use_command can be toggled at will. + var/log = FALSE // If true, the UI will display the voice log for the frequency + var/list/loglist = list() //the voice log // Encryption key handling var/obj/item/encryptionkey/keyslot @@ -140,6 +142,8 @@ data["useCommand"] = use_command data["subspace"] = subspace_transmission data["subspaceSwitchable"] = subspace_switchable + data["chatlog"] = log + data["chatloglist"] = loglist data["headset"] = FALSE return data @@ -372,6 +376,11 @@ on = TRUE return TRUE +/obj/item/radio/proc/log_trim() + if(loglist.len <= 50) + return + loglist.Cut(51) + /////////////////////////////// //////////Borg Radios////////// /////////////////////////////// diff --git a/tgui/packages/tgui/interfaces/Radio.js b/tgui/packages/tgui/interfaces/Radio.js index 6d3df1ff64fd..1783933bf468 100644 --- a/tgui/packages/tgui/interfaces/Radio.js +++ b/tgui/packages/tgui/interfaces/Radio.js @@ -1,7 +1,15 @@ import { map } from 'common/collections'; import { toFixed } from 'common/math'; import { useBackend } from '../backend'; -import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { + Box, + Button, + LabeledList, + NumberInput, + Section, + Divider, + Table, +} from '../components'; import { RADIO_CHANNELS } from '../constants'; import { Window } from '../layouts'; @@ -18,6 +26,8 @@ export const Radio = (props, context) => { useCommand, subspace, subspaceSwitchable, + chatlog, + chatloglist = [], } = data; const tunedChannel = RADIO_CHANNELS.find( (channel) => channel.freq === frequency @@ -28,15 +38,19 @@ export const Radio = (props, context) => { }))(data.channels); // Calculate window height let height = 106; + let width = 360; if (subspace) { if (channels.length > 0) { height += channels.length * 21 + 6; } else { height += 24; } + } else if (chatlog) { + height += 400; + width += 110; } return ( - +
@@ -127,6 +141,31 @@ export const Radio = (props, context) => { )}
+ {!!chatlog && ( +
+ + + Timestamp + Transcript + + + {chatloglist.map((log) => ( + + {log.time} +
+ {log.name} +
+ {log.message}
+ + ))} + +
+ )}
); From e9a2a5d36b1a9ed6149f29030d96e97e659cd4db Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 14:22:29 -0500 Subject: [PATCH 20/57] Automatic changelog generation for PR #2307 [ci skip] --- html/changelogs/AutoChangeLog-pr-2307.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2307.yml diff --git a/html/changelogs/AutoChangeLog-pr-2307.yml b/html/changelogs/AutoChangeLog-pr-2307.yml new file mode 100644 index 000000000000..9f4bd5f996af --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2307.yml @@ -0,0 +1,4 @@ +author: BarteG44 +delete-after: true +changes: + - rscadd: Added a voice log for the wideband From 87ff54878cacd93f84736536910b3606fabf8097 Mon Sep 17 00:00:00 2001 From: ritorizo <41831966+ritorizo@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:43:16 +0200 Subject: [PATCH 21/57] Make body bag printable in the autolathe (#2285) ## About The Pull Request Body bags are printable for a price of 2 plastic sheet in every autolathe/protolathe. ## Why It's Good For The Game Honestly they are just handy and the design feel basic enough to be available everywere. ## Changelog :cl: add: Body bags in the autolathe. /:cl: Co-authored-by: ritorizo --- code/game/objects/items/bodybag.dm | 1 + code/modules/research/designs/autolathe_designs.dm | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 2013c1e4e77e..faf1f22a651a 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/bodybag.dmi' icon_state = "bodybag_folded" w_class = WEIGHT_CLASS_SMALL + custom_materials = list(/datum/material/plastic = 4000) var/unfoldedbag_path = /obj/structure/closet/body_bag /obj/item/bodybag/attack_self(mob/user) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 5e0947d7e378..f7f471a3d860 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -1175,6 +1175,14 @@ build_path = /obj/item/storage/bag/trash category = list("initial","Tools","Tool Designs","Misc") +/datum/design/bodybag + name="Body Bag" + id="bodybag" + build_type = AUTOLATHE | PROTOLATHE + materials = list(/datum/material/plastic = 4000) + build_path = /obj/item/bodybag + category = list("initial","Medical","Misc") + /datum/design/fishing_rod_basic name = "Fishing Rod" id = "fishing rod" From 049978d34ab70f0328765f359cc755340f4c8de1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 14:38:41 -0500 Subject: [PATCH 22/57] Automatic changelog generation for PR #2285 [ci skip] --- html/changelogs/AutoChangeLog-pr-2285.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2285.yml diff --git a/html/changelogs/AutoChangeLog-pr-2285.yml b/html/changelogs/AutoChangeLog-pr-2285.yml new file mode 100644 index 000000000000..865f6adf63ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2285.yml @@ -0,0 +1,4 @@ +author: ritorizo +delete-after: true +changes: + - rscadd: Body bags in the autolathe. From a693b07dbe7a2617d625459a3728fcacae89a711 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:05:37 -0700 Subject: [PATCH 23/57] Tweaks newer rifle projectiles (#2331) ## About The Pull Request Brings some of the new rifle ammo types since the gun rebalance in line with the edited ones, and finally removes dismemberment from 300 Blackout. - 8mm caseless is now brought in line with .308 and 7.62x54mmR - 300 Magnum does less damage but has the same AP as other rifle cartridges - 300 Blackout loses dismember and gains a little AP (same stats as 7.62x39mm) 300 Magnum is the one I'm least sure about here. It's based on 300 Win-Mag, which is a substantially more powerful cartridge than .308 WIN and similar, so making it just a clone didn't feel right. We might need to nerf the Smile's magazine and/or cycling rate or something to make up for this. ## Why It's Good For The Game consistency within a weapon class is nice ## Changelog :cl: balance: nerfed some outlier rifle cartridges for consistency /:cl: --- .../modules/projectiles/projectile/bullets/rifle.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 8fe2beeae20c..5143e66ef23a 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -5,7 +5,7 @@ damage = 25 armour_penetration = 20 -// 7.62 (Nagant Rifle) +// 7.62x54mmR (Illestren Rifle) /obj/projectile/bullet/a762 name = "7.62x54mmR bullet" @@ -14,8 +14,9 @@ /obj/projectile/bullet/a300 name = ".300 Magnum bullet" - damage = 60 + damage = 40 stamina = 10 + armour_penetration = 40 /obj/projectile/bullet/a762_enchanted name = "enchanted 7.62x54mmR bullet" @@ -34,7 +35,7 @@ /obj/projectile/bullet/aac_300blk name = ".300 Blackout bullet" damage = 30 - dismemberment = 20 + armour_penetration = 20 //7.62x39mm (SVG-67) @@ -50,9 +51,9 @@ damage = 30 armour_penetration = 40 -// 8x58 (SG-whatever) +// 8x58mm caseless (SG-669) /obj/projectile/bullet/a858 name = "8x58mm caseless bullet" - damage = 50 - armour_penetration = 15 + damage = 30 + armour_penetration = 40 From c20b9d4d9b04524f4b6e976d924aca88af2ea2db Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 14:53:49 -0500 Subject: [PATCH 24/57] Automatic changelog generation for PR #2331 [ci skip] --- html/changelogs/AutoChangeLog-pr-2331.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2331.yml diff --git a/html/changelogs/AutoChangeLog-pr-2331.yml b/html/changelogs/AutoChangeLog-pr-2331.yml new file mode 100644 index 000000000000..0d3e82109c2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2331.yml @@ -0,0 +1,4 @@ +author: Apogee-dev +delete-after: true +changes: + - balance: nerfed some outlier rifle cartridges for consistency From 822393b35744a6c5dd29a0bdb6665684122a8071 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:06:10 -0700 Subject: [PATCH 25/57] Disarms sec/command loadouts (#2329) ## About The Pull Request Removes roundstart guns and ammunition as well as stun batons (telebatons and classic batons remain) from spawning loadouts for most normal sec and command. Will probably require some map updates to add now-missing gear. ## Why It's Good For The Game Gives mappers more granular control over gear, requires players to actually hoof it to their ship's armory lockers to gear up, and finally ends the annoyance of having a random 9mm magazine that doesn't go with any guns on your ship. ## Changelog :cl: del: Removed guns and ammo from sec spawn outfits /:cl: --- code/modules/clothing/outfits/solgov.dm | 9 +++------ code/modules/jobs/job_types/captain.dm | 4 ++-- code/modules/jobs/job_types/head_of_security.dm | 6 +++--- code/modules/jobs/job_types/security_officer.dm | 10 +++++++--- code/modules/jobs/job_types/shaft_miner.dm | 4 ---- code/modules/jobs/job_types/warden.dm | 8 ++++---- 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/code/modules/clothing/outfits/solgov.dm b/code/modules/clothing/outfits/solgov.dm index 56addfb34813..da4c6cfff3b3 100644 --- a/code/modules/clothing/outfits/solgov.dm +++ b/code/modules/clothing/outfits/solgov.dm @@ -65,14 +65,12 @@ ears = /obj/item/radio/headset/solgov/alt gloves = /obj/item/clothing/gloves/combat head = /obj/item/clothing/head/solgov/sonnensoldner - r_pocket = /obj/item/gun/ballistic/automatic/pistol/solgov - l_pocket = /obj/item/ammo_box/magazine/pistol556mm + r_pocket = null + l_pocket = null shoes = /obj/item/clothing/shoes/workboots back = /obj/item/storage/backpack box = /obj/item/storage/box/survival - backpack_contents = list(/obj/item/crowbar/power,\ - /obj/item/melee/baton/loaded=1,\ - /obj/item/ammo_box/magazine/pistol556mm=2) + backpack_contents = list(/obj/item/crowbar/power) /datum/outfit/job/solgov/representative name = "Solarian Representative (SolGov)" @@ -153,7 +151,6 @@ backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1,\ - /obj/item/mining_voucher=1,\ /obj/item/stack/marker_beacon/ten=1) backpack = /obj/item/storage/backpack/explorer diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index d9c410d39555..968934302da7 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -192,7 +192,7 @@ satchel = /obj/item/storage/backpack/satchel/ duffelbag = /obj/item/storage/backpack/duffelbag courierbag = /obj/item/storage/backpack/messenger - backpack_contents = list(/obj/item/gun/ballistic/automatic/pistol/commander=1, /obj/item/clothing/accessory/medal/gold/captain=1, /obj/item/spacecash/bundle/c10000=1) + backpack_contents = list(/obj/item/clothing/accessory/medal/gold/captain=1, /obj/item/spacecash/bundle/c10000=1) /datum/outfit/job/captain/inteq name = "IRMG Vanguard (Inteq)" @@ -212,7 +212,7 @@ accessory = null courierbag = /obj/item/storage/backpack/messenger/inteq - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/pda/captain) + backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/pda/captain) /datum/outfit/job/captain/inteq/naked name = "IRMG Vanguard (Inteq) (Naked)" diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c2c91c204fa4..0f786bb29b69 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -40,10 +40,10 @@ gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/HoS glasses = /obj/item/clothing/glasses/hud/security/sunglasses - suit_store = /obj/item/gun/energy/e_gun + suit_store = null r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - backpack_contents = list(/obj/item/melee/baton/loaded=1) + backpack_contents = list(/obj/item/melee/classic_baton=1) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec @@ -71,7 +71,7 @@ head = /obj/item/clothing/head/warden suit = /obj/item/clothing/suit/armor/vest/syndie id = /obj/item/card/id/syndicate_command/crew_id - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/storage/box/survival/syndie=1) + backpack_contents = list(/obj/item/melee/classic_baton=1,/obj/item/storage/box/survival/syndie=1) /datum/outfit/job/hos/nanotrasen name = "Head of Security (Nanotrasen)" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index c0680de24236..e180bde52d18 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S shoes = /obj/item/clothing/shoes/jackboots l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/gun_voucher=1) //WS edit - security rearming + backpack_contents = null //WS edit - security rearming // SHIPTEST EDIT - security re-disarming. certified whitesands moment. backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec @@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S gloves = /obj/item/clothing/gloves/tackler/combat/insulated glasses = /obj/item/clothing/glasses/hud/diagnostic - backpack_contents = list(/obj/item/melee/classic_baton=1, /obj/item/gun/ballistic/automatic/pistol/commander=1, /obj/item/restraints/handcuffs=1) + backpack_contents = list(/obj/item/melee/classic_baton=1, /obj/item/restraints/handcuffs=1) /datum/outfit/job/security/inteq name = "IRMG Enforcer (Inteq)" @@ -192,8 +192,10 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S glasses = /obj/item/clothing/glasses/hud/security/sunglasses/inteq gloves = /obj/item/clothing/gloves/combat + backpack = /obj/item/storage/backpack/messenger/inteq + satchel = /obj/item/storage/backpack/messenger/inteq courierbag = /obj/item/storage/backpack/messenger/inteq - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/gun_voucher=1,/obj/item/pda/security) + backpack_contents = list(/obj/item/pda/security) /datum/outfit/job/security/inteq/beluga name = "IRMG Enforcer (Beluga)" @@ -208,6 +210,8 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S glasses = null gloves = /obj/item/clothing/gloves/color/evening + backpack = /obj/item/storage/backpack/messenger/inteq + satchel = /obj/item/storage/backpack/messenger/inteq courierbag = /obj/item/storage/backpack/messenger/inteq backpack_contents = list(/obj/item/pda/security) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 49bb500f9e00..1f8876091a9f 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -29,7 +29,6 @@ backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1,\ - /obj/item/mining_voucher=1,\ /obj/item/stack/marker_beacon/ten=1) backpack = /obj/item/storage/backpack/explorer @@ -54,7 +53,6 @@ backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1, - /obj/item/mining_voucher=1, /obj/item/mining_scanner=1, /obj/item/stack/marker_beacon/ten=1) belt = /obj/item/gun/energy/kinetic_accelerator @@ -154,7 +152,6 @@ backpack_contents = list( /obj/item/flashlight/seclite=1, /obj/item/kitchen/knife/combat/survival=1, - /obj/item/mining_voucher=1, /obj/item/mining_scanner=1, /obj/item/wrench=1 ) @@ -163,7 +160,6 @@ backpack_contents = list( /obj/item/flashlight/seclite=1, /obj/item/kitchen/knife/combat/survival=1, - /obj/item/mining_voucher=1, /obj/item/stack/marker_beacon/ten=1, /obj/item/borg/upgrade/modkit/aoe=1 ) diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 6d56e869c09d..d3daa2c112bf 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -38,8 +38,8 @@ glasses = /obj/item/clothing/glasses/hud/security/sunglasses r_pocket = /obj/item/assembly/flash/handheld l_pocket = /obj/item/restraints/handcuffs - suit_store = /obj/item/gun/energy/e_gun/advtaser //WS edit - Readds tasers - backpack_contents = list(/obj/item/melee/baton/loaded=1, /obj/item/ammo_box/magazine/co9mm=1) //WS edit - free lethals + suit_store = null //WS edit - Readds tasers //SHIPTEST EDIT - removes tasers + backpack_contents = list(/obj/item/melee/classic_baton) //WS edit - free lethals // SHIPTEST EDIT - nope backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec @@ -97,10 +97,10 @@ dcoat = /obj/item/clothing/suit/hooded/wintercoat/security/inteq shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat - suit_store = /obj/item/gun/energy/disabler + suit_store = null courierbag = /obj/item/storage/backpack/messenger/inteq - backpack_contents = list(/obj/item/melee/classic_baton/telescopic=1, /obj/item/ammo_box/magazine/co9mm=1, /obj/item/pda/warden) + backpack_contents = list(/obj/item/melee/classic_baton=1, /obj/item/pda/warden) /datum/outfit/job/warden/nanotrasen name = "Warden (Nanotrasen)" From 112231025eba263f25b9b9896d59e162500e6694 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 15:13:01 -0500 Subject: [PATCH 26/57] Automatic changelog generation for PR #2329 [ci skip] --- html/changelogs/AutoChangeLog-pr-2329.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2329.yml diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml new file mode 100644 index 000000000000..197aa431dbc3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2329.yml @@ -0,0 +1,4 @@ +author: Apogee-dev +delete-after: true +changes: + - rscdel: Removed guns and ammo from sec spawn outfits From 3fb867c945bca43073b58ac11592a92e8d23db03 Mon Sep 17 00:00:00 2001 From: meemofcourse <75212565+meemofcourse@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:07:27 -0300 Subject: [PATCH 27/57] The CentCom-ening: Shiptest Edition (#2321) ## About The Pull Request ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/9a51d6b2-04cc-4a6b-ad22-602b57f07a22) Ports the following pull requests: * https://github.com/tgstation/tgstation/pull/57023 * https://github.com/tgstation/tgstation/pull/60414 * https://github.com/tgstation/tgstation/pull/63029 * https://github.com/tgstation/tgstation/pull/65794 * https://github.com/tgstation/tgstation/pull/70226 This takes out the wintercoats out of misc.dm into their own file, and adds a CentCom Wardrobe into the CentCom map. ## Why It's Good For The Game Adminbus. Some minor clean up is always appreciated. ## Changelog :cl: PositiveEntropy, tf-4 add: Adds the CentVend inside Central Command! You're now able to vend Central Command clothing items for all your commanding needs! add: Nanotrasen has added a new outfit for Special Ops Officers to enjoy, instead of a simple leather jacket: The CentCom Officer's Coat! add: Re-adds the CentCom Official's suit, making it the default clothing option for CentCom Officials! The turtlenecks have instead been made to be the standard ERT uniform. imageadd: Thanks to a collaboration between the frontier sector and the core sector, the parade jackets now boast new and varied apperances for all to enjoy, with a new parade jacket releasing for the Head of Security! imageadd: In no short effort than the finest of tailors, the captain's hat, the centcom hat, the captain's jumpsuit and the captain's carapace now have finer gold trims and the finest quality leather available, making them more vibrant for all! expansion: To utilize the new variants, simply alt-click a parade jacket, or a centcom commander coat. You can also obtain a Head of Security parade jacket by simply accessing the Head of Security's closet! imageadd: In no short effort of our best tailors, every Central Command outfit have been either redesigned or reshaded! All of them! /:cl: --- _maps/deprecated/Ruins/oldAIsat.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 3 +- code/controllers/subsystem/traumas.dm | 4 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- code/modules/awaymissions/corpse.dm | 2 +- code/modules/clothing/head/berets.dm | 17 ++ code/modules/clothing/head/misc.dm | 13 +- code/modules/clothing/masks/gasmask.dm | 8 + code/modules/clothing/outfits/ert.dm | 4 +- code/modules/clothing/outfits/standard.dm | 2 +- .../clothing/spacesuits/miscellaneous.dm | 15 +- code/modules/clothing/suits/armor.dm | 13 ++ code/modules/clothing/suits/miscellaneous.dm | 169 ---------------- code/modules/clothing/suits/wintercoats.dm | 187 ++++++++++++++++++ code/modules/clothing/under/jobs/centcom.dm | 48 ++++- code/modules/vending/clothesmate.dm | 4 +- code/modules/vending/wardrobes.dm | 30 +++ icons/mob/clothing/head.dmi | Bin 273785 -> 275022 bytes icons/mob/clothing/mask.dmi | Bin 55983 -> 56799 bytes icons/mob/clothing/suits/armor.dmi | Bin 89504 -> 90592 bytes icons/mob/clothing/suits/hooded.dmi | Bin 86730 -> 85528 bytes icons/mob/clothing/suits/toggle.dmi | Bin 39981 -> 42973 bytes icons/mob/clothing/under/centcom.dmi | Bin 5869 -> 10016 bytes icons/obj/clothing/hats.dmi | Bin 137793 -> 137306 bytes icons/obj/clothing/masks.dmi | Bin 40810 -> 41314 bytes icons/obj/clothing/suits/armor.dmi | Bin 33916 -> 34437 bytes icons/obj/clothing/suits/hooded.dmi | Bin 27822 -> 28606 bytes icons/obj/clothing/suits/toggle.dmi | Bin 14854 -> 16003 bytes icons/obj/clothing/under/centcom.dmi | Bin 939 -> 2948 bytes icons/obj/vending.dmi | Bin 140888 -> 142314 bytes shiptest.dme | 1 + 31 files changed, 325 insertions(+), 199 deletions(-) create mode 100644 code/modules/clothing/suits/wintercoats.dm diff --git a/_maps/deprecated/Ruins/oldAIsat.dmm b/_maps/deprecated/Ruins/oldAIsat.dmm index 622873e4f7ae..ea8e4ad1d1e0 100644 --- a/_maps/deprecated/Ruins/oldAIsat.dmm +++ b/_maps/deprecated/Ruins/oldAIsat.dmm @@ -564,7 +564,7 @@ "bU" = ( /obj/effect/decal/cleanable/blood, /obj/structure/chair, -/obj/item/clothing/under/rank/centcom/officer, +/obj/item/clothing/under/rank/centcom/official, /obj/item/restraints/handcuffs, /obj/effect/decal/remains/human, /turf/open/floor/plating/airless, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 24f28ce738c6..722fdcb4f209 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -9186,8 +9186,6 @@ /turf/open/floor/plasteel/dark, /area/ctf) "hYc" = ( -/obj/structure/destructible/cult/tome, -/obj/item/book/codex_gigas, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -9199,6 +9197,7 @@ /obj/effect/turf_decal/corner/transparent/neutral{ dir = 8 }, +/obj/machinery/vending/wardrobe/cent_wardrobe, /turf/open/floor/plasteel/dark, /area/centcom/ferry) "hZs" = ( diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 87628785caf0..ab220b4382b4 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -96,7 +96,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/under/rank/security/head_of_security/parade/female, //WS Edit - Better Command Uniforms /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor, /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, - /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer, + /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/official, /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, /obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med, /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, @@ -119,7 +119,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/under/rank/command/captain, /obj/item/clothing/under/rank/command/head_of_personnel, /obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/rnd/research_director, /obj/item/clothing/under/rank/medical/chief_medical_officer, /obj/item/clothing/under/rank/engineering/chief_engineer, - /obj/item/clothing/under/rank/centcom/officer, /obj/item/clothing/under/rank/centcom/commander, + /obj/item/clothing/under/rank/centcom/official, /obj/item/clothing/under/rank/centcom/commander, /obj/item/melee/classic_baton/telescopic, /obj/item/card/id/silver, /obj/item/card/id/gold, /obj/item/card/id/captains_spare, /obj/item/card/id/centcom, /obj/machinery/door/airlock/command)), diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index b02a516dc13b..6b3658b523df 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -534,7 +534,7 @@ new /obj/item/book/granter/spell/mimery_guns(src) /obj/item/storage/box/syndie_kit/centcom_costume/PopulateContents() - new /obj/item/clothing/under/rank/centcom/officer(src) + new /obj/item/clothing/under/rank/centcom/official(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/gloves/color/black(src) new /obj/item/radio/headset/headset_cent/empty(src) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 4c4fac2717e5..0caf1d7c4e3d 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -486,7 +486,7 @@ /datum/outfit/nanotrasenbridgeofficercorpse name = "Bridge Officer Corpse" ears = /obj/item/radio/headset/heads/head_of_personnel - uniform = /obj/item/clothing/under/rank/centcom/officer + uniform = /obj/item/clothing/under/rank/centcom/official suit = /obj/item/clothing/suit/armor/vest/bulletproof shoes = /obj/item/clothing/shoes/sneakers/black glasses = /obj/item/clothing/glasses/sunglasses diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm index 0e0d04b40f07..2c6139e54169 100644 --- a/code/modules/clothing/head/berets.dm +++ b/code/modules/clothing/head/berets.dm @@ -190,6 +190,8 @@ icon_state = "beret_com" armor = list("melee" = 40, "bullet" = 20, "laser" = 10, "energy" = 10, "rad" = 10, "bio" = 5, "rad" = 5, "fire" = 5, "rad" = 30) +// SolGov + /obj/item/clothing/head/beret/solgov name = "\improper SolGov beret" desc = "A beret with SolGov's emblem emblazoned on it. Colored in SolGov blue." @@ -215,6 +217,8 @@ icon_state = "beret_terragovplain" item_state = "beret_terragovplain" +// Inteq + /obj/item/clothing/head/beret/sec/inteq name = "inteq beret" desc = "A comfortable looking brown beret with a badge of the golden shield of the IRMG. Denotes the wearer as part of the IRMG." @@ -234,6 +238,8 @@ item_state = "inteq_honorable_beret" armor = list("melee" = 40, "bullet" = 50, "laser" = 50, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 90) +// Frontier + /obj/item/clothing/head/beret/sec/frontier name = "\improper Frontiersmen beret" desc = "A scratchy olive green beret, worn by Frontiersmen who want to look good while intimidating freighter crew." @@ -243,3 +249,14 @@ name = "\improper Frontiersmen officer beret" desc = "A scratchy olive green beret emblazoned with the Frontiersmen insignia, worn by Frontiersmen who want to look good while intimidating freighter captains." icon_state = "frontier_officer_beret" + + +// CentCom + +/obj/item/clothing/head/beret/centcom_formal + name = "\improper CentCom Formal Beret" + desc = "Sometimes, a compromise between fashion and defense needs to be made. Thanks to Nanotrasen's most recent nano-fabric durability enhancements, this time, it's not the case." + icon_state = "beret_badge" + greyscale_colors = "#46b946#f2c42e" + armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "fire" = 100, "acid" = 90) + strip_delay = 10 SECONDS diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 0ac57271c0b0..9f0a56d1d476 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -8,6 +8,15 @@ armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) strip_delay = 80 +/obj/item/clothing/head/centcom_cap + name = "\improper CentCom commander cap" + icon_state = "centcom_cap" + desc = "Worn by the finest of CentCom commanders. Inside the lining of the cap, lies two faint initials." + item_state = "that" + flags_inv = 0 + armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + strip_delay = (8 SECONDS) + /obj/item/clothing/head/spacepolice name = "space police cap" desc = "A blue cap for patrolling the daily beat." @@ -364,7 +373,7 @@ /obj/item/clothing/head/frenchberet name = "french beret" - desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason." + desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage in military conflict, for some reason." icon_state = "beret" dynamic_hair_suffix = "" @@ -444,7 +453,7 @@ /obj/item/clothing/head/coordinator name = "coordinator cap" - desc = "A cap for a party ooordinator, stylish!." + desc = "A cap for a party coordinator, stylish!." icon_state = "capcap" item_state = "that" armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index b3d57ad61aaf..467377f722dd 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -29,6 +29,14 @@ item_state = "gas_cap" resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/clothing/mask/gas/atmos/centcom + name = "\improper CentCom gas mask" + desc = "Oooh, gold and green. Fancy! This should help as you sit in your office." + icon = 'icons/obj/clothing/masks.dmi' + icon_state = "gas_centcom" + item_state = "gas_centcom" + resistance_flags = FIRE_PROOF | ACID_PROOF + // **** Welding gas mask **** /obj/item/clothing/mask/gas/welding diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 444a38deae55..e3f90d1070b5 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -2,7 +2,7 @@ name = "ERT Common" mask = /obj/item/clothing/mask/gas/sechailer - uniform = /obj/item/clothing/under/rank/centcom/officer + uniform = /obj/item/clothing/under/rank/centcom/official shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt @@ -160,7 +160,7 @@ /datum/outfit/centcom/centcom_official name = "CentCom Official" - uniform = /obj/item/clothing/under/rank/centcom/officer + uniform = /obj/item/clothing/under/rank/centcom/official shoes = /obj/item/clothing/shoes/sneakers/black gloves = /obj/item/clothing/gloves/color/black ears = /obj/item/radio/headset/headset_cent diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 6fdeb20b53e1..c339816c7e68 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -201,7 +201,7 @@ ears = /obj/item/radio/headset/headset_cent/commander glasses = /obj/item/clothing/glasses/eyepatch mask = /obj/item/clothing/mask/cigarette/cigar/cohiba - head = /obj/item/clothing/head/centhat + head = /obj/item/clothing/head/centcom_cap belt = /obj/item/gun/ballistic/revolver/mateba r_pocket = /obj/item/lighter l_pocket = /obj/item/ammo_box/a357 diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index e70ce5a1d6a9..8a74e555469a 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -56,9 +56,10 @@ Contains: resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/helmet/space/beret - name = "officer's beret" + name = "CentCom officer's beret" desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space." icon_state = "beret_badge" + greyscale_colors = "#397F3F#FFCE5B" dynamic_hair_suffix = "+generic" dynamic_fhair_suffix = "+generic" flags_inv = 0 @@ -68,12 +69,12 @@ Contains: resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/suit/space/officer - name = "officer's jacket" - desc = "An armored, space-proof jacket used in special operations." - icon = 'icons/obj/clothing/suits.dmi' - mob_overlay_icon = 'icons/mob/clothing/suit.dmi' - icon_state = "detective" - item_state = "det_suit" + name = "CentCom officer's coat" + desc = "An armored, space-proof coat used in special operations." + icon = 'icons/obj/clothing/suits/armor.dmi' + mob_overlay_icon = 'icons/mob/clothing/suits/armor.dmi' + icon_state = "centcom_coat" + item_state = "centcom" blood_overlay_type = "coat" slowdown = 0 flags_inv = 0 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 4692811baecf..23b489b6a3c3 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -512,3 +512,16 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS heat_protection = CHEST|GROIN|ARMS + +/obj/item/clothing/suit/toggle/armor/vest/centcom_formal + name = "\improper CentCom formal coat" + desc = "A stylish coat given to CentCom Commanders. Perfect for sending ERTs to suicide missions with style!" + icon_state = "centcom_formal" + item_state = "centcom" + body_parts_covered = CHEST|GROIN|ARMS + armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) + togglename = "buttons" + +/obj/item/clothing/suit/toggle/armor/vest/centcom_formal/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index f5fb5a1ea4d7..1a020e40623c 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -554,175 +554,6 @@ item_state = "cheongsam_blue" body_parts_covered = CHEST|GROIN|ARMS|LEGS -// WINTER COATS - -/obj/item/clothing/suit/hooded/wintercoat - name = "winter coat" - desc = "A heavy jacket made from 'synthetic' animal furs." - icon_state = "coatwinter" - item_state = "coatwinter" - body_parts_covered = CHEST|GROIN|ARMS - cold_protection = CHEST|GROIN|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - -/obj/item/clothing/head/hooded/winterhood - name = "winter hood" - desc = "A hood attached to a heavy winter jacket." - icon_state = "winterhood" - body_parts_covered = HEAD - cold_protection = HEAD - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - flags_inv = HIDEHAIR|HIDEEARS - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) - -/obj/item/clothing/suit/hooded/wintercoat/captain - name = "captain's winter coat" - icon_state = "coatcaptain" - item_state = "coatcaptain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) - hoodtype = /obj/item/clothing/head/hooded/winterhood/captain - -/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() - . = ..() - allowed = GLOB.security_wintercoat_allowed - -/obj/item/clothing/head/hooded/winterhood/captain - icon_state = "winterhood_captain" - armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) - -/obj/item/clothing/suit/hooded/wintercoat/security - name = "security winter coat" - icon_state = "coatsecurity" - item_state = "coatsecurity" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) - hoodtype = /obj/item/clothing/head/hooded/winterhood/security - -/obj/item/clothing/suit/hooded/wintercoat/security/Initialize() - . = ..() - allowed = GLOB.security_wintercoat_allowed - -/obj/item/clothing/head/hooded/winterhood/security - icon_state = "winterhood_security" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) - -/obj/item/clothing/suit/hooded/wintercoat/medical - name = "medical winter coat" - icon_state = "coatmedical" - item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) - hoodtype = /obj/item/clothing/head/hooded/winterhood/medical - -/obj/item/clothing/head/hooded/winterhood/medical - icon_state = "winterhood_medical" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) - -/obj/item/clothing/suit/hooded/wintercoat/medical/paramedic - name = "paramedic winter coat" - icon_state = "coatparamedic" - item_state = "coatparamedic" - hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/paramedic - -/obj/item/clothing/head/hooded/winterhood/medical/paramedic - icon_state = "winterhood_paramedic" - -/obj/item/clothing/suit/hooded/wintercoat/science - name = "science winter coat" - icon_state = "coatscience" - item_state = "coatscience" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - hoodtype = /obj/item/clothing/head/hooded/winterhood/science - -/obj/item/clothing/head/hooded/winterhood/science - icon_state = "winterhood_science" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - -/obj/item/clothing/suit/hooded/wintercoat/engineering - name = "engineering winter coat" - icon_state = "coatengineer" - item_state = "coatengineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering - -/obj/item/clothing/head/hooded/winterhood/engineering - icon_state = "winterhood_engineer" - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) - -/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos - name = "atmospherics winter coat" - icon_state = "coatatmos" - item_state = "coatatmos" - hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos - -/obj/item/clothing/head/hooded/winterhood/engineering/atmos - icon_state = "winterhood_atmos" - -/obj/item/clothing/suit/hooded/wintercoat/hydro - name = "hydroponics winter coat" - icon_state = "coathydro" - item_state = "coathydro" - allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro - -/obj/item/clothing/head/hooded/winterhood/hydro - icon_state = "winterhood_hydro" - -/obj/item/clothing/suit/hooded/wintercoat/cargo - name = "cargo winter coat" - icon_state = "coatcargo" - item_state = "coatcargo" - hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo - -/obj/item/clothing/head/hooded/winterhood/cargo - icon_state = "winterhood_cargo" - -/obj/item/clothing/suit/hooded/wintercoat/miner - name = "mining winter coat" - icon_state = "coatminer" - item_state = "coatminer" - allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - hoodtype = /obj/item/clothing/head/hooded/winterhood/miner - -/obj/item/clothing/head/hooded/winterhood/miner - icon_state = "winterhood_miner" - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) - -/obj/item/clothing/suit/hooded/wintercoat/security/inteq - name = "inteq winter coat" - desc = "An armored wintercoat in the colors of the IRMG, the zipper tab is the golden shield of the IRMG." - icon_state = "coatinteq" - item_state = "coatinteq" - hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq - supports_variations = KEPORI_VARIATION - -/obj/item/clothing/head/hooded/winterhood/security/inteq - icon_state = "winterhood_inteq" - supports_variations = KEPORI_VARIATION - -/obj/item/clothing/suit/hooded/coat/inteq - name = "inteq hooded coat" - desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder." - icon_state = "hoodieinteq" - item_state = "hoodieinteq" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) - hoodtype = /obj/item/clothing/head/hooded/coat/inteq - -/obj/item/clothing/head/hooded/coat/inteq - name = "inteq hood" - desc = "A comfortable looking brown hood." - icon_state = "hoodinteq" - item_state = "hoodinteq" - armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) - -/obj/item/clothing/suit/hooded/coat/inteq/Initialize() - . = ..() - allowed = GLOB.security_wintercoat_allowed - /obj/item/clothing/head/hooded/ablative name = "ablative hood" desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a visor for cool-o-vision." diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm new file mode 100644 index 000000000000..684e4d46add9 --- /dev/null +++ b/code/modules/clothing/suits/wintercoats.dm @@ -0,0 +1,187 @@ +// WINTER COATS + +/obj/item/clothing/suit/hooded/wintercoat + name = "winter coat" + desc = "A heavy jacket made from 'synthetic' animal furs." + icon_state = "coatwinter" + item_state = "coatwinter" + body_parts_covered = CHEST|GROIN|ARMS + cold_protection = CHEST|GROIN|ARMS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + +/obj/item/clothing/head/hooded/winterhood + name = "winter hood" + desc = "A hood attached to a heavy winter jacket." + icon_state = "winterhood" + body_parts_covered = HEAD + cold_protection = HEAD + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + flags_inv = HIDEHAIR|HIDEEARS + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/clothing/suit/hooded/wintercoat/captain + name = "captain's winter coat" + icon_state = "coatcaptain" + item_state = "coatcaptain" + armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + hoodtype = /obj/item/clothing/head/hooded/winterhood/captain + +/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/captain + icon_state = "winterhood_captain" + armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + +/obj/item/clothing/suit/hooded/wintercoat/security + name = "security winter coat" + icon_state = "coatsecurity" + item_state = "coatsecurity" + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + hoodtype = /obj/item/clothing/head/hooded/winterhood/security + +/obj/item/clothing/suit/hooded/wintercoat/security/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/security + icon_state = "winterhood_security" + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + +/obj/item/clothing/suit/hooded/wintercoat/medical + name = "medical winter coat" + icon_state = "coatmedical" + item_state = "coatmedical" + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + hoodtype = /obj/item/clothing/head/hooded/winterhood/medical + +/obj/item/clothing/head/hooded/winterhood/medical + icon_state = "winterhood_medical" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) + +/obj/item/clothing/suit/hooded/wintercoat/medical/paramedic + name = "paramedic winter coat" + icon_state = "coatparamedic" + item_state = "coatparamedic" + hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/paramedic + +/obj/item/clothing/head/hooded/winterhood/medical/paramedic + icon_state = "winterhood_paramedic" + +/obj/item/clothing/suit/hooded/wintercoat/science + name = "science winter coat" + icon_state = "coatscience" + item_state = "coatscience" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/science + +/obj/item/clothing/head/hooded/winterhood/science + icon_state = "winterhood_science" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + +/obj/item/clothing/suit/hooded/wintercoat/engineering + name = "engineering winter coat" + icon_state = "coatengineer" + item_state = "coatengineer" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering + +/obj/item/clothing/head/hooded/winterhood/engineering + icon_state = "winterhood_engineer" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) + +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos + name = "atmospherics winter coat" + icon_state = "coatatmos" + item_state = "coatatmos" + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos + +/obj/item/clothing/head/hooded/winterhood/engineering/atmos + icon_state = "winterhood_atmos" + +/obj/item/clothing/suit/hooded/wintercoat/hydro + name = "hydroponics winter coat" + icon_state = "coathydro" + item_state = "coathydro" + allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro + +/obj/item/clothing/head/hooded/winterhood/hydro + icon_state = "winterhood_hydro" + +/obj/item/clothing/suit/hooded/wintercoat/cargo + name = "cargo winter coat" + icon_state = "coatcargo" + item_state = "coatcargo" + hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo + +/obj/item/clothing/head/hooded/winterhood/cargo + icon_state = "winterhood_cargo" + +/obj/item/clothing/suit/hooded/wintercoat/miner + name = "mining winter coat" + icon_state = "coatminer" + item_state = "coatminer" + allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + hoodtype = /obj/item/clothing/head/hooded/winterhood/miner + +/obj/item/clothing/head/hooded/winterhood/miner + icon_state = "winterhood_miner" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + +// Inteq + +/obj/item/clothing/suit/hooded/wintercoat/security/inteq + name = "inteq winter coat" + desc = "An armored wintercoat in the colors of the IRMG, the zipper tab is the golden shield of the IRMG." + icon_state = "coatinteq" + item_state = "coatinteq" + hoodtype = /obj/item/clothing/head/hooded/winterhood/security/inteq + supports_variations = KEPORI_VARIATION + +/obj/item/clothing/head/hooded/winterhood/security/inteq + icon_state = "winterhood_inteq" + supports_variations = KEPORI_VARIATION + +/obj/item/clothing/suit/hooded/coat/inteq + name = "inteq hooded coat" + desc = "A hooded coat with a fur trim around the hood, comfy! It has a small 'IRMG' embroidered onto the shoulder." + icon_state = "hoodieinteq" + item_state = "hoodieinteq" + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + hoodtype = /obj/item/clothing/head/hooded/coat/inteq + +/obj/item/clothing/head/hooded/coat/inteq + name = "inteq hood" + desc = "A comfortable looking brown hood." + icon_state = "hoodinteq" + item_state = "hoodinteq" + armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) + +/obj/item/clothing/suit/hooded/coat/inteq/Initialize() + . = ..() + allowed = GLOB.security_wintercoat_allowed + +// CentCom +/obj/item/clothing/suit/hooded/wintercoat/centcom + name = "centcom winter coat" + desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper." + icon_state = "coatcentcom" + item_state = "coatcentcom" + armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) + hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom + +/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload) + . = ..() + allowed += GLOB.security_wintercoat_allowed + +/obj/item/clothing/head/hooded/winterhood/centcom + icon_state = "winterhood_centcom" + armor = list("melee" = 35, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 35, "bio" = 10, "rad" = 10, "fire" = 10, "acid" = 60) diff --git a/code/modules/clothing/under/jobs/centcom.dm b/code/modules/clothing/under/jobs/centcom.dm index 992f8eb02653..d862b53eca2e 100644 --- a/code/modules/clothing/under/jobs/centcom.dm +++ b/code/modules/clothing/under/jobs/centcom.dm @@ -2,23 +2,51 @@ icon = 'icons/obj/clothing/under/centcom.dmi' mob_overlay_icon = 'icons/mob/clothing/under/centcom.dmi' -/obj/item/clothing/under/rank/centcom/officer - name = "\improper CentCom officer's jumpsuit" - desc = "It's a jumpsuit worn by CentCom Officers." - icon_state = "officer" - item_state = "g_suit" - alt_covers_chest = TRUE - /obj/item/clothing/under/rank/centcom/commander - name = "\improper CentCom officer's jumpsuit" - desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders." + name = "\improper CentCom commander's suit" + desc = "It's a suit worn by CentCom's highest-tier Commanders." icon_state = "centcom" item_state = "dg_suit" +/obj/item/clothing/under/rank/centcom/official + name = "\improper CentCom official's suit" + desc = "A suit worn by CentCom Officials, with a silver belt buckle to indicate their rank from a glance." + icon_state = "official" + item_state = "dg_suit" + /obj/item/clothing/under/rank/centcom/intern name = "\improper CentCom intern's jumpsuit" desc = "It's a jumpsuit worn by those interning for CentCom. The top is styled after a polo shirt for easy identification." icon_state = "intern" - item_state = "g_suit" + item_state = "dg_suit" can_adjust = FALSE +/obj/item/clothing/under/rank/centcom/officer + name = "\improper CentCom turtleneck suit" + desc = "A casual, yet refined green turtleneck, used by CentCom Officers. It has a fragrance of aloe." + icon_state = "officer" + item_state = "dg_suit" + alt_covers_chest = TRUE + +/obj/item/clothing/under/rank/centcom/officer/replica + name = "\improper CentCom turtleneck replica" + desc = "A cheap copy of the CentCom turtleneck! A Donk Co. logo can be seen on the collar." + +/obj/item/clothing/under/rank/centcom/officer_skirt + name = "\improper CentCom turtleneck skirt" + desc = "A skirt version of the CentCom turtleneck, rarer and more sought after than the original." + icon_state = "officer_skirt" + item_state = "dg_suit" + alt_covers_chest = TRUE + body_parts_covered = CHEST|GROIN|ARMS + +/obj/item/clothing/under/rank/centcom/officer_skirt/replica + name = "\improper CentCom turtleneck skirt replica" + desc = "A cheap copy of the CentCom turtleneck skirt! A Donk Co. logo can be seen on the collar." + +/obj/item/clothing/under/rank/centcom/centcom_skirt + name = "\improper CentCom commander's suitskirt" + desc = "It's a suitskirt worn by CentCom's highest-tier Commanders." + icon_state = "centcom_skirt" + item_state = "dg_suit" + body_parts_covered = CHEST|GROIN|ARMS diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 17a6ec2da484..13598f2bc13a 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -116,7 +116,9 @@ /obj/item/clothing/suit/jacket/letterman_syndie = 1, /obj/item/clothing/under/costume/jabroni = 1, /obj/item/clothing/suit/vapeshirt = 1, - /obj/item/clothing/under/costume/geisha = 1) + /obj/item/clothing/under/costume/geisha = 1, + /obj/item/clothing/under/rank/centcom/officer/replica = 1, + /obj/item/clothing/under/rank/centcom/officer_skirt/replica = 1) premium = list( /obj/item/clothing/under/suit/checkered = 1, /obj/item/clothing/suit/jacket/leather = 1, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 42ecc4ce697e..a774f048f443 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -512,3 +512,33 @@ /obj/item/vending_refill/wardrobe/det_wardrobe machine_name = "DetDrobe" + + +/obj/machinery/vending/wardrobe/cent_wardrobe + name = "\improper CentDrobe" + desc = "A one-of-a-kind vending machine for all your centcom aesthetic needs!" + icon_state = "centdrobe" + product_ads = "Show those ERTs who's the most stylish in the briefing room!" + vend_reply = "Thank you for using the CentDrobe!" + products = list( + /obj/item/clothing/shoes/laceup = 3, + /obj/item/clothing/shoes/jackboots = 3, + /obj/item/clothing/gloves/combat = 3, + /obj/item/clothing/glasses/sunglasses = 3, + /obj/item/clothing/under/rank/centcom/commander = 3, + /obj/item/clothing/under/rank/centcom/centcom_skirt = 3, + /obj/item/clothing/under/rank/centcom/intern = 3, + /obj/item/clothing/under/rank/centcom/official = 3, + /obj/item/clothing/under/rank/centcom/officer = 3, + /obj/item/clothing/under/rank/centcom/officer_skirt = 3, + /obj/item/clothing/suit/toggle/armor/vest/centcom_formal = 3, + /obj/item/clothing/suit/space/officer = 3, + /obj/item/clothing/suit/hooded/wintercoat/centcom = 3, + /obj/item/clothing/head/centcom_cap = 3, + /obj/item/clothing/head/centhat = 3, + /obj/item/clothing/head/intern = 3, + ) + refill_canister = /obj/item/vending_refill/wardrobe/cent_wardrobe +/obj/item/vending_refill/wardrobe/cent_wardrobe + machine_name = "CentDrobe" + light_color = LIGHT_COLOR_ELECTRIC_GREEN diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index e4344a57d42f8505c9e0d7925daf066d47cbe148..9ba2f5b219db15babfa4468fc7fd2c028358ae6c 100644 GIT binary patch literal 275022 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 literal 273785 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

7wgo==r@NHBTK3uL108?eL4 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

n(6tl<-M;PeOItCOsP5l$I~!Bm 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

AUO+ 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 P=;x8rGsR*BBme&f_St@S diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 6345f8e95b7abf306677f92c56e4eb9374a91ab3..90a54af8fa9e7bb297c7f72a87ac657f971fbb1d 100644 GIT binary patch delta 3027 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 VlXeNa+9d!0002ovPDHLkV1m&jBcT8Q delta 2440 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 delta 6435 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 C*PGG+ diff --git a/icons/mob/clothing/suits/hooded.dmi b/icons/mob/clothing/suits/hooded.dmi index 18ae544a659dc8e163647a37271e737290fe940b..73e95617cd94b933eeec68a8e60525764091d728 100644 GIT binary patch literal 85528 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 diff --git a/icons/mob/clothing/suits/toggle.dmi b/icons/mob/clothing/suits/toggle.dmi index 73b6b92d0a81209cd05916323b95891daa9439e5..2059afd5bf46e7fb0e9539ebb565fb88419234f2 100644 GIT binary patch delta 19405 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 delta 16389 zcmbWe1yohvw=aHZL`qR9DHV}Mk(N%SM7ojgP(s1OrX(a40g;sME0_$NHgn567w;5up~ea9+5FBO z)$o(uY@MPVBOm=+g@_)+t6j9mpC((8@LR~nFk2s;uMG_oa7^4jSJoHWG%aS;zuLqe zeZZ$0o%9FrXCXE=xi>Nyfw$TLHxF3TyEIiQQkUMxhy50NT9K+H*Wq`L_#HP9do}67 z6Uwwf!XpF8<~53~IPLP{J29qliQ^|@&DFm`9pxGR$KxcXR*b}Erh?GM z{)O#}uWzVhxyd=-GB&BdXlTyj&uJAZxE=c`YCyln#>ckE^p{l+cbicfck!nwj2h#t zCSp(pcuEo_+@O5LBVi{04t$BHiIbnki-s{H40+a#JKa05*+&hAt+CW!D31{F7s*uP z@ElEmYO2_xMil5{A3%LCl={=(>t}ewpF-DUv-HdD$-{LE^_@3~oNg8vsWqE9b(#bE z1*CdozLCf}sSgD=4kpNGi{D(!WnIa$B#JnR=x8NdIs8g3_k}n@#%y3e_GQ}6)a!vC z)~NaTm6E}uK0z`5*DX%_LSlaX)BO33d7Wm_z{u6`6JDIDi!b@}8-AW1FL44h`yoiI z+sJ9ZX^UF$j@8a!7{cTZw$lChB;OoT8l{Lf1UYDl29|4Xe}r(^{k2%@^1OC zgQtP?3lcAu)z8hkYQVs{%?C&FHPOlEZ#Ew^Zbo97GpPs>VajWR6-DtD1PS1>>V7LlXsseV zANy-egn}sT&V59%=b*>ca8DmuSolji=nHLVubYX+ur}$ACYIZjNU*Y2yjlE6PSrItJC6OEbTd7bu5tUAD7XSfL8 zfYS?pVrI*qf9lNh{SlvAP`GlV!AYRInB_I?WXgDRNhK|9c8xWcttMi`m2kdf&!#`! zpZ%F?p5;zwC(3_3&VLF^HASI$`P+K=>oA_QOT8^OTh3S+W!b#Vhk=Oj08^(+534#q zg9{LW-94WOMOhfe+->S|1~+MKvjwD?eEPZS7y~<3eT<+hC1^??u2%128;|YOd+Qm~ z4Mz`m7wsl$-j$-Om@G}hF+N{|@>gk&NeS zgr_wFG}r6=2%KFL+l_jDrsTX;C7vyF@kjlxgh`SoS0&EAS=|p3(Ar)_f>B4^W;Sy= zlY2AG)i1)FNt=B1mh#%X7tXE9tIYhdgK@jVTHajsJAj|~{XIKyo1Gq)pMvS^eB0op z_b}aD*Fhv?2?gC6xprjXpugUC8yx4D|Kkhix(Nl02dO9Sn~^QQw|tqZ*mU%e%YQ~_ z;a+#stD*i^rkI&*@?Z6~Vf*Ov>EhEqSz%}_+9Uje5E+E!-q7< z0lSzKkIkOPpY@%8qOkqmJ|V6TFqLpX@He;c;>bsb$rgkdnnWVP1a!5@!J3^&FJ6F| z3?l-oz(F4W@^Pg8N%Z7XAcH~H_gA-?HNLkVa|blhg89*qv;>mfJ<_@7C@Z^FS)F}{ zHt6}J;oIja>Hmcmxal)kt&t%`0V^;-3HZWGskjm)$zc^dr(AjoSFWEZ-g23aoJbrs zsBv(ULqD_$;A2V-Wx=h;Vw6-7XLyqU;v#TS{X9(i?a)JmXM~0ssNu+=-2INKe1AOH zgC>xT$8U>Pi9z~uQyZYh_@8@&@@#b*awXsb7VUBImxF3rDnk@ z$~m|T?d(cunftybvRFp)b)doiyYZJq>IV0}>PGp|x^}uTC$Bhwkr=g&ug4%o^2fWE!4j@h5h31#vI8kid4`>H-6>tA<REi_c-pT<4q~}~O)NBB23bG*B;{1DKtuGmS|0dUidydq0 zbmS_jb`f=Z&i8`E8n)2`%cbo3`8N2~%QP2x=pF0qLqcRA0~oOyipX+jI* z%&AEB4lZnmIGI5<-jsFhYENt|tJt`Q#ngVJ~s+(V**K&$`K=p_CA|JkV1VhNak0}wU)oz~SOE)G?l&8pkx zT^%^v50<;zrSetH^Kx_9U9sVK&)wCNyk~XZn5xmL9=|qKHxFfCG;&+bYum119QtY- zO`LEOHa~0Vkf87UTyM`B2~?ff{8$70)RSHaW^6m6AB{~;ZkK+>-;V9qECM^de0BmS zb3c?bt)EPSz}nCz@K!wyh4QYcsZp5qMyK+@lLt0@eA(^Mo&2%E8^697*_T%nx}-R2 z1@{!Z$1dPumy)_=kFC{sYmkPQ=B=L2x4ZcbeK`ggIi6xO)hI{&Wof{X_)N|8_xGPI zM`~_=q8d%wjFOVR8g*%gzkE3_Ur)+vZe{{cfQu39luy(iHUaj;A7)s`7CqnysZM%< z&u_2043|=cNPV#IL8$Un5s}7F&>I)%N?GU8ObMWhV|SGAZj9N25||7~p=q_}fDV`a zb>^xqI<~dfp4N1B@Z3JoA{@iA4ZLXlrc>S`IvU~J@ba$}D*KwJV>Ort?WIFR0q}AJ zbSr(=g=;D;?Z;ti?J{b>yuyRVleutx={52p_+T@m_G*`}*$+`uq{CVyA3W2FoK!OC z<>|n)(qNZtS@f|1>9Epx1=zd`((@057n)f~YQAq7?V~kC%XHIG`x46Acr{P7)(x}5 zeR)FcvmGbFd6YEuZELmii3vS`rMUwue$8vv>|kU!ofzR~m%HptJ4$hlmylFcq{FPT z^|9$NxO$Uuz$UnFl6uS+8ILP3Df3C)wQOX|dJn@}51r%|{*uRy1|ivvrVPE$JBm9! ze;2cyF^ftW(F|$mhJ6=${Of|J9K?7D~T8UE_Z_ z8orIVC-|4zMMVj_z4yvPp09Ybsv7j8Ok*Zg7n!ww{NtA+th4j1LrEani&faahB}ke zrQU_+`DyG^7ZH#n-ujGX!`}0g$FjN}!2`Z74&k6*B?OfR+3#WM4oxm80gZr~W7D~G z^1XIYGU7|q&ve{@R||kipRq_tRO{SJOF;FbTGoXp5%`|-0gAj;vLOuj=O_Y9Y)6EJ z6u;()M_Ng$B{0c^?>m$-eV6iFemv0GVf6rJ2NE!8Iv`5{?Uzma{b>oe9Pn)~5NiWM zEzojQkR6R`8JfB+ICnmz6?glYb!&=Mjv{`KScXr~A?52GbwE3=WRpOj8 zJpWDHHMp+0XDP>iN^%WsPKp1GOtUpC^W zkp-*}iyB6kJ4h%1lQeaXKgxfn?CVcB0FxaDmI+T%!O2{N+r)>%W2 zIZ5%UZ;?izKVI&D34!zcpvn=n{c(_^UBR0&75}a|oO=Hb?7(rcea5D7pU| zOl!TUqr2J5+_fgeeQC&g`}=G2`Woh>_91j)z&3w+eu5*9ZjO$e91odTX+In$9rkK}6KU{DkhL zJ7#KMuh%f6+=oSVUb8js!(zZO=f-(M5gAP2T@N)TRlc?sX2Ftgq2lE(SEt6uS=rl^ zn{{X9c6@763h%)rHImidF=Q24d-^00Raf29-#;#OT^e#ShKYR@$zraL^KcqRp@6#T z)>D)>tYRSoa!3-81e-LMMhk-8XA_!4d~xgWq_sp4K-E7%`Lf;{`MKJ1s=cDbf@!pAbX{jVl4rVxwv;!&(tgye z6#b|QR7a;%*LtGOFFLo!{`OL^2(?*?o4xn98xqUjfFyP&^LZIn+DgprZG&~|SVxAh z1Jl*14@f_(0RWl5KkC@gJja4VPkd%B=h2x*ldJv#BHo3o01}d~CNF|a{iVInv7+O% zQ9G@{cUwlkL-Sa248OYxnCRZTe*8RBen^-|o<(1mb2y1!|9Jq^zD{2+^hYmVCf_UN z7>eOnRqXSNf_pIgEnew12(McneZA?8RJ{b~hXCps(n5wk(S}XZ?Z(KF5+12H2mvwt zOW0mmf1wh&_FqB%d&q9XWSpFeT?Qf4Sm8fjP2JR?vrQ9OMj!lnzRE!7LOG=q6#u3blKBdVc11 zc22II&dl+=%0}d7;Wu6Qn;4lyL2AUN6-Fd-tYK>29!B2!ZF)M+CI3kGRYBdvK#R4t z_2m8xH#e{gd(PoSB2^#UznhT2Cj49}JgCDULIURK=GN^cvJlwo)-W~iGoNXaL)lXi zjGtChS9ixthIoMSv(tVP1o%DX`h6Y@%7rhxzR=c&e1hs;F57?}=51$2=pIkzsZUhA z6g4@T5AnzLViS4Q{hUH%Ca}N}&S8BiQEUJ};(2Dy{FhT$Z7JHk<;v*W2;0Dw9V&`X zHyOuNW&+SWac|(2->wm`rCFPb7S3@l-$g%2oYHem72T~4W_^gcOY;l7^O-1XTd|mh zEG{)DbKuPUqT~&HJpAMv%^{E@u1{oRF164^OY`Bw-}CuqI%tPLys2;=;zO{|(*yL- z1L{})cMR!9@=IdQC|Q?;n~MkVhrPCAnW_cVps}hayYf zT%ioGi*KoSaX+KnIF@D;`LLvJpqmsHRm4ZlbX(%>eT6V$Bv4;dlL>hndHBEK>j8}|sa4WTeGLW?+%VvBpKq;d&QO*Y7q@512J?v9I#PT3`8CZgGE4icBwz_O?aYV1NNi7B{~E6;BA((_b4B$;h%8Y zl(w!z8zI%0<=z3)VG)feIsTgq`=qGn%i-h%UKt-$0d zU9(&?A8?VS$@ zwyBgcGP>x?V>lpO2DX}BdTZ~a@Ur0Xd4m&qyxS7Zp4(053!nF|97wQckAO=CaR!W( z;z$RhTC$FZ?1z5(i#W`>gI~*{B>2L%WL#G$J+~U^am2Cf;}?4(9zo4Hq>>1F5lTbi zv%^1V8cMtN+#Vt%m1zh81JWp6LeSY--r0C?FS5iMcmD9Te?mY@E`(Uz#wu z@tJDa$9HprWEPuI;uYYD$#^7fiPXEd@gza>R~|VPktFPn>-JX62T!a@b)L?W@T5se zwgR=CPlVvc(up(-Q%SyrmKn}G9Bu+O^edgKz`&u*FH+oQ{I{?w;kejZ)gi)q>BA42 z37{gRx{!No;la%jVUyOgp*hV9Y*jo0j~BN9iSw&b%hsUK54}gBp%*+p>E^KOGi;$PA0GTgg#*PC(M9N%X!o|hq z#83|1p8t?A#wN2;1FM3|4;UhZ9>0Mr_V{R~fEhpB@@|@}bD##F7sZCAjA- zknN`yGvh0!n#4DL>q;*&rp8wD&hrX6+2=p1XEr46nsKBLYFFHe;fxPv%va024GTv` z6vM7qjDYw5p6pp^CAI>N5%Xzp_^!V6vXv=QvukRZt@E0?yC<>=8Z?n)U-Ka@sI47W zuJ-Rp8u*!AJh?~{ZiCQ(i+FAk%%gxRcc;I1T(;Xb(Ro$UocT_Ecmsy4;|N?6m&WSY z?vb^_uQ)Jm=nwFlj}RX(oJu0P1Je0{GBSq5dDW)oT=*4lb^v-ve@=p6MTxAGuFc*U zT_)t{nhq0}kKEjv5208(w#jcT(U`llbk4;_zxI8)>?n!RjQl2oI}b{FGXAvkfr zmt2&}*82!S+0lCDidV2FPF*`2lX8fNimA#F_xhcV^{Of3+i4iR6RfcZf2% zx-UFK(^o)+?!WiY=X)wXN77KzWLd7pJX_J(So(>7%h=@PQ=oP- zqCg+Pnr|$yykCo2WQF8 zb#g{(G#-8{ApLibcgOev5DxVy`Y!h8C+qba8>x=2N~pzFw(d*l4cq9$*UIGBVt?2F z;X_Eq=_k@li8bcp`ounXnWmacG=uHz#C}QBx*0xH+rbkLq`HXf7)L@_f^CX^9R1nm zPMSg)QnyN)&@S+wjFr?2*rZ`H+NwKF@{K@Q`r|88!6eI6P7?+)$NBT(ve5^pc6}A) z+%3IBEl{JsCzVzYA@Ar%y_ZuP8e%{QFp? znD@oFaC3+taYL8xD6idaW(Tq#bp9ct<+RSV_QCdDJEuAw9aatz+GR4bmF2|oR}<^N_FVUG$lY8H zh}#)J{eA}dksf_Gh<(Lr>=|t#(8U2@U`k%vO2L2|-S&6kP|MAl# zjAcUaa9tddVbNmkfb#p>$WqO|?=Bw`1b?(A{+8yg(rc;e@mW3*EUlk6bXl=gF?#K4 zY<&|bz9CaFtDHeKoh2W?1rFI^4tl%WW6gz&iP{klM_%I=j*G+)y|ZtyYTI9p{mEqz zAYdd(zKnBcfC<SD${T*3tDQkA?4Rx2 ztX?h^w&a$uRA2ttm}ohFscYNLktNvcl3zgw+6OcGze}OlmZQakc%+FEc4rS}__?la zgB#x%x?kHPkQZ*h_a7Zg3j6`r(}5laK!50(dki<-dy-pywE-3~tSo+e=V70x7jyU# zo?A4niyYk(ervg2U%Yp1&R%zt6(1ko=}VPV$DCTM?KtRdt}0$Wb(*eC`jebA0e#W0 zFZ}jDUj+68vt!nWaC>Wj1S~7r;?NJW(F>3Pf?#_0@}WeUF=PqW0q=Ag*C~elOyvRZ zo}eA2+aPL&KMjiapG7p*NDCIrgjtg&8xpZmwAe@fFeiG2jbB)O{Q;r7 z^%P7wY>GOQgkt{ynY;J7Q-$kt7z%f}&<_dlVB5m};ikB+|Ip+EqOl`|{PNMI1*({% z&~;I`0w*M7at!Z=Z@op3t)Mv&z3XaCs4CY@&pNqlr+4(?9Z|llx(gPV#ku7Sz-LZ_2&x?hmPoSyis(B{c+3(#Dw1W-0H~ zLmvE?R~CJl{cTB|;4Wf7<*q^rw*KzfZh@}7^WP?0Qk|{dRuZ8Y@e{m|D2W50ij9+k zMb;}lSr-O!Fz#TpqPf1IV+k<}JWk*)sW<{;*G!B>8gz)BLUrOtmqFPa$STNAV=l=dhiYjzV)o_hA*uIIU4+P$1O_d;>v zef+e8Numj|$nHBH6DQzk5?}$Wh55flI)A4Qld{7Q%)wyvCzr(pGqJt4wTtFXws-+^ zDupWD5}UnN(xlVnFBT}s@SkdzP|fvtX$XrFT@?od$|wuI{IqmME-#NI+@)-(4bFT$Ctzu{^H@b> zx)yITIntmDc5S$^Ewu}G?-N@@T})iWc+K2nof3}~C97bT$3xl|CvgAaMoR2!%!037 zt)^En>z1;7SPKxYjS8gRmZ#P5+N&%5V1EMm4~uJ}&Gq5k_;4z<$=82}w1!~j2S}g2 z&*P|t8URvE?~1Cav-}@>ZbXXOu#i?tdH&H^cbzE;*8{(6>-iXir}#m56kdhlQ)w#U z84;f8sqC-N&pZVOn>;_5v-l90#tN_=M;)wGZo84ZhEnLQt#{$ zVVO=P;2H^14!_C`r1J5#R3|P6SQTm?9J7~Uu;p<{8YMGJ5=0~s zgwmePGOU+zig25u_wh=c1Y1zZ7$Dv=j^-r#NPLn{7oq`1N|8~tV*p@z%+?a%RiC4d9Br%-I6TRR9 zJQETUrG>lSe%r3y7E}C{axaI)<<_TX@Z=wV#9j((iBP~yj@vv+CPaxc9zWw}feeA| z_Y$rqtYs+}X(r12h`C7O9Fa7t!C+mC&%k<{s%9W&rXkUwes%jEnJLGJ=P71CW8EO1 zt6|;zH@bo8Zi;6a$vrCc=jv;XB=41)0RJlD+!wdnbclO+x4$vgqjO*R4THb_5-g^A zjYdD&&>v9RV7_sC7yXOjvzj5PHa%;7Nto;GR?_b|ChY#CK{0dh_5G8T!2V0ETE;i6 zIpg^*X@Nyp#)zn9+AD_@a%o7$L~4QJnTJ(RO+Fe69Zr6zRMk*?Qf4eYzufo{*v@Wp zZ1|&xu#Sg{-ac8sqgtuFN!#rHWXWR=eZY*2Hes35ZKtS5v!^s>gYEdN9;q>+nN!Fn zO|?RygCARxex(N8WD)28hC^jv>iurxDX}qu|Y3}Hx zWq~aFGd=1NQ!LATU}TKPeM{=kP%P`E;js3*bp}h-7L6xLfY>G!Oa2L&rRAY(7qE(8 zrfJRM=NwrXq>xYNvLAztA=z?-6mHmsi=4=dif>I_0FH($n<8nA1O3zbYr6%iUV%M4=aM{vV5>ycygWB|^{6w0dRYEcv%{ty>aGK@P z$SP?VR_8_1YT6H)e(P1g0Ip@tfR}@!VU+dw?J@uN_AcJf@E$_=rPZlh!Oc_I(Z*_=Ph^Sh{x=f76-&btjqub7v0{q}Usk*t0gSCY_OYOGw zmo;oxI2?%!pj6Nx=NVoq$*e|;W!64KI)R9#M)>0!$!TR_Q6|BuUG^;QvthW)WsigF zT7ohkCl7JL+{wwr4Aw4kk?9rl)B z&v-#v&W2;glv?SCwBs;}%{Xxrr`FF>Q*n|NH-oDJUdq1{ovIMx)XZdw6Z!?c`}2n2 zInZW;wWD(GEMQ~8l^62Xs%=$+!S^~r7P!5s?=PE|;;tCoYLC$-z5V&-VFUp9Efi|! z4~>ijIRWM02cke}^bkIbW;L299#sMQC4v$Oc#VItGo{6$&5ou*JG#Y!8TwbIJpN$n zo$7P*>c)!Di+X1W6bLR%Q+}15ffA14wr(XS$TOW;OOJlpMeA)KYqMso5Tkx zmx3R8kJF%@rjhTilM>c!SAxOE_rPu@m}G@T*~#eE%QweV`3D;;8dea1eF_u@BvJWVE`&cxU07rlT2*2e}!W~e+|^2;hI=_`_cIRTF514yGLZ(gYU@1f_$b7zPF zLU6QCX>`hbZ73zvhqX1^64RzzP&55Vip$2+l~yFs)HPB?18F!k7AGsMPz!-FFbVIS zp*;TSKc^Uvm7Z%kxw$Vlprjn5oa5Og6{xD`wixh=&>vy$G?jLtSyurzm0uP#|H~t~ zL$XY!ga=E1>%jDkpa0o2>c@~@bP4~T9F2&>el`SY(FxvBR;9i-e=JBsN$9?}->25Z zeW!K-<|1Ng2uxC&PpaliRYGfC#{_dfIZ>6vZ|mz*gGvRhZEb^s21<5bHlWb}JIo@< zRQdkzLR?`<%|b7Zzaeuxd_Mwe331l355(fk9HTP?m|+#(yGFOgUJ<5w-WPV8 zkGiWIW3fA33kx`)>B?SM7@q(vdGjd*06uZ=$6U7-IIhLmZ-U^6hI^mr_$yG66{& zs7OYMG%~H1mt#RaCYAsfkRax9m?1R0AWi{JJ7OFz@iUygq`w=a;6 zx^`E?63Yn2bkT6cC4ax^WNsQh2KW=Wql@F;Y(-4<{ALdA3nUO&o#Dpodukxf?MFws zbAD6md_y5z3YLo7x(5^8pi z6oK)#TvnS*Lt5;-ufEY*C&k+!+@!vx?KS294^Dx@4hfl@+G`3)#dDP z#TnX`liiPU9szHwuDFQJ{H@KVd3b_S`+@UaLi_M+41p`lK-<}s<=w8mm0$5t=I-!- zqYlS(b!;Q@-R_10Ww$A9ID4T@BjJyB$s%_;%1UY8mNdy|9UHx;y<$@X}ushug zE1(j${F9xKd#Q);024e5Cg|Nzo$^hg+FZS15jfrF6IhH0EM*}*cx|*4rg4W?s1rBt z2XSc~MX=0oXz2rOAS1_!>i6Q=(%aq{Sf{3MI6Y(OTJyh=n$awqRQ({ked6=+eAVkC zK3N+nQa9j7VAhuQRfr|pz}nA1QSA6rXMaD+ymx+AKD2BS zEVi$ac^N@f8@5lN$Z$+o7p?AZg&e5E_QILZE-pg~+cW|3;h~QQEOK3gFplNblc7n{ zi;Qb*m@Vn#@USG!pJ!L-zg#xkE(a?|Pc+f>PuyXu>*|DY5qWv{9}5ZL!JuvGarXBQ zAb@?Vdi2o0Ej;AJCT~7H;!>0g3$G0J>zFz?|i7`ohgKyj29y0EcIPMzj69}qLh{u{*Ye_&oT**3Ww8-AZkM?zLVu#JGt?|o{H!3I zITpK#4z3bE?ksF+Z7pv_Y<6jOZ@v~6orl3%qdGpjm4}EvKt)UYn?~mKow~jylu>qH z1n&^ZY>Ul|{aFJIq=9@nMAO-2ri<)}7aDM#G9hOYzX5ZH>;oNF_owEqE$mllZQ-=))bS z5Tc#QGP)T?F&V~nYNb+(PyXs%oD@G>h%o14<~H$5E-%c50LYjeBq~bXu#YU4tBrl- z(S2iwWxh!{IWYxPgw)}4_aCh@I1x$Wo)A#*(W9a1X-BZx)9mlG`~XpU{gb#@Na5kb z3V>3IJ%-vA(DSGcRN~{WM2qkzV;mpS9c{uV(iJZQwbDj^JIc;-( zq4*dCh%DMaD8ZnD*Nt?XX2XJ<*95yB4xKIAaKO|&-J8gJbzAzTAoDlDK%TJ-cQBO; zo|duQSBo{z323xY>&GVu@+b8^4}tK{D~6iO0e8U7P>4-Ki~AS+dU;E8n-T{?IyR19kVH`+z9cE`4qeJlKTqLD0+!@z$ zQ%#`I+6FzZVh|}9#EcZ#au#h2hs!O7=-^EA=Ekn{p6AHW6tf?uLR{1=K(ECkf*WIF z2y{7lbkj$8c_XGXqHG5krO&iJL*U{gP~`xur>Bo98UDifs&y1EvPd)BI~?)DYr7Xo zyRG1JZZ-V6N-Inlws`Rh1&Eviv!jcbj#n16f6MUIQBbh3AG*E_FM1BBVCLKocNwt= zUK}hsI$G4k3HTEc#!o_hVdGo4#780m_mCvrqM9hBBFykp8kEf@LO)=AoQ#*nnweK; zm8T1V$6Ud@d~}BQHswqVBm!3vHekvCjJ+LPk{KI5&%S0q8|KH{M2A7`RG${7`|jlJ zhx%h*(T1CpYG&*p*rt0;soi22>yy9~JkzK5afi;Lf~ zUoN|=J%sR1q%*7Mv|KON&enFRvYWZuYi%&YO^YD28Y4TF#3)09&Z4j;IdF@VCVeYY zqVW|%?_}bELwgUjPX=+P=^%aRreOyY4DU~%@*@IP*7LwGNOwoV&VZkUN9%+2FxQJu z03Ige<(G7seEfeM-}$nqHam!Kb(#7I-Q4?sJnu7yGPHoa8x06TSE)nUp{Hc2c>m1_ zBH;h>2+@CJpe)TuJcIB!^A#Zogey{(YK5D1{N2jo=r=d0K zVBrQV_a_?)XYs|iWRfT`3sbk!#49a}W}!ro+!%MzL^4-KAxO_R=; z#N`pKHwjQddQRV9PBF(c9`#&+u3gaO6pA34?4SWTtS(Xet_tRKR{{n*+u%>=8R*x$ zMg9c(ywe&LRE%nN<~URt_K1*3ifD33dmt9d5t!T-o+e@Y{u~9_eIfO zxIH5MaN`0h|G4D+vTjxk-gU;*;cVrQ$1N<_-0J~H<*&~59qbCqi^C>2V66e|o6}j* z$1Uhnw|maPJzEQiKvi5N9mGk}O;@&p;qfcuVgYfkEUaT3Mec{-#A)51poiH2)8MsJ z_GkL1U<;hY*;p+G@lEC`Db-J1Xj{_dkU5Kl-SNp7qRjjxDW}IhqD2Kd`5UF@sh~_Pzh>C`um9=IdZ~&7b_%G&- zE+#?jVvzJDREqiCt_%Q$9netTKYp?#V~-ZP7&hnH?Rvp1c#R)A{V?MLD+WL%gY0_5 zn#H7rfw*q3!uL>?%;v=?_L~LZMW(_gZZUE z9#HkV+N1T$u#`uaCeILE$j1Un%%e zQT2hq6=-p1W`ERHI zFm4P1g|F74v(0m({=`keb1;aFv1PJp@H!*o)>laEkd3VK zkm@;CQRZ3iQeT~*^*c4ZzXd@2Yty60owvPhDcyHD%7M;(WL(aCLiuH1nqNw6W5e1& zbALMEV%G*<>Z9l{_^kQn_p(b@P$_OHlj^uNtOP0T`;Q*l1q8%+&>m}uSiVJYs%=G>3LN6c z9cG%$S+Cp9M6zkZXB)Gr$4~k6aqG= zOkwgMAt|Zbb16HPr*?($U5O?}=ek3#@f<~5L0VrWi^fJ>G4@i?PMUfg1kRlL}UP6Zm(nLW8CG;vqsnSA6 zK$>(ym0ki!Cn3q@JzqKBJ>!1&jB)?ib?m*zSZnS1d!9Atig~1`K~KX$0{{TM=0jCO z003Q_f&gl&i-X0>!si!I4RjEHC2_3{XSto( zkbUXHtCdrZ7A4tRJUgj>44(HpW1~Mf#;rV&dNO05(^2g0EpqRL&djM&g!qaOuPKW^ z`?ub>&~Um}ar+rzVRJ-OGi=^75I2WGz)>TY8d2nbxx_od+E^!A#Vojt_c26Pf z`zSF*o+km^)C@czC8itdWTD*BaTI{EJNqRdd_n9AK+$T$3s8r*k6r~Bvg1&yHdf+K`tH0Hfw%gxzq%4m)xH+7GXJ1Nq$5FXeZn607s|@t$ zmf2m@^mDk2_=+&5;D9UdPeCmbGazY^NB;i<(qO#4WGr>re&nUzD z0|)9{Lup{oPR6f|R@;dWyIdcSdY;YaR4KkCz!r$FhG!u-bBwc8KtcG{yvW|ctwz%Q z`|@x6)vWP!+hW65{%r|rKY_V>w=G~&zST79)DNg%#ljIBIZ0=iKZ}o9f2swCPHp?9c2&Do}+y;GPhB-{P?7ZIf zZ3X?L9ll;aJSjRhZ*}q5M6n}FFUIHy*vmx?g;DNOGX>KeKZIwPT0ym^Oi9g z2=xsC1RQ!07d#V;`#x{?Wgn?y*C@la^VWn9&2wG~Ny-#~6Bd_EwtWxQrSR}UHgkng zXN8+@t*s~rO*=$-7ASbjnvaNINX+j_c-G1u?e z&Z;y9S)brhLpO6Yj3(apZIptKA7M%-ipAFsOBgd3+oOjCW@k-LjZ<%?n-|vBBI{8* z#(k|3$jH9bIjd^Po{AmCv6Z>%7hrl$*+#qX>jiR;1BNCs@wke`GwsJ|C}O+~A*ki$ zWEs)-;Wu@Kn5R$6LfoAmU8bK$C=IDlqVzhoAinp1@UGiu`d;STEX>>%Ey$S47A!2{ z4)tuO61jEk=f!k&vO9N8=g2&iC2>c;9Sl(|MaI!~uRVRniTOIu8&VhYx_Fs~QT7$T z?kCkH%=GA$t;qxe|I}FJd!OwYT^{wge8LGt=RkBeEA^>{Y}MyelscAtGPG10vT!{} z5~SaGqN<6!m98eJ_quP$%qv}63DXD%QrsDPPoMg%%SFuIuCOcCt&h#ujY={!6i? z#`$uP4n8z?fRZrKn2tVqGl6bTl^-J|L;AbLGg~*u9F?^zLFN)>J9wJdIY^{8-+&!JfgH4EqNvmM^8)hl~?k6rbL=VV~T%HJK*u z5gU8FXR}q){e_a7^PH7JC3&PdPEtBGK<}OjXt;?!nj=C`j|}q(SnioTVl1n%zgw{e zTf?b!&Y4&Q@bY;B3pB6p+<(6DoqM`C6i7kQ$_w(0i_V^ON;{f zos~M2xaRXO#avCuT9VaXWXqgAdO=d!Lp0SSNH z6$m0}GH@}M%r6xjapxht?g?S*sFm!^Q6eTq>=wXg*vib~CorJA7(S93S%=Rn5@x|;JYV%IZ z{zRiYYX%RuFZwGdUN`)pQp7^OB^hzo6*au8Iw^SSQQ@k`Jo1nTmNX&?1oI>@WHYA9 zU+SKJv2P7vLe@9A>Q~=H;1#~P&{j2{z>aTQo+<4C?@A>d-yIHOf+dzibT9NRa#hKS z_Rhc6x`zN01@g`R6~*UDy*(XG_@Akg_ZQgiPFI;;I(n(+&sp<`d}9t=;r; z@Q!WHkQpjOl?Ru9YD&*Lo0iIu>(r=yEf}LWn`iI4B5-A_TKM)rnxb(p(g|HjXKA|Lj3d*PHkV>bw%$P%>xc017H!(;O?-$WP(oXXI&5R9KCQ?j8ruvaJNNO)Z?U&hOr z&?fy{Ysm1Mn?>nB(Ku{M^vNBHG=%t(%g?KZpjX%utCn}T?e{qr`W>m#w+w;+RSxP0 z9D-D#NDPdA9;6?v7CWM2e!#Z1O8&tMl=-RhopBe6f!r5w0O0+O41329#~HvXpfzdgJ}^p`P&xQv>@8l^3p0Y7QDk^_kO{ zjAw)NOMO~rsW46cbaIv_ekJ6SZf0LZ`alSE*5kKe{Uw!b062Q{g6np#lE=;EwrDg7*6u6^E2pxwS5)0qF4Vou&uP}u0i8(_eQiIXI6Hn{D?SVdH41$F6kCvZMZ}< z?@13>WvyR7w$)y)^ETay@+~*QxtQvQ*SSIA5ce`6y`4RG+T(1E#5^npb?FF{QzN?j z!9|{6@WY1fL001-`e`r8u;J;0{C6v@{c9oGw;0QUUgdU*8s#fHJBblB-O$+7;MlEt zLL=e_9%osLs%Fflzjc9}ath}E7b^dMr~NPV`PT>UQHHK-gI#G2+pG?4G0i>iVfmEJ zlRD%*q}3jhF({ONL$C^0zoFWCHbpgu>_V+8j#L1Y+lz=({>XZnsyWn}9!OQ_cE~sG`h;!DhO)(;T0B%Rww_3)JiIuFU(Hmtm zQv4gi=0t%_5O=TpU$!y6Ne9;rQaCEmWxIp2SGJB-x(VJy)!KCDONT!lZom9;u=T;! zOHJm$hPlRj%Iiz|p7K64^V$L08F)m~6il@h4bV!glhJ>=rSdHd{_ zLVyyTIL}%y2F?+Za)?{9 zKlsvM&8foC4<_^9nE@s@%EQN5A}a5^N+zkLiIao|KJW=ocK4_p zmyiSc#)V;R`~AU!eTq#%!R1xNrW1qv?2L%y&7mGv}b8BJNVR1*;Lp!8l;PGn4PNQ9QNa)dp5f`^$-l`G)dAJMH(90xsqRubf{;*?wu0R?&C2 z{NQnhc`dO)^|-R!wk`NwhB#NeBH|NHF|8{~Aujo_Vu(!4CFBssWpwB<`~hKzTNmh=z;69?|KkYb<$ zPtada8qO)&>RIs`xxbq&llV!KHUkmAb5{FZGH6l^m)jsG(fvDg+XD_y+}wXAB!2;NqmAw8 zrrG5rE-9MK{GgJTr zw=9U?9jpN`9!JJ)9c{Mz^!GCqiF&K)nggg2UHy>xnm)a?mr zuuCBoWsqBs3g2>)$d1~*b}Es%Eg|K4KO7RDO!UV%P`xBhTm>kU9T}FZ7yi?v|KFhK zAK3wC8X%i-ULLnsJsE4&pzGvT!*cS~1~PdEu30!%U<^_^TqIA^gecOx(C)TQ2yupD(`iv~fkZ(V_I&Md0#Ovzp%N;I+b*U0brX)KtF1FIFMd$=`pc4PdfCuI7Mg8=nbQtQ#}?!JtUQ$R5SG!`hxQel!|QsP z+MV?d%91ufcJ&CO7-0$n=2=Rmzcy{t9oe43x;;z<0!D-RbSBGH zB}H7GO-s?3h|O7Y3J!D?jcj5(ZX}p6+j_GOT)ZC9u;l-yvw~;LRcV%;1`_i7I6c$g zXfbDFNar~F;LZw7kXK;!Sz6dL7#PGi7z(35O_f@ox>hB1$pg3NUjqQ8)(W`2lt*ht zHjV~c^Y_vS(sdKV)Jq}Jh@zDz*2Msmo>b>moNyOUyc;y3Uxq5oY?nYYm9>vjHx&xO zMZ#InQ1##zh7S0BecMUV@b$iHHkH7;gKl0GsanSq((B4Wc^M>u-^p~|{N)5seMj)f z@zRLgUTYP>5Hf9x(A-if2E=?$9#(G$*Bgm=Blf?7<8|!oSlvC6)VTK5Nk72z+`}%@ z!N!qack|+HII0e(Zvz21#;GS}8#=MZEptC+!?>w}lrn5(BF)IYYSD6he7M`g)5Uyd zZ@nMZx#APjK%cG5FwyU1t$6ZU(H*DpIP4cLsUFOY+w0F`M6q5tf?iS@Kgfoi?I&)J zXL{OMMz{Z!Vvx^8thQ~G1>8to`N~JC>?5VEw0a|a%=d?ecSN>Lrr|UrBDx}zhnJ!l zj*pKiRsL$?`(|@J#j+M^SQ01oD!;mP!KmkX=@|-#04%0*_J7vcCHGNYOLs2q=Vkm% z)dT`wOf=1Bmt&s%w8#5PB#p(qFa#&CO3{Jq=q_jdnx`_4M@j=x!4U2$WM6OO8U^_Wr~W5wGbFLU zf+?52hIhD1sPXmRHxK8QN(p`YtWV${eQT@$3?t!+h|?+`K2o|6iTMOjg)~2u*k~6} z+ebgVFj(2Z#bBsG({v$uG#f;~}$nxmr5c&ROQVbIC->O`5ML9_! zPIH$(|IOsTALNSPq0kt~#ce+wET&DZC1^=TC9jRr3HAhh0d8hb*{flrPbBsRM z_hJKLKB%J(JX;vVu?t>+AH0Hd;#Vl8=tw8J!#E z!)Bzi;qC6$rUZ3C@V2%{Eg2s$+M_gqWZSgO{M#G+{SOu}qQ-sl&THQglSxynA;mHP z^_7HKg>QxW%?+81yX8v_^lw!27(*8PI1GoP*6dMg2tPtjL72$lVIt0!Cbd)DOsFBa zeoNb>o4DSvSy=Z^5rSorr6Z%4yC$x_QLQT~fI@Y3ML^v^e4G9R(S8 zsLWy<6cnp_-s~pq+T&TtSnoQ(IHG7wyO)0*n82p*Wv$BmJ#-9+Q(pHz=7OGXrxp(H z88Z8g*IUQBxJO1ns4}}*<#YSKju<0(3~mod$-sKPaMZ5&`tfk_ZKk%n+R?g~ht>|K zz2&K8E&Lbq!g%NC8ejQnAA4O*d`!x}Xk?nM(IPWD>Ji(D5+eM)( z=EY#zMJtY`Od+3ZRo;Q%ukVR;=3)|y+omfRA0SRgFexr9+G?0&9&+K2d6;PDQh)Dh zy<;9n^zk5K!W;G`xRPj54K4NkcaY*^7?wIhJ!4<6JoU#YMgWnLME(F+~O-AlWyR@PUDj)y-qCP+tsTjAne2+8wE$uuFoI}T$2PQqf3$o9 zcRhvpFhYb#Dlwu8D}EcA%?Q!2TyHmtFmJT}*;GDH%y@9LYlMhsn$8%|`2~Y}EULWw z96W{u=Wh#y1@i25Na4>Vl{a}9_cXPC-&C5zZT}t6e{i6L?!gCsSp6c|Cs$Df%}mm!pCUYb>2HXrlxuFEcBMhJH%3nuPxkCcq=8ayc(-pC3)OLXx^NYL6~ZIeIcD{;bcJ(C0h#B4;vQV?|U?t_yQgntDj4 zv%tbX?~*f56@NWh6R7xk0iW`Y2RKXZDs7Aj`++X(P zzvEXgEYCoNT1}VVT1(l%voxOcB?*o3TF>Fu%P@l&WSypHI*V8$#${}w=OIOC)3WKQ zh|-2@zXBzudZ3P%2B??%ekZ!<#V@t$o)>#++xP1j5nXb1DKUY^^ZcSi*}*J9@GQbn zNmeI}hcyB?QH&jf&U!M&q=eNeePvKE~Jl!7% z_ZFCNE|b5*5l^sSoxIyz8ETU|iA~V_`=wK3PI)Tw@~^)}5OZC1cU7F7DjaW8)Eo|X z2G1#a1w=S%Nzc(e$L9>rq|*a_Ls91P_+#?vja%@Bw1BNFk&d^&eaKsGaV%2ma}!N5 z&Nl(-J0ly|T{hCQEjSdYKqQ#}(%}q7rJ}36u_6_-fY_&KzgF9pT}Sf~JoiP4UQq|9MR3FY!!K5tD?nrig@{EE zbnfUE?H3-!6^*=7y-9?r#B*!Rc!7Np!O7 zNd90hADr;j4r2*Djk)@O{2`8(|KTY4E1{s37LQsce^a(LP6d-daPzFPfTh&CCyfmi z^WPImKV9G(JPnQ~m#~sSKge|-gE(#z(0iqBIKm48i@Uzuf#;kMl*?6^Fh%@o(yYH* z>W7{`OH?G@+Wm}7xSK(80pD=nED^ySOQUtpGBMK!U8cpHqVJ_r*u^{n2|Wu9HsY3! ztl!M#;%{5{iUjOr;*t(Xt^jpZYY#O*r^T3765j`(o~t@T^B+I4sO)@_!QDbqX_S`c=<)lYn^ooDi+e7R?vGzyot*b^9f24XiCQtDQUO4~3exqI z=}3tFV)o7dv6toUg|GNBECkH~gPQgw^1}g)UZsNe{=<-qs{p1UA?RECi#^&6C6r-x zc5OsCvt9p1+4*p&9XX+1hT3bC{hYZUWG(Nny*NuQBnPFd75(l(9q+eW?l=`p;&Qux z?^5+J6f@LE`p+1hwf%$mx>u&!^ zvro^NdLSrKf%wU{t2{)N0VH_QYsf(*mnmTEx#eo;Bxli+jHvIVT@J^1C+s8Fs46*Ijn#I5_V>A1|*m?0Z_sc zKi%6l5zYbpMmJ`CYAtn`a?L1)G1MHo4ZcBf?jb0rfSO)NDO&P>*x-_a#1c(|?A5`9sIB!m0fE9@bH!<$^a(`rbeNX$R`UT9H+Fukx5{5Za&zH{vs@6Fx5D{n z_dv{Ix4{H*%dxK@-7)@BJEcoONcD~!Bj^{=($E>(oSqRsF&NSr*JG1o?McnFrY*w! zriiTNEiE)_X)tXQd16hdh5Q`tYHxS!EP39bvi9k2TtZsKcsU?9hC2!=e;j%aEXXRIk^M%I=VSTy7l$8I~L=J-w-Y z4qPSSgOTkFMq4DmIgS8l%{@d%nPQs!ff5wg4F5@tXZvLKj5OJHw<;tIP6ByS0uvz^ z^1S%I_lhCKW@YA0df5B^gl+ON@3!1atw+$O@3b|O+M_UmVa!b&;wKqWQBXf*sgdZkMqF6 zra>GD{MPEeWr(uP?%kXk2yscSxUT`>_{hbl94BB_eRDm*=T!NUmC{TX7xfH?ISGv3}waQ>({*3Y}0Op99V{GeP9Sp z394WTsyxhEgp+SRTp3_9c0=!3TDYNMrx_Osq#@eg{@^fljdc#k$1}0a03e*(t}pcL zUM4s7)W2B?v`pk45)ws!s-+EI5dKB}pGu|wTCDiz`k{a7=-W*L>n9N+;8E*uSE86G zTIFK`FVO5Du1d(Mc~So-oLf?{2nnprk)yitix;#>90g^5Vv2ALqf%zt6d1b!be*oR zzNaUp&dQ6dF%D<-r=9sn3pA-F@ zrCV!*aIRH>YsNSnOP|xG`Tgi_&i&H7muyN*RMbUjTTTZ7j-#!mS{w~qi@T8+3x#}={ p=*AB?=>M#n`e(cUO}Cyy?RCwJSr(5ks&W9Jsivn|_P{#)KLB@lw9Nnj literal 5869 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Ξ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%0D`Rg!hm`RtTmdtCTKk=Y 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 K4~vz}-~BIpv#V?X literal 137793 zcmcG#WmFv95;od{yIYXp1b24`mJoskcP9|sg3b^u!7UJ6g9J-RaCd?e+}+(_fSEga z&wI}Oe%|%1br)-xE!8!J9BNRsetw|fO_;9CpDBr9tVB~l`aEnVHc%gbfSQ(}f@`nxb6WEH*gI>R ziWVGaUo==~(_7}7AP3>v8|(DGuQ%4-acW9mrQhv|^M3!e%qT6K`nfEQeM_`IL|hE7 z6Ia!o(BRK5BxaXx<;9VoYLiVu3U&sA|0*#Xnfzo9gzv3B3RP?m6QFEGZ(v&1qc&bW zPm%2%!l~vnA2Ji)&}0Gg3m1(X^YFG8w1@-oW1O$IZnJpfps{~ z!Haww)8*3>OfE)q`#zO&w+I)_js!1JN+uOQ)w{fWgvwH+X!LUQcxcU*BXfzg!b!C- z*+c>+q3z4Z%*e;@CHt#YpCplY#Xh=2YOmgi_aj%=eUzY5O!!h?Y|r+mT2#HOTlfi+ zuG=eNe~@K=HfjIn4G}hObnuH9Mm~!71F`F|@5DKI5}#nd!FE6cwMV**%?~9d3u$R< z)aIU3zJaU;MY@S)E~%ayYb1EMewp*^PaQsZO7SSm?(3_#IDy&r(_Z)N%*@#!>Uksjd z?@~KW((^OjXfVt!d`EdU>KGfMV5{hH`)!MG`l2!KjmDH9QT7b_-7>!}?(UA4v=RsI zpNzBcNs)>e?{MU z-RGTqzFV#u=5&46laZ*kBq;W}TMCZOexZ!UvSpMT9g5ZaY0k|Phoqp*?VV8$bD^ZT zE+3c72bT0A*&jxgOAhi#`O8Ujat9aDq2#+MPJgy2e%%n0Q|2-m&E=0}k>oAJa^LK zYbdoA<^FW>k@FG!N*yOPC+p>t48MY;~lTZRNHkl=IiVsyz&o}k=DV6Tfr}-m9VM5 zYVzT5Q9T#;*5I^O=^N3=2HF@jCPn!u1a;}C1*WTsneLH#4g`hxyQ+UghT6*g$$AZNb-3ENY1> zwqPXsJ{(%j6WtiStoVf5FVP+?1UKsmF78lIw3RRlb$U8xKhE&jb)-wzEh%2Xv)psy z33?3_KVhG*0oP7hpV1QgIwzv!h|G9))n$mpZ!+7*n(dbP7`ZkRl%}I63r706(Lwm@ zQ#^+T0ta||3D5A4bbUoYQs!lXfO4{*jGOldh2dA4v!b7kk+@FwN%1?~HRTvSQwg3& zwb0An_u(Qh46!S+rEX;ovTAwEYY8gj_!&4=zrw1Sya*n^-b|zVwqE1+(-`Fm&07Zat%JGv>TyrVnDmt^==Z*E zTAP(kNPn=$&X;nX5!oE}Erx7~*!I$O>{=>G(4V>&l9pG~+TLSf7!qux#VTSIc3XcS zed?)C`xinhBE@D;M2{7hm^nc|Ry)rfk)eEiqkf@)}F#RLncJYGad)4(@1 z9??@@KGik|G<6EPtH0Z7tn+S&bkgE{S!C{2Mz;o1_v`CC>p!K;!NW)4xDkwpRD6qa z-Nfcrf~;$Hq_lL;V3x+%6caT(KbCmGSxy*fG&q?3}+C!KL zkrWqxm9^&O-rpbx^$Ysa6Q}2o8;Md5iQuM4^S-X+f_lbv*K-SPZM3p^oZ)Y()S<0? zO>9@YI13+N>`$`y-Lw}=>D6|w7^)~fY{sc9pU9q?aNiM)v%Xa#M3!3fG1$F2tSk5v zV6X#n7xE>^8SuMgI%~*6lC=X<#q zX_0u`Q~UPs{9MBE{G_#VqvHc*pY4pefIz7laawOFJ@U{{fM3b;#^bkwg7PZmpZ#73 ztQq|tyH_ta7T=t!F(|V7o;G=eDq19{ib|`!Yv?Skt2BX{|I+O;Yf?J*fRu*vP-RY1 zWY*TSBZU8ypPVDrxfP0*-%$)^7tPqpNG1K${8htc)=KR{yndFj&9{2uyduwl+m#Ir z3!2^vG7p2@fWhzzdIkIU9rn_~A%yJZ2R%$N?fzgkrC2dvst)1uJi@@B-($0+x?j<{ zE((!38ZYIZvr`Cf8D8(6k-pc0xN$qKc_q4(?%|LQd_k{aX0Er({oN-R3!8oNtU1gS zqx#Thls!|Oib6rciJ|{4e4-W77&Q-9RMU8(d+I8RdA>j^+ z)~A5R$$1Rr(N`^l@`-zC7&%03T_W>7%8tAQtqiUaE`q1A)8=%#uUpVW(!Gb}4ioin zYeJqHRcU;W(&%8E!0QjT{msVmb=f1L1y$1kSHGm#L#Y#&=2Ms%^81xt%Ei-TrD`JV zHg1NhN;~t=1AYVSAmnxRD+v^iAE#wj)l$`{(@6)slJT>6N_rw_Eyyfx?9{B;$i>3b z59fm2=^F{qgX6KzgQjx4St>!bV7e}L{_jq*Gf{F}>)M=x3WxoB58^v$Eur~|FGWVN z2-+4qgVE7O;o6FJVgjxfoARQC)>75>Jjv9->UbG;hYt!pdEq&$-{+noSzp!-qw)Lo z<|!fimposd&y4f0RWE-t&*f6#oOJ(bj|JE=~*Wv5Rz$<~_ zufMb=a{SX%3>oV4k=RS<=;$Q+8M<1tS7=i`(w^9w$NSq6jND(X3klq0rj54vkV%hv zWP4OH@$wSjpoMgp^HSiT71-n!AJF{M{AXl71Qq!2q!RXr|L>h%fzDo&rcaeO!T&Js z{fUnaP(<5>g8sl7mr?)obHflcbRdc4HT?xS=Q^B4EwdB;=|_l~T26j>m6{VU+vvqH zhxi!OyXJM8sgApRJDm4uR?G?6$|;}PI}->j8of-Dp0I;*X}0B22o_#Ephl_iRMBHC z7#lY%NYJOs#+<@w7I_G5Z_-nwm(a;)xLw_jv|5;nfM5BzuDwlQIBa*t%uD$FT4&g1 zA1#=~iPp0MANXlEs(Z)0P~(_d(s<4a9&dxKyu<`9Z}!>Jw}YMTT>(006UkdAw}f#3 zLfdw4=-7t`w6>nGQo~yV+f;z|7S$QD0=Tz@FtGZufosAg_(W!6rXnbA2nUc24O}4e zeQ2DXxw@OFX??JAI=~K7nBV}Zr;C0~xl4J*7c9`(U|;}*igY$kqdN?>i93Dc(It=_ zuHzSRUX*?Fh6Kp<*ctg48To;N#drofdAqQ%(AC|okXKPyh?16;26W@1q=2haO70W; z6qfrY-zJR}I4XBsk#ifpUTl0n$&TFk^gS{_j$!@PcB37Zqlk+V5V%4=awJ~zPW5$U z-&jHcpFfl;|0tyLYJwvg6QBqX!vZwU<_v)LqETstuvZ^vYGBI6!i2zBlNJV0Lir94 zs!s)7d2o*fWRJTt03ajwQI^*6;(}ai1RYp)J4XSI0%6sCeDuRT|B_W*j&BS;ws%+AhP?01h- z@LOYWn>2>X;AL+w5D_!@Za7)l^{tQ-QAtSDIL(h$@c?;$N&j@SDeTgjBa~|mz1+LH zj*5(w-xI%*RlF>W zeoc%w;3a@Zdp4l+k=XEjJQZla%(%O+a(s+??Zj}L1!^ff3g(ub!j1!63LBg*V15vvfcz!)1q4jAEHH2 zfb#_ysP7x=y#Fi9!n%wncsDn}5|A^I*TB@j;;fHzh*_8L5}l70#brDaO~GE ziX8(@!0^5}T6JLL;7fXXXJ;lh3>ynu)7UsVF_8#pU+anxnx3}DYcKqy{V~ds9Ce~C zaBv178Lm6`5M07kyVA+y3iJYDOcjGIzq_u<=a0Nusdsz61nXwSVI+ zFj3liUoy>QXg0F~<{NvD0!e8Yx-i27ZdXKB&YaE-e15#*ohlB71kA+|G#G(fIi3%*W8*&z5=;mUJy5DPwiK+!C1 zc2*yd{iF)k|LWR%o1hA2(sR+nBMOz*H4mZA_akAKW&)}g-}j?q$j2Zdyv@v9%4a`Z z@7UT0D?hVntz3jytZlxsy(^fDEiV`Bhs#DLppMtT=78f1TbfFIpua5W)lJl%$jOb_ z40O+@e&xfEkp%$wN3{ZwZ-s(KyE3amGmMP&q3WqvszCdO;876l4~OUmP1V-u%GUnq zEneu(ZCG$O2~7gK3e~)Pn|)(s)8~zlUEony&fOQL;R2d z2iq-ySJ3F<;G%*bQ z3MwaASXnV#0v<3KD#HpUR0|0G&wiO3+(L(B0Ao>-j~^W~_ec$CR|miY0|Nli(9oc= zUz_Y$Uk9QP!~jyy)cw}b0mxkzDFCUi=I_`>YOXtd_NT*l2t4-YaR`qD8GC=FhOheqFvoMjTb-cQ3n<&T2l1MF); zh3LExs<)eMU{cilAh^Q_nED15;*akz(pG;WBLz=;yLjgVyCZ?5U%)ey>PmKU_WK|c zIl3)U;rme!u(p~2KDV^vXirhAc31SF^5vjMNjs$|l%98|< z{4sGU3W#6QB1H)-`MbaM{B1f>R7=E()%cGJN>zK<^I(83@~*h5BKo1V+f0`4~C*= zmlaZXqL{`607L}t84EEY$Cvv6AP>4ct|wRS!2ZIQWMcp#Kp(I2%Pgq4jHm5WADuJ?K~iWG zVKZi4@AIcWBBU5cR<=U`hliR{TJoSs5xL1*-p7;zu+ym8a%jm*w2u{4h#*^42H|d3 zJh(zd@+RLqXq(OSA#TGY2XS7A0;|;zS#CF*E{owiXy*%q^0lR$fu$VU%Np4a#Awkc zk+hH3Ai%I?K6Rzi=PG^|ikp{9M;nvnKSsgN&+ocBmZx-}etpQ8b~uMl%$;3X^KIzN z1y+2jFMZFGEZttQC*w3Phy;xIv^{sfvHAF06{Xzdwp>OC2CN3yBy@U&%|_tcd8U-# zEIh9+h&|tusz##nJf%c~WFVW{X#T`U95Z*=A#aoF`|Z0Gl{jAEkmaM445xb~sv&H= z0FBI5nl=LAQ=4@(A>?I)AGl>cc4;DGw}RcZBtwnSyv7=Hn9+;WnTpFe*Qm)t5R}o= zgAru{dSuD*oLzh0(%X&f1IxxUn3|+>l&-s!C2KM?%LqFM%z{HAhha<^sLfT2hgOf%gK7S?@?*$p9)$L>+pd{OufW zWJ*NnH>ar#0(8lQzRJi?!3G6<2dLLuUGwI>(;thIAU*Z0vk38r*^I@q^la=tKkjra zaYm*yJlfb}S4DlCcyT7n@F;E=S=sh%gn~yMjE{&KH@5apEJm|)zCVkF?NSK@a_tVb z!Ts0QYrf@V6BXv>WRet`i+4}UIGBT4xba+1a0-3g+Q<6^D}vw%g%!j+SFgYHR)mIR z&k~bYUS06O@9up@)eWWKdu(#=n|P^OnqQrHzZZ@zw7+>2QR9|HWF(i@-xcF_aTI{} z%@GptBEvCtb^?=-dy0-Wrp{%ToLoG^h zv`~i*Ncvr3baZs6sHr)fIywX}o1;ZEehv%OcT=J98V2QhL4Unb=Dd)xK=MJA_o^~8 z^S9Dy#gnzPWPpBVT7{cR;vg*j{Zs1T43XePDqsRstB`;SL~?PV%!8!VK&%x#xCX^I zKKx4h_lkj|dIsY%R;9`v*^1qXC|6C(k!`x`ed2fi)-#BB;qI}R9B^b!HztTi1#lI} zK|nhyC`y>!wsA{u)nG^F`DHmg6q8uR1O)lQh<`38YinCH0LZqQM00>9=vI|f>N``- z4&8IY22+yCC*N^CoCg}?H+R_Gf>=30SQsu3TX`}c{sxx(H1m|llQpoDoz8wJe$htP z$<6ADlnh@W*TDhwZzgtGlaoMC?Bup*F8qzbF@xc=lI~A>9xf|D# z27_DA&mh%$7)5%5zI{x_L>jKJ5@Ur#c<)BE_M^*>ODAsHuN&YKM)L*&e%rb`k3AQ(!6 zq5miPA+J6o(f&W2 z3&0tf!YFX?zv~s$nZR4^FP3I)Z;!41_@vA>k$Dh-ExyY+D5^E{hDrhLy(jB@R>LmC>jM3V zy`cv3op5n0!}2tc%VJHsTGvQ!NK7GOON14}{tZCq z0#mKd2LUYJPZwh&Nl@Np$b`WOhE{6L7}{c_$%q^pgXaeW*%@sC4L!PZ3Ly@HN1Yb6 z{=nPa+nerzrTUaTJ!PF}A#1*`x7RWFD030X(G2V3ze^G0eO9w^rfX*I)lED#Drx5mj)AEQ66OS@| z%v8ihlJ9g*M5L-Px8m1Xt5bD3)6xe6!C&-)Q^h?4AHZ4CFA|9yiSUk$=PeF*-3%x2 z8%b1%h=^|cDl02bpE3m6f)6MM63kL(1|Y3c2aXjq@XwD_j(hmo)e4SKj@~v?Rq)c9 zOvcf@jAIe)kLv158|YL*Ru*m=Cw?2O)@aOw-(sEQPoJYoR-kj3ac5pg=e18e%PoC|-* z$(n4-Y~6Bv{P??_gLX-4_Vv9|Ul9S{2gu#U4sk@S(_P=&Cr@T;oibR>pv8Qr3w183 zIFxyJ&B2WboRML9c^Nlod9lIchgBaQgTh}a|0>l!IGia{#y@=A!2hcUdR#UkI0&3o zQCC&;n4JQb@Pw2V`maPuhyAIY9Ap0g+!>}*v}N}YfD zCH+2mqv{lD*Lu{24*EsHDlUv#_u={K=7mF${g%Fod@AL4y1>A|zzc>2Fz6Bh zlbjc&FEHcv?{l#?5hn8yBN}?8T@yGu0>zprdQHlVaqBt9_CTzI<>7G!N5R6rICB_d z!?_S9d8rF>2zq`TZZ-Kkef9XTeoOy;j(uE>R|vj%uVE!SI>O(B&@H(XhK49C*~jrR z%iCe=w)76ag*^BJe(L!G*R)G}by$=FJ`y6YrSYYGVKi`ebo7Ax!*Y+m0u_W%CgbN5 zJT!oU*_!Pgxd2AI2pk}B-Wkni_ai{~8W8Iuv}%s?e{G4n8AAfPKrp`C!rR4=bL+4p zd2|peYGi9<`aNxc%>x|nL-3DSR9FVft`>_e5PB=jazwYbbIZBt4po^HLcr5Vs74YJ z(NCmOFbGlVNdlGfHItTZ+8e}GA(F1KVAK4$RIhyzQ9wiIqAGg!3T}{={y85bthAI3 z2M6bS$mB`I`304WpH5zxjSASX{^j{{oZ~IBS>^+<@~}jCvM`Ty&kyK>zRO>)#GRcv zip{=R#0JPkAAY&&Y!tZUq%sx1Hr~9l!i(#II%d1R6QQUFfNKD9<RdgIPdCIc z2&{ic5g*CY@_4mr$;ZOM_S1TP0L(irM?W%h5nDPgu5|(PK)1HvKXG^^sOgmiRPVy3 zeyP@pE7027UeRp%0nGP9D6$ME*UTWa3eOg)A_D6v3bnMm0zd4i4il)C^usBAiv`fZ zemq%Ezy!WSQ2vNkK3oL2@ewW5$;k!dM8r|Qoea`IpqjLM66*^uxqqw0zY1L{zzp6Uup2Ld!eC0aCUvIgm_Z4qMb!# za`V;=Wo@Ll5P9L?!0rO$GILjiwb<*|^2@`L`1M;iBQ?nz=wvyeh^Lo%UE%qwU0*5o zc0*qx?W#gvB1L<8b~fzO$-XMNJ6SBHC0f@qe`gb{WdIWQ*^emU5&^;Q^Y^u*iKN}lGO$f)mNMd)gCje3P z7h#f))UHQ`AiCyoB~2xeZZtS+GgYr-X0%^6$T!Se2{e$zcl?=?M9){Qts3KNA;pI2 z@6O)>-ueABh`mznu&eLBGEMP`jLg_prbYHg(i3wFi?9zL*gXR;DIB>m>>5psn}7y< zxB3>gUYUUp6#Yqv<~=+F-4ia|Q;Yi_0V;New$=vUxucq0xr1#uMmkYRpg? zR6xHz?hOXgCaqC@Tz5kZIN zp39EVIPeUnQjg*)qaHufCcM5^h<}V9Eu4^*B|Q)RFgEtPE&bBS)`oeWzwj5?=uN~s zpawoSwkDSLDw8n1Huh+3woK}cadcs{KUZ-IXQ73KT=L? z+%9^2a2Th9NEh|4jMREnw0hT8jOVH0t~VmAwO|J5L&lMDcysn;(&@b?&TX=gYy_l%6`DibEKy_f&WvZHb)kk-3hZJBz2@ak8^()stqdDen-zcy=r@GCdL^ z0>9*A|4FxZnQ31DI7%CQbe!R~SjV6`l-B&%*(neBeG%BH^_DY zi-oE_gS988Hd-y1`SuSEhInxpz49%UaOeMXcEl6$-DZkm{8DCbjIhuBXK)$0#Zm=% zm6`Vy!=JK+I;N{VIFo6k}mwfyz-fZ?i%&?@inJ z*=oW)2Yl~|;w;sz3>DtB%f_ZQh`LvvMgkBAmpR_zkXQHc=6>tcsM^bq2z^2!0{rPV;NZmU$dsGgnp(P71zXzlfB zlceu1SDWE~YXQ<0Wy1S@e0o4x+w9}V5PBv{tZg#G8eB`z^#F%1I0uo)F1-u*VY`BC ztdtXrq)|}y%Ha>Ab)hs7^F6+6QXox^Kc0*F7f7W^)64DQ4enYmI4sb8bBw<56E99v z;Jr5{*S)44j7`YN_rW7<9^b{q#q)SE&1_qn#@GyEd-;1in}ogdh@te|G>_E;b2_XTEnc>1_t>sbUy(BkV>n>U`E;N67yNu z5$dMiw4mWW<9!W*W}M8sOAO9~Y2-XwPQ|$hRZX#@L4pnVvPO5ZGrc6{*H)0I21m0I^*l4xA+ zuAH8|FZbVJiUQf;p~~YFf**~-dPa`%+Lo4D$XB>oe)xRg>y9w`nCrEWZmnJy+;!*8 z*Px>h5pk-Ax9HJMHqY?9acR=g&pr2*Ut8j!kn@3%OD4*WQJFbO^w$k%{lVvXZ`?Pv z>i+%)3ys%A!|6_o&PxucxOaKC7bgxonjqv^@%xzZdmnsIdPg4OA!l>C>mN%?2%MA7 z1Kg~u$Bs%ZAjr3`(g*UEe<%?tK!EJnm(P&tr(()*l34`6>j&Y ziFDg-^jDX9mBxfyU8!%tl6woxCjEt%FJQbNV^5@Ui^=Cj5sIq3Bd4~8l$dYbw zJ;+7e>!`STskf8z#|zA93zAPt?3`LA zBO_qme zfQt1tMzPOWR|3eZJ)I|)yq7ov?vIC8uq!jN(?YfM>B#T0x+kX0|;Ua z(~yNp@DtmfsK+~*Ww(>q%`Z*Od+4GYCx^>4cCkmwmM_K8qH=T0OoKTZ=1zI}6g^+? znSL+Ftac_PYwzkN(R2SPHyGM&d7tk5rEdReCEAL@+K!M2%?PtLh$LZoKsF0iQm^P2}SNCAz@i*wmL!8J?>Jt zvq|F0++_tTElvIVg$ZLOHhWh??z`yA?PKg#toTn^=r5l>fFAd2U|R|JcqMn_>xRHN zS~eOoqV6JNKmW_ZjYE0$SQ%)lXSE~b6U7CP{)fMi#L2`BUsp-J`3(tKOXjFriHwB8~peuXV9%$plen9(FOWD;^WNt3&jjJ$u$s(*nIt>hA3&GI`q8(jwLRxNVfIm)tcoLyiEB zLgM1^UuTMf%*@O4O{C@DIZmrY3m(Us8;p*G~UZ30xl>h^T7OH|ax0FL)#H8x%> zUjFW2QuC&0rbsKuz>lAy5;a%*1d%`;lG-T@ez*rWYrAjGY;D#B8vAa%T1nr4@3dtA z&gYNaV>u6NB8h(k2(wlL5b(aQMPkK!dp0O6$Z{8cyTkSykp(81P1HjMy9!x==ERH` z4tK;=sXJ{>E>_(SjPE&B!^kNmsApSWa@;xm%4f&SqaT@7?p(U-y>l+9G%&3%b+;{g9rF)F|g zW~+KAaAuN~zTml@f^3C=d_#pF1Mjbyi;9X^xw&->3>nRCTo6InEe7P_z_Aghl!93n zXNmsv%inq~c&k65ttJ)YRX@w*b22nB1Mcx%t~*P-&`0Vg7*V<NdqGT zyj@^Vk1}ca><270NBa=L9Pz!d@%O7g6c*f~a|D%#D=O4kCLn;ul*ni5xlTC+T%1pY z9}Osf*vQqrtb1rlmwY|iy(!W__bVxoyxUgkybf?(o#p=JJMt7(RpG3=g3gVx`n^V5 zYA%hN6ifD3RPZ>R>=J)2E+1SLxe}%P_jwMw~=5)2gYufDN z695n@01yD+z!3Pt3W2c}=H^210oGIz@T=>k(K4aAnVFeXL=^&tIOZ35WRMre+lSA2 z!LlY8P7hmm2!$d6fxgRZh|HFg`ml9-O z%DXXaA6Y^L`WI9#!6pL)fh}1`8u(uzy7y-|ogR`i8*kU>zclZs2`{jY|65OpR`3bo zO8$phqyGQac^*N1c|(8y5cqMds%dm3g8I!_<6ngTU%c8=Md3ASw4&=)uiv60N7w(m zr00FJ3kz?Lgb<}~|0Uif82pBXvN%fi;Dvl_*Hs-E1N@f_g<2$0U3Q6r821TO>ANqG z>J#{!T{9LjRx_{ve{hJ`Iha=c!;iK0&UnDZaktxi3$tyc_p8bvYxg&=1LlE1+-%!t zs@y!fO#&=D&fl0Bn0o9|OQwWrYBb**73Ee9df)?QMTnH}iNn_{liB&M_j4x4)ApO;Biw&0&bCU%W8R?# z+ID2Jba{wuROsO9Mf42Vu8O*o8YBuvl_HuX+7^0JazeXWbi zIf6#85V7NW`{w(6YhrtQJKB-{@2#Hhf+}XtMdfJ+j*nsyyWa!GqwUY;m^bg}$sB5E zjoAsNLJthhQg@!N4%IyZ=$`vW`ej_#-t7EU#h)BHy(-LZuQCc%)s??^l~kCKD0<*`FD9UHvcyby`!opzF>-HA@{{i%;(!4O(vwWLc zG9LWNk`u)L|6GbsBN7}@G8(=RbB$@V4DpwbYS|{Q^D&^FYxU}(c8c73J}Gl z||qBe|qE3(dita5dcggHDd69rWRIjq{@rzT$XcQ21?Rp0+| z&^{3{d`Vp~EW{5>E>1_maShkj+tte0^RR7VJ|OR@d-oV|_JYe$#*8WHv3yqsW7K{e z`sv2f=vUDBqw=t+*>V6f&;o{yih6qf?0kvsZ>=|z)n}sK`#cSYW~n@PUyRS}E+PD{ zF$`w70J%3w!dYQ=tIoW_Ff6y3pYH=-EJ}UBKSt9TO>4S+`nCjfrY1<+YUWP%lNrr6 zE#RF~d0dcphc3toio_f2Yslpf8~W)^X4r6qKxFc}&V`oZ#2d&{^bW2*!#5X>!?rN< zjZ#}BEe~Xd8^{yuPi4c(5ye=h4P4xk-wpOwqDD0P8#(M&KQA0B?g(-`8gvK02J1ODX=wZ@zogyz%4WUvS>SZQDegR!=F>z?kehp?{IrP} za@C@4Cg-6_a^;mrH3Mn&@xYV!TeX?x{k8=z+sEG!Fuu!6Q?wfsBbO;G{0(bSxE=Kf z{7D2tm6>pX7#7-874eGWDL&=yQ}pD8EHT^?!8-*rys zVl0iV+@n%}@e(1HVFcJqnKe;f_uMJX)bR{q$OuRMu}q@-Nx1H`*`A&NN@H!K+N;Mg zV)|UK+q`G;r*f8RMQi@#mBT+n80FP59HpoBGPq<$>PQ10!*`+Z2Pz!H2n2B4acep3 z-g32YzMFLA>htGLb$wx$2!FBmr-JzPQ?U}#N93x*odp)!G=|2Y-3HmeqVWjs zAE>y?8dkXu-BDr7Y^qg8OjPXlp}#+Mq6tUE`o@zJ$P@VjX#YG5ETS08xXxXFt>BE$ zYIlNbT%!Oa)u)wGN7(~^4>{@kY}Z~4K+h7{mDm;g3~dPAC&agmw7HeZ84qB!UNgG! z2x2F$bbL%v2tk7U4;t7N_iHs?&;vxR*gerGSF2A)@k=Xz(pqYkNg>oHDbp=~de~GA z`-VKq$UaY`n<8t6kFTJpym5heCE%Q~JncbNFwi91A2Qgvu;L8~I`!UERPGw6CIvtE z;!iUMHKDVkj}S}VSH1*K8Ot=!K1!QQQS~pNhWIpD?p%*5PPLI|g>avh>VFm{&}?AF zI)U#m>h1b|hif^j#=_ z7nI{;ymt?NKs{XiVf5y4eUpS~IZ81DemKtE$VhkdSl2j))x*Xw`80v;{k6$w*jhsb zX)OGEhsEK8MO_J0%pgIfbp^y6R;Q_(2IAmQ{q@5!s?XpFYgx3?;jrYFFE?b8_f;=t zq;qNi;KBOpdeEa~PwHM{6v2647iqkFJ}i>;QMIlm^^2i)l#5-@4XA!7Q1ca1c-wJ! z=xI6H=e1qKHiU}})1q`}-BU1btYCe|&WYx;Aua|vL3T~M4;4_duX|5|@Wdh|ILb3n zF3gyhklpG;#+I1xHdewTsGlv)>T>c;Mu%MwVf^z~i_twRL6L~vGF#0@g&-oyeulCH zHQboRXUkP}V~0!0bR+czsmRr}PRqaeHW?QgtAyAf{pUIDjr^q556>QCkoc~s{EowV zD~d@vWN1q+ZbQJ*KwY-h_!ZaCaPS9W*=6qBRTR#lVa1t~?Qu%w*u{#A+c@fmDCegY ziZgmX50?8kPjs#7SLjYs1bX%H6u~sGi34ad%y!PeG#PPuWGwjy zWfDPrR|`fGbf*@q;D_nYr4O`Hu=a>NdzT}+#@5CSa_yDLIm{WDl)=tD_-G}G*UOv8 z#BAv-s&r+(5}UyV9)nPaz10jE0*?sy^ntue8AV4*sDmpxO1P!a$IldtzM}3}A%7{e z%^|}e(~sEp1w4qq~t*scivJ@{A-J5mQe_hMn$y>MFR+I`2k?XrKd#M0QH1^$YwZ$Q-Lf<0~pdWX;FI%3@&hHiON^do;? zJzX3(_{X5@owFWFFLzgA>4d`6Nt=X*JC8WJOWP7nnbYw%N!XOI&)N0Dk{e?1(MO~l zuPP7vE!OPSBcC+S3un{_^ZY7&GVpiftur2&xflx+x~l7n@%I_jx7Ke66@U%eU;IW` zC+CUvrxyvD>~UZ%YmyY7>h8Z|*rIIzp@NrrSTV<)|DikD#f+TWM+OK zKEb$u)SlM!LTss=hn-xeXBX&N^!`iNH@=1dKj$!1C$#-ny9{igQiAOO(17@5o{aYllf6G|s8Lot;irTO?o2Rd$VY z;v^}1;Op|Xe>bd8em8wDZ}ylU3tM~*5Y$hOj>;ySxQ`f-OjTdKiIXGCn_FW6XX!mq zo*90^z_^L!XdoN3V;^pY_$NC7LsHisQ4Z}ci^}7|hp}$Ri1L9((*9y4{?f(c7~E-h zX82_-eZVs54<_smvbNpwY7crE_q_pnT<%ITN+*4cZrh&r9ae--G$3I}RX1c$x$O4- zpUXSQc%p!&DFTXBe7<=04yqsvpNjR1Z60>Q;5y%8A%(bnWJ&@Vqs|08{NcnU5*HjP~L>ZkG z^_zveBF$jJ(nm5k^rO2)G?$u?-gcZDx9^No@3(z z#3>8#&Kh!Ge|MwsVIBcu06}IF8VRW(u|Ap%n|{6$8Yz*)DL46rf0sx040`|W`gJME zsV6Li#Cq6;-2-m(m&JqD-TkfaB%e-#BI*8TCou|;$&cb;sfb}OwdudY_`6d&+){s) zAa7q7+kUF-U<)0ON=LCjvIsVe7Ac*P%3_RWusSc9qH0!mSltN3de-V2oFs2qCsfw% zi1wU&a=aybzA8*!wElP}B7MBAZt-?!AZH-;asP6po=Lc@KkM|Ko>TRo^8E3f59bUW z|6&&tdJb^shE3!22tUEj8Gm+oP97K9AMM6d4(#Vg zBUX`^{V2$wBo`DePH6F^pNEeSKq#mXaV~lmb1q#L3%=`Iv$%A#-lzRj-l+TJ8I|dM zhy6NlpeY4&SHE*3^vLo*HxMc%jzt`KcJ(E?R zxtg-sU#xwDuKa?S$s*zo<$utToJ5zj-+vaTqAISa7AHvA@X&%>Yo*@16VBS8?~I6a zlAQb;ehc%>mAONtFm3Nicu=3aH=I|77!v+m{~d(z@|#&s*KmXTMRdH#w;2?z4QO+g zlR}x_jPeVEYLw!jzxMK_h)!RcAB1z2AkgCRskf4l{qtS~6d=cQ8Xg#KDxEft>A$$c z-(3FCJ4w=Uw(a-YfKZ*P(B?M4-~Z*MlEy;~!vByvvy%gr23a?1?#}UjiYAh>$UmG+ z!Qz1@jI2J{zqDxU@GcXfAcz5uOCy@Y3ucnWervtRKU?s=3vHj?9a4Ipe`Db%Cuyt` zP<=9ZU%P79KARPV-VYql1=qr-_E~bR&$muW7V{$yJCrN={*A+R1T>rU_qRjiqpPT) z->8pNXvi1S=#Es3%i5h=#J!vvWq9GzoTpfCp!=85h5Zl=GIZX!6D|UoyWH8=HgFTM zV(NP*BI)m8zqyE$1v6J)#ZQ z%T(gQKfN|6cadMBx@lqwX&0<5Ehxtnu`vVxmzCPfsn|(tNK5gNbHde6wAlZTl9&3& zlI@Nh?VF%owK({wrZge&ONbHjF}k#AS0}B@>jkD?T7YbwC5$Z1r9wU{^^vEc z`J#dAfIX=F?fI|H8uR-t<9}-iB1Is)`|f(Ze7+R=ty7X#jFu)wkPXG+bHCXW*m$IY z*~bImQr794KP@;RgnZ?5OR%}1NnvXJf(`uZ7f?ex(7L=U6`_s-UMy)24ANNYc?%!G zBK#M`n-&9JAn+X9vU608IExR!8(&66fm9 ziTLxd(`L*SYBQJ+xVFT%H2le3i>MhBS={@l>MMYVhp-1c&Rb3^N6g;dUi5|+US3`> zzE6i^Zc};Pa}>nq@fEW%uQ5U zOtkI}`pX}LoO}146Gr9t_{Q`4PsLZ#h*+s7@l|PsCf-J+{4%#KOh>Y|vn#N4%B^f@K&+m8=BKZ}A!PI% ztr_MNPI9lo14lx_lW_$l>#jVviAPkqP`WB{aSJO0D9^RhMn>7)P-s@I#T0S}?7n2t zS5{UQ6&qVRjmKuZ&CAVtp;|H?x~Vv;*GsjA@O8ZJQz4hlPYl9oVwlqkLDWJt^sJ}=w;aoo;32;8N`ijS!DH^7Kh}Z%>J?Uz1fSfp zC;HWQ{@_$UZ(M9rq+QRfzrBoxZTivl`76bLxd3JaPSLs%ci5!`(*>LmFo*^16Gv@u zM~4WBh_4{<^A6~6tCIq0mg%ym21UR?m-{eyGKj?!XD>dHCG1?oM~>bp^LXB-rtOo9NG z4O;^07onlAEYB4;YkEMOml1W^IE>Oj0-=Jfha*)qwL=HxM(ws=#Ea6#LU8=wK@I2D zS1%?Em+9!Wfw=jLH0b#L*~7yFzJP#0a!Lvq)C+_nKc^BdJrgc$!K`rJEa!xS{>^HXqK>wu~``#?m#HF}svOQG%T{RfL=X7IcH_kQem=k=b zD~^+klf(o!B?!mTC(aQ;L^Dr zjnc*GeVyYxh#-KzOC_Nz2I7WGN=h;@GkX@#DSJ^s7P|7fb0goh8tw;d1^ZXo{o&>9 zxcVxElIVTuwf?Xn>n&tV?a#LQ{&GY0ke_`NyFi_pzPa@_y!;AaF3Z7gH?YyN+rk|O zl#pBK9j(p>+a|f|#A)kDb4LUUrmGZ*3LOw_of?HO?Lkxd zS1vhaeAXkwYqoYFZw{`lE`JngexP}ivenPVye{X5!~rMR=q)O>Bc+M^Bf`RxF!qMm zL$&hV`?-7B&%K4y(1+g`$*xz$gFCeXE@68ZA+2|m?+)HB);US3s=if(-T%=1&{z!{ zl&mm5+U}^!A6rZ2wIi@tna!KMPLGfvUvAIW&V(=cUi7btA2>^&e-{P1Ukt*P@mf2OhHzN%Ui`)12{VePiGp5BA*xHiM zdb!W_9xr=7sj8>|EHAHePV2HV6&+Roh;(xDB@dGEl5b;&N#nhP=*U4q{bOU&vd?b> z042rv5oGTS_x+xnjtO%A9)}2GV%ug|1A_ArKst4{SRi``*Ir$<{16yrAtxN*-2XrU z7Y}!QU=Wv;MMI_G;O6eh6!PMltf(nB13=M%!#}FugWi83O6htG*Z#7*(=mJZo2Wfm z(jWgEfc5)3f=q++GQ%7;`m?_x8uNI(4SP<$W(S7!uV~qJ@Ys^${syot5sP8s_3VOR zF+`Mg9eWNx3{X^5l>PX|wj)aeVNq(`t7cm2co2Q_l4MY!>Ghck9}gKc8A_Z9X*q^!j=m@ppDMb=lKY!8WumU>`3z z^gB~ewCL%(~eCq&6t5z;I?MyfFID4(agzP1Je zx>B-68l_2?yqvO*PFQU%*RS#*J+o^#B>J9FQJ7{?4>E#Jgv(y?$z6R;NG(%ceeH5M zMdDBtl4?gLE}p!%mxC@!Ps3DH{C*9{1A%%`7R6a(iYp$9M4+M3Us9~PP|#S77leoQ zTp>-0;c(?)`XTn}C-E#{FH_8Xr<5U8-qscq3wvKxMv}^7tkC)wBt}>L?&)WA#+aR* z{itt4u~=o<9KSHL#h<+(Uv5d-+}!@XJdF8jV8H$J;m3F_^=!FvBw6gv6gVs(u7>k% zO|`xKiNRZkMXrfeKaK4UT6SCz5fU+RY6yK9Udo4{_4QA}2hf;-&MU%eHAE4>5tS~@ za2=KSeWgIdFXu^0J~X$k$w(V8a-r8rY`<7pF>!q!exPK#lMx05AI#+jhq*pn9mMi| zk;(l4IN0KPBWMiy`PUOmSnglGT$}Cu8U`d>+PzqIvRo3e`iW+{cOM@Ezl*i?DZ>St zG?VJnR|7OkRM`(w6$Wi*k1^)oj)jB%o;(*3S-%>v{pIH!f8}UoI1XCZ?-~2#8cLOklqxhOaRHs*{%s!v%(4 z8+0jT0$?!PMMsAB1_<2PKNQe2y?P~eLfICWI7@N@r)0Xb_K)9Pd{mp9oLt-84Z#x< zN=`}j$2qnVMHN$Vcq1n-ADdYoXm#W)6?rG(@WZtw8hcJyTT+*9UeE#8;mtrmQUb0H z$#gxNv#zZN-`~NFN`a(&VPj$h@(KM$03Jfs@FiXvWcXoHhbAY(qqNH_$Te&JyR*W9m)M~AxL9i&)b^j(I z0R$07LsN1gQ_~)}B+F4+Ncj@r7CR(z?SzG>2d2iyW^-8ZSR9iF2}NFR{9fBZFWY@b z04yG5-+K#E(leZQygAa>3#s=9>5IL0!?S$U_*KV;Ak*{5#43asAccMjM%kzhvx(pS z{#3w4a6v^(%oHovw8dRgT&!%6CSI}s#b zB&;|Ei#YHuUAVUlMMOS*Hb(`9n#S5-)ZkWBOFB->{#)wovu)j!&V?FTNta%cwo=Tk zZ`m1>1XWwH>d|;yKx8iK2TT>^aujt<1Pu+2@u@B=PL#Fb%!9&0q~75}?1$Mk5k$OD zq{QAJnJEsLB8*T81aUe#b@e1ZZEbBD5fMWZwC{mMuN=?Ml~oL$|2>s}%88JJIRcvt ztk*)Y#7t#BLL6Pgm?)rmVK)x~^-~HEMuDm`(z)6t<}=7O#TdJW17D6kvUi4Mq&jkjK7deErn3(7sKj;%G`zkGXWJsQC$L)Q6T}YY4~$ z<3{8y>1z9=zAtt0xS?Dw9wGdSJpZUg*FWqCIQQgKL$9J@sW7>`QOvVcK%!hCB`TIXl*6m+uK`D zgY(!xj#P~dsKW5_W^h+jx9`@a*g(s;Eib9XlhEiG~Ifh|quT}d53>-y1Qiz-`)5k{v!-Awy1HH^QrA^giJ9869qKelB|vsMim0=m z3a;SJcS7W@cStO4wGOSCh9MCCAHRz+lM|GrN!MyS@dS7S&%bUedXHEpCD#c}o)M{H-gC z>o+dcN{(O8RDWHjruwRhE<6s|xgCv*O=I9>@VD!~-H!D5$w7zcw6oG3bp-wE)>_Z< z3wYzUih}<1Z5j((UeY~zy*|^2!s==QxsBCC^pP*nW;C&rAkUYczDH*vD=`S5zFAva zuN@v@Vq;_P?(O}V$dwKW3F(Yu)QRXc#{m(fz(!||5C9543nF4S5m9bH>K*p^wxJB{ z>Vi&lX4?>(dwWSnDf-=0Ev%!m8jl`mlagY~+PnNmZYKs69*bkkQE>51bd(g=ECSj7 zLD%Fk>a#Wf4{GA#IEaXV-JMfhjrR?Qcz4gikAVT0#DXQ1uoF$C`dO^?kbS4_uezs) zG4t~B3X4mp8^j-4M2JWr2{yN&BGak=X^^G>T5(iJb(fC zJvkYbC}|Nxsh=HgVQCq5w$T?iIhktZo>5xx*gAj$iXa`GKI_riCY>T8AJXJ8Us-%E z>RZNR+tRqJBeL>4O;AhOFGvX302!j?FO3hkC)0s1Ocj4kY;^n@93*wx@qu`70zoWx z5Aduu&S<;lemMMMic4tn0g_l>o4wqyPP=bO7lPuCz|#L4Aq>5owuE{ReUPXJU(C0B zckl;WWi@I`n13Plq$e%Q4c6A7n6BIjokHs9N%UqMgN>)Ch(%7u&c=lF_Y~RHsq~7u zVK39h<~EVQz-N!fn~15s;UkY9yPu!v<$6yAZIBBTkLQ(?tns-{*VK&7xIH*X8~9SD z@mMq<>R3rrT-{vMyk_INeW=-(Gb}1Cl@Q91MHNdK=muiMfymLoe2lLYwH9hMr8F&I zecA&?1w7A!*iDYM_8_$W28<)?8to|+zsk@P>Wt^?)*diV$v>n0GJPQ(Gs5d|eOoqt zLJEW~u zkU+9jdb*5^OEj$^X){og4YlD+3CgDi$H&Lx;NU$o#3SL zQgLk|=G+Df?31NE=kmNXpQtIYK|VfQsENXbFEX*SGXi0!Mh~O$S0m_p*T_c8RPg@J zuZW?ck!^(!SfpGb5tq*Oc6Q4&Uq&eWB$w*DySwLAjRx61sh8Oq0$Q}czu(*&U6Cc~ zWVqUm=#?M&JMGq%ri-r7rwfWE{S({c+tZY|zPlUCF}8M_(c7WKQH}f$q_l~zGj#2i zh#0WMhAy)C7C3KTuO#ZD`|>{QB0+%u9N4!O#0seUJxW$|^x{pX-GJcHTV zhx5bHk~*Gf@Vgtnr1J;Zd{j=C0AimI+bw%y>!TpweFe?_v503IWywrfM;6uA*49TB z777FfAC%oI&%V%7AmD1mOKK!nHgyDHbHS-oyseGmm1yxPyiA!J5sQl4l1cLcwP8K} z#IA0Psbo)hz@y$pn~0TAp{F6NsT!|s<=b?RMO;yF^!seJ7qDvABl?c(8Y(~KZ_n=H zQuRf5C^H5|2mUm9xKyxsy1=|A*xr7p3s%IXJRCdhqk2*Cy3A{?f01Ls@1U)>>-2@&Vr4%#0Ayxs*fLAS?;;Q*9B zMjMKx%j0zi1Y{yNt6l>(>X*F}iyK-y&=L{#d_f*H!KVseP8)iZfsv83#@i0P^|^N# z*;l(Aa^ezCDK%yZoQj6uGHHPZI9$HcjnoSOXs#Cbq(7yjwc^c*SD*?M<2Sgrd$8 zEa)DD;a#X8#UkNjsMVB+N6W-mT2u9Rgz!N0jOQ6YjOxkC<+6WN) zi_sLRGDMCgGfohzsZ)Sj467+8!$av;O->NAZ>&BC#nb%J2gs|Pb5pVBh|QOjlSG2HU;DIVt?D7FxnnAElf5Hs(wbNK;M$85#L|*oa58(yZF$ags!Px$E!f|fkt(LZk#dp*? zyN4ntyxIj*PC$Bn-3=|i>g*Sr+9-c}Bj}ri%Vq_8tG$W?A=^jl>bHtGnY_ z*nI6Ruho>$?Ajcq8thct6= zC;;Z3MN(&NNWq^uV6oI)U|L9ve|oXF~$w1}be?v&l_Bb{&X)@~o=0=l};nmjiGKwLF>m#udF zVj+A1ZTCACNOT!K@**sWsED1_x{3-pRDw2E9qmCS_t*_rVsstaq(617_=A9L-EhmJ zfNS2cY6P>96FllNY6T*-KzOOpRowt3^dON2dRr$uYt#Y}pncA_ttvvlm&P%Lz5h_q zF8DbAS?kfNg7P$v6x<^+X!4GFXd)UsmW8OiB-=sM@{Ebg5leIt&h4`w08}oM8olpt zI2m?3v*+o<2_|JjO60-{q^D0Fw81DPtI64)sxe~;H}q0?VUqE)vT(cHMT@q$l1k90 zYDn!fc${~ufQ?OZcdpl@10&|2+hqks?GH`BS<-%b#l4`LQH5CMvf+bx@Qn;HsGA;f z6B1q|=%Pl2wCpa!_v4e2)YNT%&50MB^AKrG%643-K#x`N{t87#hpd6hc?8}N4P#tM z``L(kPj}s6Sn~Q-V~DH?=i{Vv@`&ksx^?$Ic}b*jPc*SF>L{j$o1_S`Qxk>Up#R>2 zA!-F;PjJTVipFejqqg+)5^rEDfa||!*+?~ZCP%$6}D(qF<`U% zpL@%YLejx8dMd-2Lb|ticPdX~8L$4mZd!sAG(Zr*3|pa5_-~c6UH?ag{c#X_EhLvn zn84?^DVv@U!coiIiK7o=jXz)BHOv3=grH5@H5SzHo^@L9OV2h{Ef4wM$?X|G=f4&* zbbfiux1T-~vA2|#=Z80ziw^g_UefmuSeccl172RR=UW9s$a(EK>6R6hHcN+FI%;|f z6DW*`erRXwZJq%l#~+wTh(^}qO|>sLJVGkgxMQ`B#P`u@k|Fd6nuNe%z04oo-SCn1 zhuz6))RNcDiCa;HCS&R(5^GAsh_Ps9x?f4(x^P_V5ZRkQ^#`1p5)DpNpb7@RokHlJ zqBTXqn?nrR1Mm8!=0YADkF6`Bv`ZmgAQP6uS|=FvUGNd+cUdL9uV;34;|Bi|ds`AI zHBq6nQ1$yg5k5z+uTR|s(@!)&lsa#&Hq});r?1H>Fvg8{EveVb0hT;bdvhhR(XdD_ zZ#$W83(4O%n_pONi<$1D9|5tZ2+fzFx}VpTDZujC-;(xJMhnv({6YcWE}Oqlut0DG z-mu+=c5iA4p|d(KH*l7rQ~Obi2*zyb0bOm|TWWEOOM%c|)Q7@^q}I2#Bpn>y$Zz}5 z30fl9wx_)Fy#=p~`h3*%^`Fa<0-w%xi+zMYQ7Hwwa9B=1{eXV9JDcy1W!rki7=3n8 zjLmz#!H7xW89iUS7tY{;t(eB6AR#67)~FMR-~|pDcnE5 z{7G-I?zp?~s~HVj#BH%3MIOR5;~dvffV_ZfJ-;G_sC;JREf>Im+X^k_GNFh4Fycv* z<#QcXfvQUZFP~)_2ANUr>A)dG50?`n9n!vCde$!ArlXlAc8VmwZG%7O+(N|8&hCgY z`Gy#iGMvCHkfQlB=Iy3aCb%?#u=SF^ljq#->BeuKCJNW=>LU>`|0U(bT|Elu_Pl0H zZ=daONpU|q%jj*w1RH;^Q-=L}0ywash)?vqe$vu^43^Z}P|b2Peh2b-(9bJEE0llK zlIBJP`m)d`1oc05sHoKCEeG%{SNDe8_B=9hZW=dnW~RsY`CBHJAM;7xLE_pEySOub z4hyfr-uy4^k1IoWZ0$0BPvIA?!&AxvYks(Pv*|U`lS25&SUIP8>_nim==Do}e(zFC z!Fx5^`c@z3Nfkt0&J5G1&nNv>-7cQqU776iG)V%r^v}KT|gu!6xL&9HYEc0p~Tcy>$rUn2L29a@&u|%E4LA~&SH;>1ihx5TQ z0feqE`h2e-%l(kgo)Lyk&MOMQZ@l(vkbM8ci9SkPiy{)t_9x0mZzrn|zl2tdmNyB( zH7*xK-F49x&ipYow@`77V?Uq69A*l08{-@XD}>{;yJ`+3B+xVtoY^AShM};R(U)_XTWk5(+6jC%sxiyQOQR)bj$*!XkNB> zNpLOmS%=B_mp{*L51c;+b}}RNVhfKS!nJz*`a&tpz#k4WYwZ6dLbO45`Q8Ugxl62y zZ?^=7JBPZi!fTL!j#ZN&=vpf8O{gkNeU-wb&^^(dJ9t-iHt$7!R;cjE;8u2DDv-oS z21#Uwi9^^FP5K}Rsk2DS-;+OX_?-Hj_lQ8TGTmUQ0qh>B?TY-RO$ zrQk+tf1hwB=K7e_y`Jw20f7Y{AOdH8tG;(lPt_%i2ulu(Fr_R_HOQz3$NAQ;?;cAM zH_zR0h>2wYknHj4X`tOc^~dD!_HnB8KmEDFO@!a2I0g3oyW{uLi-q)|;cP>@G>I}B zABbinK0NSx;sg=pIS?vUVbNMUjk&(qXMcHWcl|w1;#(7G4u;13|ehpHmqnZNX=q zBB+hD>-=r+inz745UKRNQE}3;2zb$?&(y5X@RRtW z{cliQCsVuO@bp2y;1Q%&JFc*Nz~1fd(DAKe$o^#o0t~#6u-Q1ArRO4T*gtm3n+)n# zv@jDG%A?Q<6bjjQs+~?}4cF9*k3Zc{FpVOTsJ{jY>kRRH&0N2FcZs;S(-Ufz zUDtv>6}&n-JELJ_Pgq{odvWsiJbaQO7d9I1uZxhzxl>*p#$(K>40V8U*9jrnJMW?e zqV)y}egk!{ohxu85Io27`{~5-6{mqA@SPnc7w*M-hj7y>4dI7J8tC)oR68M3gWf;U3F=-fZ+qR0Wl{@-9K3 z5fG;x=5J6Hc!hujtRefXI~URLyOT9aNLMO$#U^S7CkM$JW=J3})qLA-A{$vgN$pKc z_FVC_qORlHZXc#l?UyR?mD(V*^Z!2i9S^G4fox_f&kJN*3mp#8CQp^=d@)9wLYXBCcJaVysAP+J5L>mMGvdzF2OoUyu3 z3U4?Wc6_#Sr$bY(S*WQ+MQ7|r0Ej~fmbvuSqZ)PU0B!1kVjW8RZKFaD^_vhDs;CO- z4FT_;5;R&~hU8Eu>wB}m1Itps{S}noEWo7K^ITg=7`}wV(RJ6(jy=bYoD5T~A03}r zs}>kfkeVs%&|f=ozIU2@6i9js;=hN&eR>RhqQqhUasd{gZ61yOMQpGtC@d=tK(Db< z!Sf!>FBG?o25yXVwfuf`dEv&5;~%%;Lkz!0IH3#-FH85W1j{T^fjc{SC=c99^6FP0 z`%CmP^2{tOub4((0@;k?=;t=h*id+E?%)4iRjTNp3aI&*X48*1IbmbMgo%7a0y>o9 zQX#lEi^wl${n}R@^fCUKPdt3EAv6!DAdBl}B_&L!T6uxiC6z2PB!-HUCOd}IJTQfD zZPwvbN<8P21Iw#EFKD;k<8 z5>Sc$qwcp(J?&6QROacPkR%xo9lkO0`qz&c+&{Y$ckBlH5^pNZ{;{n7oU~FJ{oP7K z3o#Mit1*36RayQ~>-m$h8TVF&s`%p)y6z;VsQk}W639^KelEP=>vK^uYUHs3m^#%H zJ1a9iZ@*~pb5G>ePp9Vl(HHNb;?hw}o^7jJC*!enVf>tHMcN>jAtezJkxNe@qI0#P z!pc0c+Q{AcbyYu7aeb*jswq4+sq^PO{Hy6tz_b80;yB%_em8$}a1%j!)N}*w3AxLs ze6nLM6^C~5UkYI^NOOFl%BlVNZSp%_pG}>Cm4WtUzRZGKHx10|W?%BeppBS{v)4f= zU*Y9Oz9NGO6!&j|K9OJ=F)&+_f~1a4>c=|E1Q{6_9147V$-Zuh*q9h<%`zQ&zy~J? z^CKc6Qq$8rR834t8Ca+>CWM*9k zB|;cK#j1gUJ6KYag(xAgkf^Ci_4*Q)yxLIILxwc-6PPOoQOk2>;G< zMHx4eZ#>!g4Ub=LnXZI%h@)AsH5TiVKOALH_{n<4vzGp@bk+{-`{0pl>8PeV5q zusOI--b^T*?do0AVUZhhXSiJX!Q9u%>`(k|s3zv`kqlw-7U?5^jual;_uQK z%k+`^T1XogMA99@UBiv11KO8u%H0=zi=yN;-hp*~B5wUuz?;gdI=v>l{|m0JJ*T*Y ze0A994Rz>Zjq+5=L*%9}t~~Kbc#YCr`4XdMA!5doo{0%a$A&&QG=%n6VvYm+T8N^b z0x%BEJ)T26$F%@!P)4Laslf0-Age&1Vly=@DR9qyXD(GoH4n?(+*LzQGVHW0Lb@pDt@F6JT*oyD|c8uthi zoyiv7<+VM#CIQ8dCwweNjBP7?^2Arm=5I7r`!f{7I;T-7EW82!~ z_mf}c*5lU0Y2GnEpo;MTReUk-rQF(jTlf2mJeYq+p)a@Z*4U3NCY+EFm5Q6RCq7zu zeGY}{3p?-gM}(zaxW&7h(40Y>Lz~TCMr2yiglYvn7d?vz$0TZUlUf?30LB+INqn7xh9_!!LMw`G&B;aWh!1j@92@!Vp@Ni&zKoS-fMnXmg z7%E?ZQ<^0Sr!m)?gg+-1sOcmC>%zfjD!CsKg7tLD7uO`W2A>HD>#t-w!XHz?!>Bh$`V zo2`N%gVrP0M9QkXHHD+eXHIl#kXazNCdozgn@=!1&6U;zXAJr1#J6VR4;aK`u!|)M)D^2C5{3S>^v{uT)bNju6jbBJagiA5sKzYU<Ci!#!@0lyu=ypgJg}2;=^2m)E5X!!dFSxQZn#a_ zSi9~1HNU>yhI;;%{~G%&DaUF;7m<|}rMt^mGBcerJq&{@18g2rdDG1YgzkgGd*07Q zb?odGQOTOSQ2<%W0Hjh;@i~wV`XejhIl9fl1TvHd!1F#NV!XCQ&Q|&+^1wFz`dA_V z?Y)G%>Fd91SmHNZvc3Xiqmze7jw@hTiEf?lcHQ8|KxwfD|65BzWxRcU5_=I{X}#%Ja@oyRd7#@6J7! zYVDu~Q;qxUt1&S+VPRqW*1Eu?W)3yq&^PKadI!$eWAXjNU;4_F^_eCsghpZq2cCh@ z#pgDURQGtGwSEWM9+X38C1iHy2W<0&%yTs~b#={8)!~nTwJukxNx8dBQi8MlBCw-$ zW*eU2R;KVs#!n`r|GhaG>&UFps({r0pQg^hil=;SvRW4uNIv(2sQf4Ssw|*%9-mI) z(4Iff2i7psR8KMSU54gV!)O}w0uh~xH&>azX<%50IrgF&lBds^R-zmpDgVggbMU;9 z^?;hcm{Iea&iLBPGeOv2-0#MNkmLw_9b}D~1A=w~7sG5?NPG~!z5d$m{GoHKZ;Ad{ zVRqrS(kU|;#cBl%+dCTRI1-S3#xsys)k(xqzsO>!p9^7jb|uK3;9<1&DQNZcdIz62 zpgBT953Qj07py%d+O|u9$US&CIHCpy2H}F3hdsf4;Y5jkdMEJdaaXJyEAM!7Hx0K4 zDLOvBdK+E<)#$u8kta7@YZmB3XpDHI;~6_IM+ji;Ym?`@FLX>g&vh#d~yWD$q~FdueP` zTzRz6Bp%ru(5Hl$DTK@W>Xj@=Jqt~_Y!}d9GrpFq!Qm@^3aZAsSkn4JTvwi~8K@Ggtz=k^xGy;P zHVYQ&ioy|f*GGJ|JhB1$_`NA}awCtpnbckp%fDE>12Y3lki>@Ur~6j$OllNNfb-Mt zM~A~p;b8FYWKOg+!0sXEh=S6|_~Cs@nl7zPY6#K>y|#z}vesA*ewknqhNwN+(cPyC zcV8aM7TGZ|p(CqNl00C4Z}Os|aPu9Cioa-uE7?FJiqY(aABQL?Do60l+XxCR5z?{Y zj?(rqzj7JD?}+|R5Wm1j<9p8TUP}y7!={|RzP>L2s=?gB+4=czAkB!=!mHPckK$c{ zPyg|_co#0fsmupo%&qVd=1$01SQOEn7@7cFxE`_xR@Oah zOD7Hy*IETXf25bCb%>UQ23QMFLvHlDo9OK-5s}qh7;hR#V_C`D zI282pZaprn<-WJKmHZ89(f-$ z(B6~dkb&D88mTp?(-Z+gYW08vG+Kz9Z8V|-tAC$1F}7cb;jKZ3v-Jg)f6W=aGT1j{ zTHjZlE}O|Sm_|8Jq&6b3<5-#KwpYSMO63LM_pbcN3aCqGeu_KEJ<%ck+a+b=iaH=W zSPH1q7zyBi57~+WVg-#mZ+7q(qn%!i(6j#LLC6G<()@FKg`SSVmXp^6pkiEern?(0 zl9#VBLGvF#)0s<#hCcGYR?OYiGC{4DGt5anofv;poB#fX_Ilq#O93K){?^)R;`@!A zMb&S3^{=r^&rj9Zh4XgNcS|gwQlE9c?Oso5-Ztje9|;S2fRZ`uY;G1*1N~eqmyT=l z(ESp&xj;t1a_MN2Xa-e%r=eml#+66yA{M?cct1~PYv@;Y4$Dx%5_Okol=pzPYp{I1 zJ}ygnk?i%0hq*Z6Hc8K*RHsgk7k~m8U>XJsdJibT0<%K&zD=` zWf7^H-Zz^6_5P$Lm7l55KFu3^YPqBb{!NaW;t^3DRjI&-0=cc=M>ygxB#^4lu=yWZ zD1a}hwh{kHr#3+*72g8%U+2!t@0#5NE_jvy`ip2S$S41P4B|h|q%ze1Z^3W>`k-Fo z$+Eove|0$hUsa=r2VfaoZd5N7`np3oQ?ITP&(hwtZ=O@XVb+$7kh`vize>92UDa`w z`|Il}L)3UAisKYlgk-bnJ7Z_k;VwibE3I}QYuqE1G?M`KUDlIuHH zs;~bDZoWjz{U}gudUw;ZmT2`S!_HWoNAL!FEaY_NgskV`0*ialjXuG#Y@%~8T5iD^ z1QVR%JOlDe(P))#o>pEn1L8LsOz(N6G#@5RIS5_@Q(ECUQOhImelp7Gfn! z(X_);=c|8?145QiF%}m4m1BDlj(!2YwSEew#g|{_rXqhc;7OeF8?R32p!h-?|=Ff@OP-De~_Z7c0e;TYoQ&ZI#*ZSf18nyG= z2&y_)H~ zVdrUWf)CSzcTXF}u>0<|_5EAw$2oo2#omo}0*o3Ey4#Zx78tlC#Qi)8NN?me{8-E7Rm zJNt?h%d;6Wd?SWgX+r`htzG@NanH=zCD?Cn*&{Kxrn1m=ti2N=mpIwH_T0|DUfg;kZwJ(r1}d9 zNsR;(lZ8RuI5c7r*V2v9C-;$5%`?A}^)U+k-sqb~)c7-9H}A?&I1OTMXk@r^JQfM@ z$bsDm(Ik>PA{6+7_IjDc~3aCf^{6?1NkY&JomSjR=1Hs~@| z9Ro(0gt=3npTnTIORrYX&G8{~+06I#IjKKQ;+fv=c=(79pwc$xS%;^?QE-e?snp|j zTlt^#t#7#*a*mE?!b+EAwWa+>F4%xi2Lb#G?D;;R?d*m#_u>^8jO>TO32JBjDU!h&NN(J<71TlwJZ2}T+Fxu5LcZ57#BYhvZ&cR zr1VXr+OXU>UoIyi|Kv8C9K&6<5b)jhPdyuBzUFCg8WPndjUjA>?K@UE?Yyg-ReGFK zYrPm1z$7+GLtm)+%nk`B?)bjpcXs}Hy{YehMyF$MsLT6a4gAN)*4Q2+;$--KPx_mi zmYx)}gtxmq-g{O_gjT9`rECH!?MefEMqTft3!%Y~rt;>zN8Vk|#o+g8%q{aXCr%)! zAM4%;SG`#ksChCk=))Zt=y@PpqJku$RN&3~`s$g2vImh`1>F;pYh3&ppnZzrzHQ*A zZh@&O1TRl~@KD`f>d^jM@KN$CL;NxQ}r3t)RyEb(Od!TA1eo&H2q?(vfe3G_!0qM;$o78?4hD?~6I zI@W%lKTG7asqe-WdaE+!=SWE}?I%$hEnmRD{QdpaUE1E zz2IRgSEB~vJ-@JJ)x6b*TQPAE+3!o>&B}4T0UP08kJd&j**9f)UPs95ii;Y37N1?q zu%l_dP^u@>=kK~JzR7yUNoDN!?00qhmn;-yBrRWcIs1a6diNtQ@!5sq!AAt?$2A@( z?<|6OPq&DWhSkciu3#qSVY7pVfkouDh;_UBbNezEuhIA=sa0M3zq*KxX3i0>zaL1F zD-E|X8K>XWnN@<$FyXJU!oGg1SNX$A?sGcQzT#zMTN8ZIWX7Rx%D<@ldSdtY(p0`a z*Ve=5J8zZ!W-qgPKT=*qXN3=#KdTtlwtkgJd??@@)wV`1v9ZN2k0wUytT5}?sD)R6 zx}C$Orjd*cZv|$PUE9^5#BY7Z)($o#e{u(nf-^w8D#`DQPS75`oh4jCO_$d$OJ{UH ziyz*Ul^*7EyZq4MLRCw!T~AoZk`5|5F(=~r9#>sZa8nfmZEKd zu4PU}q2Owo--Tq|MxT=@ZSMVOWWsEO54ZH5L3$B(BSZ)e> z=`Fz(-HAvJ5Kf0|TgJ2wo?z&>?g1>DM2Cs5Zt?9C7 z<#uOeTSy>g@cT-<+mQ>}ZPK}u>xh+l=-0@UJ{rvD&h6OazDUhY8&J+2eUtK6`peeN z6sr$37G$6lc3*jkmzUu=lD#Oqo`1m2-}L0?)}Rh}OMr&I)%diCT*E@2RsO33(YzL| zG7e-fexoZphDy^5w{*=K%kf$QMN!GQaiL$K)6$e;LMZk5ae0;hTu2t#@uxtfuEYu8 z?_9_bq^Upqk6%;y!I^)(q=NnzXMY(MN6_^T!h;1!0z@FVBm@cWZXrT&4Q_$p?#>_y1WyPa+}+&YeEQaX-BS)LhMYgg%(dBnq6LcWf*VNH9_#@KbP{2`Zf~u!?rMwk2<9pJ} zEy(3`%gVp6<$p_sHoS@GeSt-b-cnvKmXP3hrB8A*-9PAJv_f`zTKet#-qJtUBW3NR z=ncrNtmUsDKKo5NRh5V1cDGj0nV6v|*N>8|X~Cfb%xuq>_}!k{N&7X~6x&@gIUOi@ z8&ZF2I0{7E?C(yNvFE_aUyqP#3V2&&BEPj2e3J}VTafj|dvE#&V|O{9{btnS-B(H$ zUH}ZL1Vb@E6W>4a?C_S9Mnc}oq`!tF;QQT=!8?_9Koh@;_ z4B0&7bn-W1v;eXJBEK5R+|DgIyW54f+Znz*|L1_u29tNpHT3JlzS$7)7Vl7&sTaa- z2fQvNKPClqdcth!@42N5DCT2)pLQTzmqzJrI5?keK<9efJn>LJs_^_3msliX)dsQE zQ9*i<6eWVkCPwA#LV1QqP*6IweVl56sWAn!rc^#TN#P$rRGEHwzgW-lMhXYVn@3Gu zyqU}sunmj(FyiEke|$WKDb>zs92^;ijLFPWT24kILBlJ!% zKSC!$l*Phce=EM zSmjF{KDg4r0bVPi@aUPzBF4|1{POB&r9dX3u7@Nf;W=%ZzDcvm>B|N#?L;*0N*G0Q zokezk23UpteMhd&t9f~|vPcM)vCA~wGR*Zt;j1>?N2Fa*DIsJCAUd0EP;brHt!YSraoL!!uf2IoL9 zsF2IGQ=^=zTGI!;HsqQtTxU<9aVKet0p2ZdHbnn`F5K1sc?e+a+bQ>I3H#Pl2`Lm9E>oMm!6jTA z6ps*nYWRn%A%V{thNOted!$0~m93VCR`!XnSH%DL0?5h^H2wPdh1Mv}u zZ-mOX$Xl>LbB$Ipi^NoAmO$!dwi~Hr8#&VUX*I{8i`>=PIK=ezF!;seTBwQz=%8vI zb2gqG+qUMxv94*i@OBku@Z&gr=ABG9))?i)a5*msq$)F{e`rC8$8sr)BfXgU3#0Fo ztV`r+#c+LI^FE+k7onE$_m)ub>imMqqqY=DtdH5R69$~@k{`0>=H*Ui$*?WwIINbO zgR?bs0TA?!t-OGd2<4cH^?CvI{{EGbqToGkR_uT=U&^uVp2_w0mrE&exl3|qwpbLT z(=&&ic9R930#|x}b+AQZn)u@pF443H#6`mEqVyYrioO9B87T$#`@=Y6Iaxr^tqEZU zyGNXli2pn6`nvZ&W9??x%;oBnmF)b+aHf2{#km(VtC2Nu;(!)-=#{s_L^v*n$FN8y3k*4rGP-!#_pEa- z(Dg+F6;3af=PC;F^PN{0Nsd>87kW7LhLg{ousyo!5n2Yg0mC4?9fal|grui0KYh}~ z?i_()=USx2i!1?;+mQTK+l#U2q+x2>)!+}Dl{Rn;RE-nw6+v*}Vf__k@GDNxb*!v8= z_=lG0R=R?eDf6oObW)V|2^H1*j4;zmJWdHefBxBPq5@_@wV3?3;(7sHA1DHjmVd|9 z^5rnIIA@$e+k6I>AJmAHnE`Nxg|8el&J;|ahe_@rjvHNYQ^ZgP%T&T4ij4kg8$<;x zy{1OGlf75|nbz`S`NZh`El!9(TWoA>oRR;XwosxE%jNab!*Z6YvLa`uo-~YArdgF7I9KP4X0$VZk55kU4P*h^7QkfZ~ z_;$WR>0j2a!nDp7AS2H#k3STg{nOGK=&)Izchdk|i?TTopHIG`B&7oJ^S8>4)!#GC zhCkXVD*YCoT5J%&!m`>NM`Bs~VD<%sEPtgrWz?nI`Ax-;NJOE=lk0k%4nvVbu6O9d zX)3XDgWHhY)xyFz%(@)Xc1H*T*-opXlZ>>hlvCvGJcl$7>rLyRncMx?jxb#rKE6LH zK6_5x;>iH`iXuN`lrM|8z_zJVMUs_Ve-8U@rgOUX5IH|$qG{w8@U%x7Q3~oy8alO~zb*!8$*jZV;NxnyB?{jAH581Q z^%8}=M64?mZ)y*^n{MSEK$jCM!2Q|PUDC+whrX?CVK7_Kr`3&P0r}BWSd^qG@$KB;S|syymK?$r0Be-PN+c^~Y~NND>Z30?VCM{nVeE<`mGJ z%f~-4hAzFhR3@m4>zeN()zB~JFUU+BDshx5DAjV>9;9NB@tYq{=KOms!RtC!>n2Jx zU!O&Mhu-@^+ftGm`A%KfjVBGtWZ2y|9-Qvp4tX)B&>@pu3uKS-NA0$@^|SVM_v$G- zN-=BN2m@ApH%iF~h1-(X77XDPR}4PO<346)UT~AvEX)pSssY&8$P}+oz^+Ny=_cha&M!HWtWh56|OF zUBLrAStj!XiVx>r5RPW}(UwRcBeyba?Od0%jKH$4@bNZOh`o^SF4y?sLY2p;VFDXU zFX!fTfc_(Q0j2GpXv2uR>f(#z(aFkPQ#;&&6}_*-qmM)3>J~He9IYl#(a5LUt+~r@ zI(~QWrz<(qWO=+;Vb$WWcco1cMMbF7JhPy8D5{A%!)rV1yL~h$(YOu-o&mJ|`}xpR zC^=II1Qr zuZr#X%orFIwitHX?wGkrP8x__c-u;`09x}sURzVMOz;!4?N`~0bL)x8^2amRs`{Ee zD+JvXY^b;YQSTSUlQ={Xd&Ceja!%`7*h84ULs}$0lislG>jqX{inQx%6Ob=whCnD0sl5;MNzx~`9R2)IikFJ6qxBEb_2s!&-Ncb{#pLU;uik3^=OMF|#4uFxg zJ->B>l33YjNYLrwoc{@tnF>nrcJYH3Pg<7z2>_POk-K7h%+y)D+h(XcSIW#Cg`o4# zB;KY+V81KoK>vp&P^xbySq}J@TApW|;yP6)e4LOP)taP=cGLs|=K%^CezC&zVLFFWip5?Y1wiLxi@nbT_7oF|v=H$g z7qkP@Uq+`74p;Lk8qZf1)PI0Urm=-KWKTGOcqGRE+F3TU0Yf9<*;)}bm_y4vTCka{ zA|GfQrzD)hC>$L2-nr_3g$A{zv;Zgr|HmklyZ66Bdj8jo|0{;*|CLGS-pKU-FH}jt z8pD&zuh~)okmZjM|I?WM_&x^80LtDBJB|Nexqi9tSx5J<2;R)n2?Kjf*mDa$m``!j zhE0?LM(lsS^Zi6sN46vyAjtl9?BkABz0e4m*csMDU8r`72rA@;$)Fb25_h9texk?w z{0RN7Mj~dI+UVYv6uWJHf1cbL_)9YxpXlSOyt=$Z-S}*dn7r%Q+N}GC=IGUsfPYix zR@B;&gqF3hM`_Y&(x+B1AE-a0)O4cSw5Y2&RoaFVw4CCHAm)^uruZMd} zXl+YfR94@6GYlFv_L@R*fKN^!lZ2c?0M%FpKTbg*7j3}k40!j~m4Qp|6)~w9=--kl zY1&(**^;Wu2m%@(%oNe~fy$Q9h>i}ru2=LJeS`g9=9arZxIJA_+o%8<;@L49s%LmB z2@)wsr-GHd6!_xt90m|M|CAi{fyHOpyH-Y(nD|4dt-x>RgVY>D`IjpI34wUCZlH0* z2F-?_ZSJZ7TRH+!rX|kfG6y^?`<>n8TYfavX}25}H`&U^6Q?e`LoRGm4Lbbp>C)>V zgPa@<(*}b*_parmr;V|=w$s;M3B0a7A|%;7yBp)Cxn33Y@Qo+9Qhs(Q>WZD|=NptG z#>NwSU(hY7vo=m@7zL+l@$|nmxg2UWovbCs3wdt4l-27tppFck`jfevS(` z1S8&<%d4&0MeonPU_|hWs(^FP*DPQRju3UKFIj|D)rO{{JR={F2ZV&ftw>PO zi)gOsF(AEe(?*GHBRF<EW>iDqQ9R0^rlIjGeT=JikxkKL5r;r)n%f2(K0L zW8+&Ab(-hht;Fsc+QMJ!CboMsFoeF=VR8-0fB9~q5P*qLXt8&iZ+nTNnu5ua#@9ky z9tE7MfFFmGULp6B+?P$xL?Oe+xI+PqfNC5{ZCZw)#I&R=cU*VmX_sgZkXBWdpk5Ec zyJXKUoRhZB*UI_eX<}jwaHoWgzVC%o?C*#xepGUy3940?KYh{b%*cL%R(eN*&&@W# zY%pQkld!ebcCeVnAMr);25>`i#!vy!N^%J^?Vlg@+@0@D zevpy^1qKFEiMW2MX=IsAmtc2y+s#Di&Eolg@0OK(Vv@!jTW|KIjb84FOG1^IU0jci za`>i!7JvUv)fHaO97Lk1U*d*7B$_0x`N}~>v`isjPTXL~m+@EfXk&#Wa#2FS-y@y3 zy@4AcFb5bxRN`Y@@_H+xMrSLY3+}hRsnc}4oqG%9NB*k_p>-V}^=f;tS_A|vC~CQ_ zoqxA&xS)Qua5~v<$`%u2Jld}ooseSZtVj>c;BXey%{lym49`;i-Xw(bK+HrhfD%aT zi2yHnGdZA+`9V9qi;p|%BfZkIhk~4-hS>zSS9x8zR=gcvzi}U1Pv#j zsTLdaVl-C2s0VPDp68XE(#df4EXe1M0i0+@Xa2!Y59s0jDgRni*R^)eE@0SFMRk|~ zU0s;c@469tz3`sDDFF|_??vC&y6O2Nr3D5z=s~vYi%KabZAt$6mnWR0E4RI~2hB}H zpjlKUMu*eQFm3zxrH!a3+vQ31vtuITq(tdiM@bnk;7=caRn^4c%ts&BfR~a|Z+m2% zExtZEe1%CBZ%_{VH1_?O|HzwH=&vFH7+e?${~nA0kt=U&b{7L*KCBpXuZ2Ac#lu_M zbP%9_A#RMlMOytv$b}|+^y!OR@q&Q7h?OTXqrThO5v-qp2sqiQ)Bv?IZ;SFhmNg)Me6gn94U`2DXw*pz5|$16e=j^O;~?8nV5Bfr||WGrUa0Lz!6BCv{=nyf|xbWA_zhqsOZ<(s8XIKF8c}p1q1%JL;VtmG`Xx#(^WbpfITbJHaKp~e6ZuQj>ma$J z$;m$`|D-bkb*3RjN6Cs4+z$U6358p{4Y6bVs;WdD0X`W12Ziqx1xP99Vt9#*?zWwW z;Xlp&i1Yl~k+!}<{)>t#4QLVPJYykoZ0jaTTjO6%@QOV6u0;}e>MV)Ce5Xi7C_b10 z8X9GI7e)yGpdhW>c%}sM$Ke^Fe$DFwIMdO-vVsi%B($9@tc<3r`91$YDgBehSv|z% z>>vgfiSDMX@!Ufvd^vseT0(5;x@v^4SkOIH2K^hn1ZRd%mSFjLyID@?fOZhnqK&k4 zW8qtaiI0Go4$`OP;dlE<3XC!=KQ)2>rV!IkM==>0w1bJ9q`LWZ;`fa4WVqU$U3c*s;$G$j~{qI zs6Z27k>*ZTAdC74_-x}75fuQaP#;vENUs8>wg3#Q+BE#R*2qLd-!N*2P9ve=xHcQa zs>GbA89}EZtMM5$E0poqe(sfQjxqN!sd3feC8|U>AAhdWGN`ZBkrHNjTR$T}O33g| z!6YKmC~YjeOn>p?%W?xQ%{3gn)_?#*Wy1-WQ3Zyl%{0qa=lPz=DToyea}YJS3QIfj zZR{3UPPn=Fd<^YAZyAu1eC+EirMEM=bn^K!S@A2)NRUm*z|@kD%%3!wxmFn8yq3&( zZ!Z!1yoJEYE+us)WH>;m;w^~k!REN2$T6o&^7aYF3d@@ZtLNm@08c1dA_PHfs4BsN z(On@!%`QDD3-EBQ2T6EWf%)?^lEvEDF{``4sA!mu4$dYk$?d4EbcKF0^t)0HdOu>3 zkWPT3n44&kP^ds6U$X{uLzrr=cdG0mLgH6Ofu)?ieU~AU7IhV!;f|5}Sp`FoKm{iL zMe6kI4Die?f7zv&pYlrC=A=R*zeW29sjjVEsH6WGQC!5H_qRR}$D;{ee2hbt$ewjS ze*Dh6V=sYa9%FX&cQ*64&`?o{NAdCT_b>vwx&t114bF={Uq)ZHx3{NU^uqs9X7P}R zCsc{!t@0=21=D;odJvAnLP`2q(5z_0qtRLmu10%udYNXARHQKe;+)I8eL{sx;tG2E zl{tucw{Ta8_lIrQE*)bNR#<>R1$>c^jcsmML5&7xdhbd^1V$Nc%j zXw?jTO}BF)<`wG$Z@Tgu9lk`Ro(b=SEMX&{*(v$F56tsF1-5lSN$ulzIy$r;Ve#tI zV*8$E45#?`^M9b=Kf*7tl3IS|U^c5|qX9he*d+89FaEvUJnBKBXXMZknkKqQoceQY zyEoi03|XHlKnP&K&>Tpd@mliH$s%yR^IA*YM9-Rlxc16VCh}TBE6-WU$QaR8Yz8x9 zhcqX9U+6N!+C-xZF5U`2K@CK*>#%N}G0qjMrV1hpr<!zK#?!TNDxx z47*Vf`o(p+LH0h_mWqwMHkN0Gq}QJCu(K`n=32#3 znQlHqPq*8;A7f})AYmMWPFE#gPWTY(f|NmS8%>$Y~jp`DCQ1@Bb&So%uPLq zmMvtn?!(9P*bhRT4kmxEUU?v+bT_J8Ktk@0xOWeVOnVl52?&p*&YZaY5}Qsr*oJ@m zBSI4%8DJm*wwx)7W{{=XUOy1sJv@whEgRW%=RQxYYh!mpu|>T5_G;nRMC zQIeA*82*p&0qlcbOjr5V>1soRf1I9LXQ|vWr*5A*g~vu?gKCDn9*%H+fRgLz%rAM( z-ld#o%zUDBPYTcv`IjCmy)gc0te80Shcc0==%dk&S_Nl0%7$9n;kXvq6wMEqm0!m~ zwm&e=LdiIr3!Ce-Hgo20d=$0-+#lb&c@1k>o70Q@#>%mj@Z3yWkM9!3c56mYSHiUN zssCPn)Q4Q0nSGIUI>WV;%um_ZRnlkMjIHSDmT0F!G6(0P1hIa)y$VK|@t2C)bU0T1 z0ABfti{X(Z^Wyex&QerEc~2r|Yej*}d+_@68}*x#mN8E+r_2@Rf>p9wSIIn!(G&R& zhLt;Gc^QfC;~-^}6OWMtI{gk;()>^_qVa+VX?}54iliS*EM?k}rm=zQo{s<{E@>&8 zV2u$lfy_uqsHZM{+aa{dTE~}?T2f?Q%VUEODv6VB^9k_}wY0vEPdxnv{e{AnD8 z56Zab05pNGW@bhC$?@?Y)YM`Zy(y`R%6@^hY;hY|ypC}mG@YzP{O!eHpSq21*4-g^ zT`m#YtV>TseK&HdyF7C>vpXu(h=pca(fAA=*u2Rj85QdbMgJcD{BLEnbkUmtGKln^ zs9VXUMFq+iMAsbmDDS$8C>iV{zySs49zbB`eWaNytgOL=C%F{M_pSZBAVm}q{n6Um zTG|=-TGo<}0=NX^hK*2Ke-%5CF}n=#NFsfBS#~_JY+dt;!BO4PvlnTCLa`u54jjVA5xLX{*&WzlG*qO?B zj|;^SGm}WrqXz#>9qupH*r)@&)Zuym6W8$YY6^6BgW)@;FE5iLYRKyOewo&Nd|`hl zRmT~W4UVdioW-_G(o)&1UBVjwMOBiZF^lWDX5eK#zLP)tlQ;+6wImE`y#S+orR7T? zYD#7b8MJz2c;6IgFXUFBERo;7;hduL#c?|z0&Rn{d7tA9i#L}IVtO&R3W-5{p%qP< zf4xE|oJzA>i*u0Q6HE&Qjy+B$NGL4S0~YMHZj@$Qp_?sJ@q$vhBlQI@MogLr1rocG4%=bgJL01%bYAk7NOvfOD!rGgR)hMv~Sx z#bu1zD>HMe>5}@ReHNRwQ4LV-yn&ms1Q(SA9|oe&hg1vR1lCH_**mk88slL9aTD2s z$*R++vfI6J{8C?2R(yP?nL~0P$qnTgrAiKmTUSXeZ_w@->>?7fmlECQqYu@2vbwX= zoBMgt>+0m+8IQM*4}f^1A&3UaRzS+_)VLaByMg2iQS4Ap=A?|{W6zRpG+pMW5*v^28GMewK7X-$HM zJ#Lw7r>csY;}q35V5#`N)(|=I*khtLqwXDcv;0UOte>C@aBOtF!C@K4q^5)M@Q^l z>nL9%z3&SiTNkzM?4ybqFU#=YJ@YmLI+HuXqe{Y2WX~0k z=0rh1peP3L2&eI2pv9{|>&h;Re64ocwEf!yyP8gZYUPS#N`E*xmltnGIWjQ8saAAu>T8l!FD z3hS5{jJSKQCMESG`~-IvhgLp;?H8z4w=50cBP3-TdP233?J!@^y_2cnv-ioMtg2tr zzHSJ;BA|Av|QTlJ|4@!As{GO#Gu=@6Np$AxoYRZ z*?9z;ZMYE=D^nQ=+`nQ|9O*K(O0H<5 zD_F7hRYM)#_-b))khU(aot@PB%g3Q>KVn)cBZ+ExK$i9oM^Y!AA>#$f;OFJ1L{dst z__Y4{N}yF)KRtiH9nUvHLf@2BRh1e@NnZd#kViachgN=i>3<~NsXe$!FE4jZzSgR2 zqvXn@UUbm;4DT@3ffNTFGG!29?>luG1Yo46{$?TAebF-y`#9-!%-=(Fpd4=`WXXq3 z5z#O19~2=IJ$^SvNN7%6d4yiLGTjv-DBKd>O72A?VV^6+7)CLtB2nq21>+4j71!4X zJCG{j5FXt-(&r%NM(>%Ie?1qo$!zuFc*?oZBO`fDE-ET8{cVX8{T%qj0zYTt-L`4E z7_J9Q5@K0}U1@u*M$l0@CH(B^TE^f1@dc35@p?CCYWeA139usww{=n2w@#~W0G-5P z03qOD^kAdYMqyD=R%>f2pm^Y;AYl9*R$R;y6ugBF0wAC zj$Ke*UeNps$sEZxEg-ciM|>32`&a*crQXbt0PD!gPixWyG`3{mX?J!U&r=VZ;#y6g z@yLDi{D=b}?OjPS(@w73+vi916pnhtScc8l?+lj_hM_B17J`^qWD^z>GG*hE2^V_~ zR99Q1mZ;^rOXQHLSelFtKnw z=;2E*rMtWE@nHR6hVbEWgikyqB49t!ifA`Mv9huP z5%fewMMbINJ_)U@VzBc}5I?{3Lrp_NnyRWQSNKXA0j0pt*x2<`4Z6S^pf}#XI}1b= z8VW89K9pdBekyvZFD`v)7BAy`;`wmVIFo@Mnou1ybJF#Q^V5i$eaG1YJ$x0aaqBwQ zbB-R&(d^nTteMV+Bfjx*y<3JOA8E;`66DKQENy!hS!-p#EJ4--3x(b5e>_XH0cGqB@MNWTA?VP6tRV4(K( z>ucSz1SHbCR+k;>f5Q%R<2BP@!+cq3Y3-jq79pXeOgb+yU2ks@;LDMeg3$v5axkaM zgL(QOP+$kftnw@N|5Tc}Y>QeoqEJo-d%#8`eiuk;4na(oXrmJfFn|mnFd*m`gN}jW zJFEgivv>%EPL26qOl!?#N(rY+(N)S|gD?Z7fYymA0Uv@rl=c#89vZpDDrLpPS>5da z4IIIKr>84X$9qrrgzsZ62p{N`6kQ`586fOn^U2NMLomdp zrrIi=&5P}c*<$q1VS!MAVU zDh)%V=qzcTg6?Sr)M}Ch)RwDo_a+h|H74=?{}2&qt^S7}Z#(|mZfwlX&)@#1N<8eK z61@NUIY1n(r>{W&q0xO0%U}Jk8Z5>AFfjvH2i7|-wHSKc1f%^F6#g>Zzuid^w2Sfo z{25UI&@6u3dI$>vgqu8|vhWBL_afb_B2TNsKpdmNF4<=GQPtT>o&90p80Tp1|g|(kD7%f&NX|7s6c<}*f$Jk>4^+CI|E+>ar9>RVtpzudywZW)7m#I4G=1v1YY`L)hk0_r1p=qh`+SW=;R$E2A4 z>C5v)cRNpQZ@B37LH=^~7ma<9X&BVduWldgv(Kw&e*++L<$iE*z%jlq#eYo3C3S&p z&@w7RHk{wd5BXvT9MCv;Z{9%T+I25xUH{-6IH;j5GMtLlo{@EO`_cPlh8zc8@ey7}1z3}lZwZCaK z|Aov;wqnt4hd84a9+JNLc(9Ta@f~i=Uu~T(@@|Y759|F3U2$8z>zE~-q2m?tHx<0j zY^W_+KXqxNaAavrPY1hl=88%3@I!zdpe^B(JDhpq7I$rD%*dd zek+TQw0fP*(O+O1ue4UR0yB96ib94LUpSPYe$k^p*P%w*!GmhieHjp+-%aAa4?#vA zP&)&(?}BlnKl;xk4@o)njWzfA5@#U7cL9};I4aP4klRQ`x!?^_l@_H44d%M* zJBKT>0ARybH)#w@X#+X2ZZ7s~Iq*_HK{$ zTTJUhvsks7?Vw2hm`@irG*(|xb{Ql`L<$W)_QMh*(L^fEt_{<3f{B9}*P8;Z-ru8eJReRh&J1D1STR&QHWhP;cw%kE^5|vYc(Tb_t>dqQBAfEnT^G-Ix<1hBC??1 z2UiZKU-U-emjs={U7Y!a<9u zqaefgHOBdF`g>q&OAP0HO0yDne;5ye@(kp$tJH@qj*fcC*YvgK0Y~DYbfcH3^jK>o?RJAm0IqhQxQ5Pdw3gj}4mCkZa0d>k|>N^V9b*3s3e_ zpBB2)Sc7DpPMlV|fL`x}g))dFSDM!7H=RMDqnc)B%z&ngQ;TnjOmYt5cU2FhHg*&d z1FG+%sHI=hnd#ROVY0x=Mw7v)2QKDs7VQb>%Z2`s{$rDdk#)uovRmG!kn7Eo$v6#6)mQ)6?=-ulg-muQF1J98v zf;y{vj^d|qDCu_ye;a(`a^8o3UlPCdw-`*kh5 z6wk{zLm?&q_FHfv*=fjOc?nn@nbv%fUp(;%jS90bgxGd*ZtdtAiQ0SE-BH4DZ`Kl! zl&1tee|vsq7}@f#U%&nP8Y{#XD=*F9=Gs9nqx{KCOX^Wo`Q5F2?`ytU%f3<0`V{}I z8&2xq3%7R;E<_zD_|>QB>1l+ewXo-^sM4+Lx75_L)R_zbAF!}2)aLow&S>K8?X3#U z2v@QK2pbod*JXQ%P$r1iVk9moIQTI7@W-KWQ;tk#ZRyfpcYIt=g0`Z+%aqo(>NCCU zW>jCJ5I}3fwyNTO;;hT;+D%p=7`~(aPNTAnr81|Kj5i@M%h`S@kzVnsHKn+2O9j2C z|6TJ1E(=Q&E5Hk7F?U4m5r7YO62WKUGTEHoM;;y5n5PwJ(U1)1q6VwC;4ee3gp8zO zNRKit6)DW$k)+tP^z~K>n`=00i5?z}x>fBnJz$D`?N%=VtV99r+poj=}5CyaQh;zVsWGoms)z`bCy%Io&XAPw4lN z&_6aTM@ETH?`ZeebA&A8Ik_;9w(F0I?rjczP6|8ebINIx?57_vM;l|k^TCLRyHMV6`>?9_A3~e~R#|dYuQtIx(8Uxj zt{?;WW&WtHWgo79&VK!iE3-v!KSN7H3dqBjmq!wppsAg>{25rr{+i{T!!vdhkhJon z+uGg&(+oHoiNycsp~dJ{OBpJ}H+VX7vE5zkE^UuAaUja1h>m>BWPr1Slfiehg}VXx0L!$2O1mXL)BQ$$FAk>o|Z*9;%sVn>HABRq9-qc*V% z>78Ax`w+JE;!9iAz`}w9CD~kpYB04yGuPw3A)$9MhT?CA6492n_lp%+LxC@u++x?Z z#zAIoxvj;VSyAa<)^g#vf#5`Rj1JvaQlzZb`1B+E(Xyd?yZ(BU3v zMl-SYzBLmE_$W;+RJHXBt$9>J`6BH%CPLuJQ5nDaB8PABF;g$FnYW=N_e)J~5;Ex3^@7kP2(-CVB>JSKx|*uZ5Ouq?)n691={Kd4 zSu`u95Glqi%G4|6V-?}QrwmoiJB+H55&MQyt5?Ht2cENa*ynF7M=4tQe||bjXG$U- z`I)0kvLgrFz`4`-n8O$SXAENJ`Z)N(cT>I)K>ATupfuGw3L~23TbPZ%-|QB5VdQ*; z4TCTU`{freQ^U!MPPYpOxwDRr*+TpyMWP%V2pS*Otlc1ZL7{7e7Qh7+L}BfX=is)C z-ae)v`1H*G?OG(o*bIFgLC*M(j0_|C=Z5f}gCaXrys5~fv%3U8KYuZ-Lc9J4DZ2WB zK?OF*+a10Dpt05LV2oL8e!{N`EH?NSJNL|Y@1v)o&}Q22#P0GcR&_n^$m3Q=O#A|t z(!Id0!!KX;slH!a_}XyIu`fQ$o7Qb0ij3CGBQ=Kdj%sI&rV77nuwMr9TlN}r%^B!1 zJoyn3@q6C}CgigHcfBWj`bF!yumQE4@0{g! z9fpQch<=NN8Rpm5M{jO`vFR?07CRbV;*3guLjB^`)D)C3E(>dyWXD{+opVDVkz=s2 zNzF5dMHqo68}0R>$#Wc8MZlglxd$knXDkl+umb&z`zm~XJ(I); zs9h?fLWu-PQRH&IcakG12x=b> z_NEFoF{ri$f-Q)y+>h@@hlEW1{I(-+7se5yCN%~k0B4E&T-MSI_VyO+QFHQ&SR)sG z*cPSed~XU9!W+Vq4hbd^!W3YcI4NW3Bbi*km{wbzMbrx)kblJ{lGdu`q`~YfLcx&I zBHu`g?&VJPIEKd#XBM3~zVNJpyjR0}B~2}E@NZIYiCrKcTBY5!)^5hqti7;g#h5kn zk^53e)vQD_=>U{)vCT%shYU$%sH9;?0NSaPTlY$oDSK z1_rK!pm$vXsix9{(}RGPqhhf|%W&r_`f|5k2I66K?XkAoi`#Pp??U=~zmj=)*u5tP z5+*gY1E3mHv$G=mlfE68V*ys_^+UiO!20=qJfHVF1SB zga>?0FE}uaa1nAlsIeCfg+N*SXlZF}n%ezt1hi^_yn&Z(>pOQ>ui44n>gG`w4eo<- zbX=F0#6|q0pfVO4(_3nOJ!$w=;Pyt(mYS;q)#JwaX{lZHyyK4FaR#xI6Aw=bmW~Qm z#1QqHJ0t@8IF*Xm^G)xMf-Xlrv3cu?FEE+GLEPMFef{`Z2VTa>o!iRV`MN}AqrFc7 zDMCSk={$;Q->Jx7kwe37{~H7hA|?1sOp=_11qNmlr|(0}+i7F|wTC|K-@hw2wF6}t zLJ#1rTS%nQAsoE(xugj(gjs^$Pz{z$(<*cKy8APQzP9L+Twz%Olg?%YZ!ov7vF46R zl-|IMK_3-G!}AY_(+Hz&T<#Y6@H`RhIee2eh_ZYOPM_e7{}_!LfWaD`nwiO-w*F%~ zuT}qM8)_?%^N&pmeY+#cZ(frO004?c0hYD;`jgDQ%hRKO7Zh7gF9k`r#)<3A7EDos z4l8VS+P9eoQ^Kuhp&$iX!RWx{=GdtmCRuUs)3pfB`+vHLxbColb0=s2%cNfx~o`bqsKT&$pm4%)GhI4y{l87sgOQO;X@@#P3P+nh*U10VV=qyK|^7H9-m5FBR@z4<&KGvyPC+L<-MkpFbAL zo*~W*|I)yJ1nAP;Qz!*&E#2FksRHWjZ&^c@XBr{=ej#Zi@8I^f_r;(uD4a3|;iihX zbW}~yH^P%+sTk~_Kg zBW$n714>N?7|a4=2CZ~^jl5ETBb0s9*2mMch;i5j^%2S;2DK5RoReD{l$uHv~@peIm*QeTV;xr8rfpqW5MoPT61(*2fn(c9QYgNOeg{EtRu!2ZP5Elwlc{0w)qkhFHt=c#55BNB8-XkQIh>~~; z@!&^*Jo`NX%or`0fi2^RC z(BZonARsqirJj+NmJFciSWQlFU!(&@x^SG0Gm)d;CE2J*{NA$QC_G_l{_Iit?HMUj z+GzLDoly$Pj20B&D`;r(MsU?DxD1;)8bDz!;=$ATuZ={CPUSc2|3ht$y+4+3C57{U zYy0D){=aDZe}L{y0RJ^Bgg?Om6#DUdb8+;y-8KZu#8n_~FSa{@tJmPN4^UCGjseHl_@4#_>Fz zbS+w8_Cluqr4uJ=Q;u!+kOopB|BT( znX5d{a<3~dc6uDx@rz@cGOt{aY6TAI6!Ud z&eLjJfo5Fe2Wrj{GrL68wf_a7ULYmmB{?vdir zVj=*Aj9Ce^OHIwEp;37uWU>qiwk$yv3o1V+b+Ia`s32|kH}v!oOyEv_t(1YE7Tkv4 z@Q%C7VjYNRW->700u`1!ycCg{^=V6N@W>%B{~d;0(A~GOK0N>2jyjwukPsB*Sb@xA zQJ&H>0t5Yp6k8u4>myQ*xEJh(m;p6ZsHwjW^9GIA(w zN;3WHPKi>{O<+m>CF zbzK%rjP{C;@d7%7U-CQ)58vDg002iLB?eHsK}2amq`PwlPyrDE>F$AW zoPW-L=epp!c1%3;?DfRD*S+qwLxUTVRdG8wI6DV7IOJX%WLr(kpg*Tti16!O<+pD^ zsnc)I+^<={3BI&-zeQ5cy+S~Y@qWi@2wi;taLn7v6~ChLC-<)WFY#x07VIh7lH?o4 zL?{ai3q_*mn!9f5X#|L+wN$!ah5XF8C1d5_Kl z9GE(Ox>~IPNP zA6)Oc;ldFf*FJt7zIOQvUx*RowY&TCbf!Xu!vcbA5$t5K^lz^{6OED$|@SKBeXi zB{>B+G&$+{+*UPJT?%KcbXVUwbFhg-6eFn1>gc7VP4Edtk~Ti8Jb-2#Zgktdoszx^ zus3MStwA7u_!0GQZ;ucPLCOI%F$E;RKq9?5L}6OLPq|=O&6` zvTtd>P?zUfHxPXPv$${GzM_@K0fG4(sP%kASNERypW!EWUw9bvKYA9_FxDu|U-|3r z)I?m2CtKXx5b!(sqI(#~m6HW?kgT8vwJF}uso64S%%L-h+2PW=>ZraZia_Dye-spn zPu5{dmuTsmAR;wowJ>E^DU_`9jp=L(tY(fCZ# z?H_k&t4|307oYd(U0CtuL#g1z!L&E@QQsemaYTRqGIhB9RMCXfM&?1bx<75CLJsea z`k&KGPQMqQ&mtU~Wx;15DhNIc&PR{#^oimE>Sd6hR>KK%mhDny2aX9mhL5DM=#$At z9*_z5G+Aw8qIWA46utHK^ZWU(k2-Qsx|Q~NARJ`HY(2BkyiJfKERznx)ucm-D)-JXdPXP_MWL$%K-ZE z=wOSv}bCZnul_^ zM4n!Z`fwXGciN(1oLgY*+7z2 zHB;0OzQ=zb%d^N&<BtQzLxFR)`e}fZ|3V zs(xDs2<1}@fg@qi7&hRK2@MJcmrwrWws-d@1|m@XPj((C1$%so_%3Ml!s}$veQZn2 zRyoMk^Sac||9jMWIjqzQCnf%wqKZc*y4AFdj-y?s9`2teq_>qt>jizic z<}~e-r1xsG7ui9YbfnWe+NtwVmxAiJ&#GOM4hw%~i^>@~d#R?JpIkrmd3=Ye+|Y5p zTqr|7(JD4Q)moIeRy<%<+#_ZDVDoG-J;BrQg$il-%nZ%*&OUS8Ob?BSyLRpsmwP#H$+v^v`KFH81jBFVozg zZiNOsX;T+v=L%}07_7D+AWYW~LDz1&XMr;-YOyNU6EEzKIr{QQ z$KIYBWKB(a+z_N7P!m^6%B&ZVe4{6?{3hJP z*xOnRig>2ysz^y`yTJ8_DT0&BiQyeB)3Rm})}-%`tc>*xkx_LL_Pg6gcx3paojIRx zjUM?~o7D5>nCG=f{gN#Z>qtm!*B8}B@iwvBDErf_1&Z$)3mfAyV173_l1W>bn;W3V zhlhu~W{~y`e)bWli@?TtOVnrN?c3xJ+2lk%{7JMecJ5{L3`IDa=>w-d#ub^muOFUm z&BUri4AoZD8iv3fOdYIbpbZ;59Q@I`Rzpg*1UMi`>ZT<1ojad?naK$J)4P3kt2#-z z%b)A2qztx~H3Ym%FRSHBoG=#Q!Ag{rOSkw7<{AAJO zIjzFli+io&wR07p@qFG|WdK6l}N zKFn%_G}L5)zy#CpI?Kb-FxQVp_yNj99H7&9-uaTVl=~o;Qo&_$8Ef-oxXJ0=>4k6$&>k%jQ2j`=w z`{}+!!{$?MIS7y(TLoZ^`~kHs~dD zWM_9T^0G=`6g)ikhWD!o1(gp3b8vnmLY}g?;%P*VypZ#u3$KiS5&;euojoB?y!ouK0X)^bdB(H zHe(C=b#GE=qRkBXNr+BQZ}Mq*R&{k;UZ>1{BWKK*E06UWbgRBstX*zG#) z#K469hR#|1`SMlYBX613z{#_%_56};p4XK!Kka9p7MGWQmDsNj;cG=x!|UtC?8utH zQYnN3bDLgsE<{)7dmTMJp#)@i+%E;qN}+y3{7(g8)%M|R8^PZ*N90vsPOt;-hZ(y= zA!%Cb*csiEyu+Yh_?~AQGuYm4C`R8k%4;7+%E)q;yzO?x5rpNg+FO4~#e)`oS3OGS zUM%@DrmLvu7^}26M+rI`oAV7RukyT|Kc#O@Dx8-)N!(j}vxj@Fmpr z(H*%d%w^h(NGybva*|S?7H*iiJ>a%*KkYB-C6+kZ`vO|BRzTd2FY}1iyF<58yGYlZ zRJAK@S;#Zb>v*=T!e3@y3ldl7gOg|5T_R3S&cx5`ZHCXBJjp@IqPVYWsV`Vz$;YSR z;rAW6_D0@Fli{m%2a`oCtAfQ!0)w(SL$sVk5B?Vf4*@(QvnFjaD^B}do4E^}DdrN) zYuxx60!n&=*&F@k`fYTVAJ~^I86!*n*n;#^5DRHw$1Wx#iIj#rU+cUwcVKa&t6j&o zxP~bE+%>5D_`~%X-)71dUlZw+v`h-td@&HhA`r*b z4xpWPc6AjqkpzyBo*dXAn~whUuKk(Fl=7>MGqVX;I8!$TbNjxFgGqTlyC?-mcD1kw zH)UQ7SPD2l)oFKV&mzZX`A7+kF4>I1m-^N=T=DraYt-tw!04R6h1Z|6_(^P%^$g9! zNF?GOrOa*8Z{7YBGHUL$0lw!i7-_Ny!8s0Oo$4AG{r+@|dAjl~9$`pOd%GMd85vk- zb@D8~s|&ncDorR;NS0sHoHmhMoHwK5an9CnWoz zlk^sWJbD{zt!bC0^4cB?*2cVFq6+z?7nq1?yL;TKio%9sVkQ@Wn$a!y8`HUJIX;bQ zUG&Sy$+^GLg8PJunO-sD7ZT8MN}b%63<;Wkm1kRAyeN2Hf9Bz1!>LWh)XYgZ~Kv&Yw0$l@0_>C72rw$<1F(0;a!J7YbrX8+Rc~jXR6W3_!X@ zs7XbgH2v1A6}knG80|s6^MH9YpzwDyWNW~0M)6IT--iz$emGV5>vVjg@P~-0OX$E= zo}(()vV#1a!g9S1-l<$Tuowz_Tuoeo?>toB)G_*|Z>gnmR z#W-jO13hQ9y80=RuS#oDZq1(Uw~eA_%ON6R>rV28xSx@A#up|HzdD0?79LD#x)poA z*?gCyexR%69-ilDTr9#=wgnxHp-R&ogBeK@*CR|+F-e4xzJN4Lo#K zmx2ej3nwz9T6Q5o;#S>LVrK&J1ZdWGd#Bs`EOOo-(r|TMZ6w~zEW{-w=olE-s^e&< zHluOBD472E(Sqz4cZocW>}FCm+y9%zzmuBUciTHTCH>gDbaxgbJ1MH!q~`Q1m>}g( zslKZCo$<`{^g+;2K&3tcvyM-Rl=uoXVFewin}sq~`?UTvN)EXp?Qd53=Tbt40W!?C zWUfs`AMtrpfSo*Zv1k?#RAu9qS5N>Ia646@`YxV>y0mA;12e*!M`JXwwHX8@BO^)H zwwg?%Neci@Fj>RBGE=3A>3u@UYO9Q^ubiR>bACiMo#JgHR!3|asGdH0mRx>>G5YQC zclp5mu*~Ag*S%UeuW`{K#nQ&_pJ4Bwgb-QG{w`6tmMUAk`@|I1WD@-z4?YM%s|s2k zUwgvN!Qg3(+?De)iZ=4LEy-H}zBXcAY+qT81}j=rkEzVA=20on}4+!)}edQ0U?hM6boh8t($1=!E!{ zWkBnk87n6Ri%vQjj-Zh7kA=AU^EY{yp<(Mhq@Q`I?$TNdW94x!f~wyBEpPlTs@KHq z?ENmf#sga5W|fsOeVMJa?rXjpXEbEk-|%fluuy4ZnBGjpt|(D0iKmsEsclMsASs6P zTU14&Azlzvtua~3aSZfIlhg|CgaA%XPED`w{W)dlA9bZ%y5(JpzRl4sEyf?MtP5M} zxCs5$=_zxY_>uZ`(1&`l#C)8-9`cnQh+T0}b6eb^d(}Ah%Fc=dfiIufY@7qz{>|8+ zCvogyw;jbZgTqHd%OGQ^CtNsG6iaHZ3KrK(f98S9CLj=#ubN0r$9|#2ZQK|K@<3DI>jK(m=E3TTM!ZzxRjiwf8CUjm*zZK9&hzgxAu*eF!AN_0H4ni zas%gbwE`v&Zo!Jy3f@>+S^{$?6S{!CLG71&A%x=4XtJ|HzWM>}#VWm)8QQzdG>$z% zL+RrFryLaACgku1`Lm1aK)3pBRNXXQ7Cz2@1B*fbuP|SKv3Yp$*2U5Rq)q<0fV}*B zIQ}XiqkL_n%XV1TT0SO;oDih$6+JVk_6`>&21dwZiNuu>EG-*H(ii<5yuQ?0*T#eC z_28PesuHdsR{ONE@sGAylviDYR`pn;5v_A3S`M#d9T<%!#6NBUYK@zfE(_G-RvjOp z*Ah8>mT&+x#{1h9g(fZu=|geKmnYJ|Pb-a>r^6;MLO%IEq^73s?Tb0^}<|#FxVb>AKvQL z`53If$C`Zo3a`gFCzFz{xQ~O~wan%f2i*WA z4UP4)sWr|@7Q;)h3Ly`t<@x@6X{``FUwc^G3(tTi8n_;WDgF&nbCdq9bSli=kRQ!!pSUVur3ZMad<(IWfkR^)+gCB znp=o7W*;@0A%V+9XoBG4Z~nO@weVUj1YC(M%&!9-WU^(Q_R>DVn-Ff8L*=kkW%vrnllG58-$5U;l1p z;l1n}&JdUH?;BLan|L4q);cXk>WiJWT9C7f0bmKpcOYolO{tb79ra@CkI6k8sqMR^^14sUu5176R&!m_)*gsuj^cc-aIb@`6@lF)*HRZ zSBv}|pI$+K*<$z@$U%2Z$Sv<248n2n@IJc7J7nWK3@V!lk+`_T-Ju6->cL3Be6q)1 zlSgfHUe_;(Wna}i(BX+<1e{pvk7&vseWvO8%{vM!9^PTHFyZNLHZa*fX;kpJw4cd2 zn)xB0n}@0QJed|f`ia= zM@1(pGa+Fd=0A3nGI=I=BhsEBb&ImSJAPt9R=zU%<7?)eqLSQUWJR_1D*4+ z7SYa`d6L%+R~5&g^vd`ydfl$}u29zbL?&sJme`iloL15->H zgBI4}RK~Xvip+?l=2#0n>(l2&YN(|MDR0jk_H>yy+{D{a&PIAoWcp$${ds6y zCth`2VV~`~2CT6H{c)Ln7%V>9yci8UQ={Jvc5(1$oPDFpdh~vAtGr+TM6oAR>LSb( zSIp)3At;67)qpu~9?G0{WM=j|V%6XAW9kvg5+%H4uBAn($i?MzT6Fi2o{moY<;xd} z<1pHe_jYrv-b*+V7WFpc1@EW0dT^}m27ZpTK07sJ0c4(2M#oyn{5Q0$8Q}BZ(6Uwf z(+Ovn)O6%Q*pdECkOu#-yPeVVJ*1M1l-0P3s?8DyzOttTh|M^>ZzmT5!pmu?+5_YeJUeb~3LyivAx81(0KJH7Wpv3<4-dpfPH<2pr{ zu5ZeuXl-3T{=?GpoTofW>MDNTb=zAW84M+LZn|ES) z6A>*$OLCpPn(aTJO+75A421?{A~iloNN{%cnQ7!4_MAzvh7zS88kh2;JvM5g} z(q6bl`a6yZkjxhZzI>JN6Bz<)SpAUczs;ze{P(0*pzh~MYDMx@k>sJx9&?4^6wdB+ z^7`>9F<-`K2Bp0^ z(Oi;Jo^g4_0^`F^v)fDgBHavzMh^=!oqFy4->g*;t7yvTdgwQ;EmGw_&f*NvuSJtF zX%!&v!i-5~Z+~ohxX~(p^MjjSwF=uArJe*fZ22)+dEvZr8>x_4y8ZVq0M5f=h6gGq z*bRF9zcuKC>E!q6JElGkvowc2P_!}_R?yS-#W4u^yAEMvW0xnjkr%hT{neHZ4$3z`3J?O{ndvf5HI$RP^OQ~L=rA$tAQeQQkKH36fmt^Es}42&?TKld`KKmmGS z1?noM-SQayTA%O)o9b(^|PB~_=5u53ICQ)IKZ62*MH-2S4rZo zaAZ18Gy0$PSk8L<4-+9MD~Rh6@IPz;VtkguKccua|K%8fSM{a;Hxk4DBlqzCD;wc| zk~9CWB*!Jv)yS^a_=VT#**gd1|4jgWV4#^PqsS2R&6T2Uzq(pevbbWY_{3RM->wCF z(L-xvP2NfHY|*hO7;^mYFSM{>m3JazlHN$Vx$3fR?1O+5@d0fIa|Db_s__)t>BkGU zJ@}Pd*8++63zdHR*)`Bx#UAD%nua@c&o10sq&}7*_wVdB|85|iN_N)VA>)P6o@7pQ zCGUQ5r>6Eh`fF% z;S9_BX>Ew;#G*MS7jQMp|AAOgM`bJzje4mxYJ@N{x#cOJ-1;FP`tldnl3W3b(%6b% zF)cbyKdeS99sj%OiudZxUscz--dW|*Eb@e>?UJ*mxrZqF;vyCcVjNlde0JT|Z31or z!8$hj0A<>@`^NNl2sI^fW@e(3db8tb`;2Ab`!NkVM%Enen!#CSMMZGMbrqE8RHHmp zj9p&Ey$Cimmd{0Fc3TT%ZA9!hUxPO&P8{^5hP<#U zCb@v;qaI@}g`|(>#!+Q&F=(U?n57Ir0!~Ny_640A4!f5ZRetWXyiiiRi%DcbA%XyKKcwZ)XQ)PX<)DUne9% zVF(c8kT=Vc58G92RWfuk(W71-^Ecj7`uTl`VyfND+7C zMC7&0v&WC^#?RC8Mv#)48LPk5j)#;})~|>Btuz3Yh|d6^IZ?_FJ22@Rx*A^->|Ldz zs`NNnQpDiMJc_+1#!c!o!+1zR(sdcr`CS&CueiulHf+YvaKUwPcHfM!npVz_euwcXw)N`SAJ7Z+Go)l0f;e}@Y+A+BD% z)J1I_GrsE&Q>sT1-4}eoG8wF2QBm>S*n#e42@~z=yI)WaS{j9Rd)c;s>1(UW%Di_3 z|E*6_NSr(bdDlI#m}H$H@FzIL-*Lj*wy+3ke73)CVS%ACn{70h;Lt15E-^FIxAP28 z1*wBmqN2Q{Lm%u?v8)SHNA8P-|GqnaifvcUEt@_)+6lo(UFE`tG0!}zo1;u2%GEWa zRv0o;(xsi9h@+JrsB(SOuCja5~`q-2g#s~PM;6fG)#rs{(_dRhN-Sk2}fC7;C7E5J~6W}meVLFVR<~68R zav%I)S+yD)C}Z-6eRsfL`=A#l_scxjpi^GxZY4@`y>w)D9r|e{H1v5VdD(v*r#5~DCmg@uaRGDndajE{% z(AJ{xcH#xZOyoa?F+ndE3BzKpJ^DLu<8NkMftG$Lf!uM3)$(SFJ?y%{Z-q@~-Z0Z-j*b;A0uj%gCtK z>Kgg#7ZD?m5&X&AE?!fdt!W9L)IPSDbU=?j_T>o|%S@pC@CkAe2%LO*P$UAkt-qi2 zRVV4wH!Q^WDywv|zD~4H4&mtaljbd|D41C*;^TX?kqw6>-gXCV$K@FE(UR+(x5K_{ zWTS9uM%QOL{7^5}Z@)hn8kmMTO;8R7`@PXo-KO-5XFzA9?>?b9lj1K-D1M>e&9pl% zOyq*4PtqNDi79%DhSg@a)bCXOF1CE~!{HN@=Be@AaA%r9fvcl$%rEJ)`E^U3Of^zq zvv+?f`?<^6wjPl7Z+w0GPbq_>JBMRl!Dn0Cvn{>@Xj={{K^l9W$G18ty7&-}&^a>z zoUp-Ux9G&g(8EJ#1g7O;fkwUVdFbulmV||OO=+_YzL^oH1(|lA1HV2c!qLEC;*`Gj zJKylI;RgV)=SNR#vU9QB{5|)V)C>(jh%ST*5#s1jn;LuuRXmochAsmbA;Wr?f9<}Y zA_P#HgRLQ@T$2vc1%>h{lU33uKFmO+_oSH`!;D@WTN`Li1FxLMu8QTZZHsQ z1>A4%@Hw&iQmS8Z|Gwm1Q5{|N0Gop0Q+4xy?H?aLeM$||kDLDu4-BmA=<4eJJ2;2} zcZ1(R36HR2d3z3(4Tyfx6L%drhY($noL=@tgZU<&Q6t6L>Du@+%l0?80;jY0d+Z&k zvOT!zZsxeTmS(NV><9&)Hx_L0?o&wq4_pn6q0P}yG7TDD^j9l|ulGY&ZVT@mM6d51 zh<(Eah$&8A=~FYZJz&d|eS9nId7b@y;$tC`rhM79zF5s@I=hCL3*8ORmCNGDu&Ag+ z92qq=a>l2W4AWk?31tDeTxlfXk=N=I5INPII)X1uF854+$@mDEYp%t_;$0h@Nq1)S zKR7%U{=P-`y_`n;aHPA4ihlVn9vkafUq_ha_QtETd}$vB*)S^g4F+%M{N?M_w&%Y${qKlCm|x!xSDlDDj9+R6)mZ3$=bwsv#$r4o3D`sm&;L*J17=FL?5(khy$c6?`$0YN~C{t44)gRM(=X-C!e-{@QSvfge;D(ztUFVcJ zwDREtetmuY;jm4aX94x}wggd!2@7GqO7YvnnrsQ2TYer4wWuN4f|z+RY4iO6|qdWIC~*6#?Vy(3RU* z1Ms%(X#3L7(0A`XnyngJBXHP2l9(rYLLu;FU>9j}k>9DI!6K!w=DxyUY@;BR4mih9 zemJxLi^h}rYw74I!wu46rtC>8%-Fscj=EC6TNLi>%@0#!cpn z87$r;QD)>AYCYIERODV8CxF9pU3GQpsJ00WYKrp50Uw-^djR+xlarH)Nk~SEX&kXO zPEJwaRwI^4R%Pf{2$4L?EgxDLeH1Ek3wjSI|NB?&v%02e;13N#VB`JpBdLyd5Zt!0 z*<`%)X`tjuXQC^P%zMtw_Ze?;22G+ zUvc*1_D2ZMezw7UtSDx|XV_MCkp`gJYczs%n;MZV{KQ3JivMf|Yt2(&|Lkmua6X~F zB^ARZRgA7vkLIupdyMd$?@V!t)+lv>!PZ0Jnh@Z5Km%ii95eM9MSj;h5BZEZ>mXI#ZD=D11GZEgaQ9%a%^}qIPqL}5IXXOHVXnn zQ|T@QG6RPlp^#+-+b2dw^$@y7yk0le1OV`CzT)-0*tKzeoFqLi`jHQDDR&M=1!w?} zj)2pa9Ehq1mv1mxJ0}@?;J_;TZbQS_&F$A}`0&clLDPSu`m9}C@sdK;87VK5qzqyHyUP$-u zV13pIIcL4Zqk#S`ldn)U-MEzZuuW>e{q|yaz}S}1eOh~i3rNF4}}V|%PcDS7C#sAbasJ7PN{>Bsf{0$ zM|x_FF!iev8%e%<_N?Gsp4%TS7GfOzn0s*2?y@0Erd)S{n)F!gmIKT4fWGpPOwLgQ zG~KUWJCXP`6;^PX_YFMLB`22Ti%=7BNZ5UCdGr&pvp_T|}GhdS4i~h%Xr? zXg&~JoLSgyrMwwoABjT%+ow23gV@h?rjKLNC9-!N33MD?*SC(>29(s)UUg(`}x%0a^Zsfq0fHZ_Z zQ(spfTlh8%RrY5}QAvsTTWl;99bLZLzlz_#)i46rMqt2Q-jLE>S(m~&0`4c*aw%Hi zqMvm+rqikSr>(E=O%IwY{?mBZscd8ezq*yufd<1A1O6B0`Qf~&8NVfpms187{q=!4 z%vexm>%Lm+XgMCjy6i>jWQET@x2vlwB_$=i+l68R@K4^Oh*BxzT;^3 zecCg^7kKrrijW58JDI&=LCiy<5625ZN`j(-70&0+pD)>DAnh?QfkBv|8D^p7N90O( zO#PFTh0ZWlt{FgVIMrc5d67t%Go!EWUazd}4zOVCRl=7cR~-`M%ySMcDW(z5PO$x)L6n)o-PCl)nthiX#rK(``?DTXMFZjn<2IYyISykb2 zJ+>kv@>k|P8r~nssjcUNr#NAgp{Uij_&{T*v(MotwfgCG(wt7NRaw%l0rTwJ^!vUEnUq|D}Y__b1b%^zS0N}Qo zyD>v2GJl~52_MAq-nvcV0n{`!R4$f3M>poYt#3Da9oz<#W}As^=&Y-dwbcj__e2O2 zv6z^c^)8|Nl}O!%q#$g(~_`jm|yrIBbo2|7N$ySla(ZikTy_~Ubyq3|C5LS(`B z%G?~3-8Y;~1UuoOSTx(t?Te=qA9kMGuas5r6`Tj1H`D}Vcc-S<+P0tFt38^WqSw8W zxtjZn&{|Pf7Z(19qMY>xF@oZNtN=#`Q|Zj)7rql$E)nqT+qkE)vq`oXoCi3dpL+9) z``Uu=v`tLDf}w|%{d4(ByR?6~@0-?B9G?V-f0gE4!I|MIeF?&o@ppi~WPfw3NzGa1oC=EKXqsLJdr`ZShN+6$POoztN zCg3@Lu9FY>afPIMxftpL)M=#-Fo4FC zD^ZY$e*-@Qea=7f{ ztZi(;d=dR6X$X#6GOUE1{J$T}@q~?;-s$ttJ6QvR2$_v;JX!Q(azX=h42}q1n;FCE ztWztyP`ZM34h8pT_6$#%>C(mfVqy%fJdE&VTeDMNj}mqB`*rM^=H~YwX=cpj@D=8t zF*-1-;sfL-7WSR5d;GLTsuR zAR+_;cM$tqK**>Zce;UvO#tD4uRXRWgx}mG2hXh)D}{lZga3S(MDQT+-|OJ%9`T+3 z-%spRy>6PS_O_#EfEbv=%;*)CuT(Yx@Q*N<>3P;RS-5d?=t$4wsYua?g6IpZbnukv z`4QF69V|jBVG6>(mp5~UJ^D*+f(;Rdq!`1F6fJzNJu3D^n=t=^0TV1^=G~t=hAFVf z`Swg~>&39p71Bzd+63Aw``+_fQ?aNOOZK(8;s86Y2~|Ih$6l^PUCdv|cpk4Rt6l_w z4g2DX>J5GP><2T(yF#OIXb<`Bg`#IiU1;FiK&QxZ!ersy#i|s1Wc|ISEb_k>&kLIG zAt|)p_LD3_m_E*Zd1t-or+7QTq_rpmAK&}l<3i%U7YioGL>RR081`YdYwQt#xh%To9JEKTom5;5L6!= z#NUxRgkclV7~K_9Jv{#TL2rsRrkYm;N8h&I?vcUP8o8-Ty=}j zNJPRnd|;FDUt|W=0^0gIBui7^Jto9|&e^}mc2xKy!`0CRMWh_qe4DdK^d%9#cXnkF zCP*4)u?`g~64V*P#=TrjLVCGYhd61~=b-?t^gEg*f~PF7S=(Q|pU!oJg!#uytG87Z8`!g84! z8CkQC)kdqPf%8nXr8i4v(ZS?SGD;~tQh2(sH+ETrEExo(<|e8|6EF`2hBLZXw1Abvb*Bh z-hpDk=UOBTI}7Eqp8wGo^^7b8;Czo;4MP|H_KTfbJeu(vYGzatm(61!nZO*uT#l_x zu&GWIVr0L881siCV;dC?n2na^xGC&zM9ok;o6P5AAR9>p$B8=ocLtO6{F_XOLrnTu zXAu8oVHZv2<^tgkS$P*tQze6PHP1B?1fd@jN&VWv9`85}Ro?|a^HJN_hEv}G7VMaC zxomiAE7aA^4F?Xno(kLr0iDLiXCNs*<7N*w5vX59<}8G zOLM39m;V=lv|a8c9qKmz)7y;=#GPgfMDF7y65IplyrT%A+0`IHZga-ixarr_#BG|T zlJBLWK{yImHnZ2=X0UQ33~G@#|8M&B{R9ChBl8V774=`_tD^%CR8@QC0J2AM;9-`( zuhD2FU4zrt+h#J>ooCnTxa(I}^tPiG#lb;}jq;mu9(TuMMHii#5yXnEiyt?89RYY> zF5%5^4|`oK1}<$PSi?F;k8BSx*`9+Q#PqVRSNJ9}pIRt1jNoq$#a6TKL15XKh*-r$ zGIg1CcQc8hz~DpN9{x!2$xQhmGcx^AcR(ui>ndF zH~we|cV93tQ~P>(r6)P?`G^@Cs|>G!lagk4H#H0pi0l#AxmBlr_j zXYMlh@-3TBZnz#RO6@P$e~^^fkF zsSlK5;^H{Ks;fB2N&x^U7X7p6`tk~$7^WyoQZ6L4IU)7V@*_2b!oT^5>&OZK{Yf#Z z#)>|+o5grD7$GJQ0HKl~j&_J($MeIJ5vkM~_-Y@v0qOouB*M3>py(z)b{pTSXx$p* zVF$i&2vd9sINKU>gKx1eM!G&x-0w*am+x!Z4mp#v;0)XhId4!@U|h6BKZ?dZ=^V1T#9 zwdORdb^nOcK;`L%rWNqz?N>&?LNaU-`?li~)kirTfP<4WC^VD^Y!wI|%1$r~{M(;z z@@H|l$u7O`Noi(j*75lHn)=&gCV&awI+0{Nc#~WvSdt=O^am%&^LP5a+SA3X3)eMI zo-Aumlhh*=jfI@wP&&3ac_(DClN;UnpiBR!V#ZQ($(Rb9!0boevkrx#uT$>^<&?NF zJbim)(4%9mOT*C_hX^AOKKUyMxK9{|g@%T1qQEUD@Ay<=cQTRonOnBVd3&b#vu)l^ zqs-Q9#40X7&r7?Mo3&bGrl*XBudRXPU z>NUy^;eKbA@O~pAe>gMc%93k+>yK%zdB#s)Q8vxdv*HHq(X`D5diP~I3KEs>DZ;K) zZ(0R*^x$;{UTFFmBU*~+wnQrR!)jV^>R@lhK8gPHU?q z_g+YR{QiQJs}chM`h80k#GhL4zb=#%6;d_MS`H5WfNH+u(ajL}eC=@GH0om58?SeD z!1NK^3$~wt4x}_Kcld13!2+ZMmzORTkeV-K_@tV6roB%Icv`By!|tJ`awqcQPZ(@IHe%!W^9sIT;`&BIgKD&HM6+H-tE3Fz3BcU!L`H?! z_C6xo3EFiW2vRcBpFFokXXsTD=H*|XUAm_b0d8C*^0Go(i}6s}eqDH_`@Uk2EL=!m}B$zy+Y z2M11tl+<>k_lvaLqlr*yme3yh*_GdoG2Z?zcWbYkUlvA+L$O;Olgr>W0GL@8BZ({S z3#19tV?LOpA!tT=x_ByrmI*R#y9<}X#8IF>^4a;G^R6L1GBZdWZ|wC7`qgRYqNk8M>>=1%}uGGb^jY(SpWC zCNS6@J+KD;jST|5@1l2Hu8!{%0Kz^j@EOC#KI+xEu)y*srQwqWH8vy?pLexQ%Wp z{_n|dVG%ziD!m?fD)!v>`X$k8e0Uo?GfJEH_`BE;%T;pY_EY{tU;&`c`Ff4|-rR)* z8yjHUBfhvMggdgFC8~Zr_wn_v-{DCl{m;u2zoG`%;{bK^*F}HJ_58MCijZ16)3hIoWR1c4jkLx-$ynMZV z#g{msZE8x|L#f9Chk(tuW zdo?o!#>D@7VN5;F8V&9WUI?6IUiM!TmAA>Kuhic&=fHZ)35e1h4%`vPrDvu0c(^q5 z>E3Ez@|@6!qo(@Fuf>cAXqRfi(HC6!k5mJ->bgiWu5r#w#r-+9V zyX|la^&pyqnU6+AR;rt8Bo1F2m@>a@9PW>M>&;hhT+{L2|yfas9$UzqfPd z&8bIE)Q(DmB~?;HTfnH_jP|>zA%QvfkyM)|4`#ZJm98@RoOGzL$;3+}vklk(4%m!1 zh!qzX$ik&NMHWyfbKC#IKIa&uE?#-mPT$mJ&jdWeq4__o7@=%>d}gUFQ?bgE#hcxv zjxq3^C+FaE+d4mXkA;bRL_3g(hzPiu_l}%)3QU!L;sT_%@K5ihv5OhNO#Ta$q|Xra ziwf4ye=_-z60vnnk+c@M=;0XPe z_{)Bf9*yzZ8}$fKvP7Sq^=YL$C&+zC4g=eYHy6)vmOl&FcBsd+dm9>L{xY+c3xS`% z$1o;@65_fW1A`Z>nO~q?tMYAf@13?D(GcRaGvcJMPOQB*y?aYy@h|46;{RanucM;+ z!Zu*|4Beq99f~3iB8bwVgh~h~?SOQrG|V8Sq#`BVAuXK)NJ~g}cXtgF-{JQ>&$rgQ z*8AtX7OXjE7~q_}_kH%>*L~gBg=h%KST^XsH*O(FmpB>J(an#&rI@XHWh_`(#~RUmPfr+^t$orKo?ruHk6Uv6hmdHy zFi8JD5t6ElLGZpnup+p&QtUq{zD-kTr%ch1731GN0#Sta}bwbCCaq zPCC)8VJEbQ+HkD-N}f4lxgqDwij~Qy5dhK~z_l`o2lrE@Hu?b(ZpKSD7w-p?f@N(ibiPlH~quR57l3{Off!$eb($r`8)ZYb; zADvPVU=r2p)}6u(spO^lc(a559|$LlNU@2FLh1tp`>}?QQ?F|i@^;=E(J(1V7$K_w z`0?_qfIR@NY?8L9xR&!G?J5s#)nm~DVoU!64Urd$771IsCH_Jzobd$(MA5d1xwo^= z$pb)?E2XT?M&!SzYZ@B5>ZYeU+<{Lh<@yn~p7du5yvSF+9*Jgy7eoGQ>MZgK>oIOj z$XshH1OStt#30OP84qp&`tCm;T3=o7D0)A(aDa@1=VG2QKM&uAnwIGcv5v9Y2Ws-k zPJXdCTt?x)=+$D%s4M2>l=JP7)UqCXU7&Wh&9e^y(!AssqLg2+o17oleAOzDaXn3I z-Y9ckzQ&iya>%`b$!>0C`WaZ(czAdS|MBBCm|QzrD=g3{cc%it&n}AO+ypvL^+TGF2nEC2>mnh z;Ee%p0TTD?#1z|pfWWOJ@PJ9OU?^?9?JndAIP9|ePp%SQqKFoEC&vFKa>LYhs;uu& zgX{dut`_&jO%{qtMWc?AkShQHhDSyors3xo7mq24l$Do1p1GE?S!X(4i|Z#i>x^Pm zyD=Zph4B_UD2K02A55349J{18q3kjTH+xfNGhtagX&w+i#udch`vux@G+grykgBT_jjl3S4eY5@VWR)|*BZm`R@| z7f}fOG@Q(pXib4NS2gia2DA8hnjo!I_rphnAS`X{u|I36xMlUl+$2%s^ZeS_j3?6$ zB|}(4@#-E9)t{=BRa|FxE*_A7&Tp>HEtBpaa~J}h-#t%=fc(yZ;E&i10JN{Z?z4pj zx|qKizPe>QUtck|smW{BQsCCOM}>KoyI!k{{8q*r$Gc15lhlNZp34OQ)%d-Z)pV}O zZ+JZ_wK->y0UuW~a#e*5wL_D z$~X!c-eORMQVm!HX-k{aRXhM22S?}b25WLkXi>T&Fq|qaawThQ&vroq0hA}k&gSYJ zFN72wO!HzhDzo1Y{{&oMSh9X#at7yp3GP`gMENl;8`IgrSRt*1q$C9B=;)|*-MY1) z`b);>xQ{l;VDWM<&cRe8qD5a13%1$A`HXV_&Jc@JO>!ssj&t^$R-y=z2l$X+zHK{T z_w4MakxQS{=1$1rq=7G$X3Z3&r7vyeE7(>Eb*G<-7zJ^|U<;vqHdx%T$*D=9H%Qiu z=TA7O85wORxoCWJt6l|7Pm5I~ID&huIR509$%WgOD|32Lp@NO)n3ZJWxknPV0U27|iBS){Wte z?%=|Ch+)2`eP;Fs7L1&1Z&n8YsMF3jMqQubV?YzseXx!N2Vgsr%XlCQf7lEwd|!MY z)TN;UHVFWVB^{^5m(2rXV|PF?uRkt>l8>yRm5OLdNy)d`U1$sldw#`hlabkFyJ_#Q z4M{(Sp5~an3M33(@j4dyV%Ne~4AQ}p8hCaMZPnj>AoZqYTs5c3P{@(-+&8QsfP@nU znA_osooskyCRXD;iEjpLJnw@+U;pAGNUO}ac@GvD@4Ca2apl&{6= zJM|8_8?}%}Bm9S=E?b)UR~MmVD-HwiJ~2GO(Xh5jf&p|J-nWmchAe|OFB+q$j`JXLWQ{`6z@#dibNf5KR~#`}NZF~Yot z&%%@>Zwn4waGbBJjdITfIW>zq>1XmeZEapJBNXlpv)__z^xm$VO2H}eUZtYo4}17A zs!bEEX5SnP@`S1X4MDS{Hr)7ckwE|Oq)aGfQaW-ylA51gxRS;+e-X&DBHE(wU%*d) z=nJ$&A#r46jlb(wlAfIWyC+Q3?0LYxo6(?D{}eass?ooarvxBSVu7op!3Wc2Svz?s zAl)aC67rD6%%>^F)YSBlOFDQv=YZV5_ASHC0F?>>ymPZ5UCwIQ7vhtvvi^^`=GopN@}z0j-Tc6v_*qHoXsF^P9%+ zIpZ2d5k6X2bZB#SY5nQ9pUX_81QEdk-_$*Hv-mR(h3-qY+8>ERZID5FvIYiBksJoCgsi1q4tdy?o7bU0o*Q*?t@y}&Zr@+uS7SflX0cFD zNDBd9zOBaMh&SDE(U$QbWStL)YN zaKLpgrMg2tkBXS(X;1MPIQ`4iL`}0!;7-XHG3Vdjrm=wdoi-M=hOT1-y1nw`#@C3T ziX~A1p!J@_UCDtNoOG96FyP*_eA9vS8)*8KggrfV?MoJVYeK4#$o*iP7hX|VF|QBy z#zm@ERtNWH36#*jhnN5f84wx61rvvV^ zK*B@vFVX5AKM|6fMFwaHSKpv~SI5D<)!2(A^uB#^0~O_gyE{90I^=ZZ&Dl5j1GI== z-&k5|j$%8}5fVbYQdnmg0L)9QB&6cPL$0OnPjL!LmbRfJlBF+b=dsW6th5b|FoXA= z!S)3{X#YCNEA^gznkb6>Zh=?|fUi^!MQ@LsriO=;F+F$2%gD$8Cm04fd3mSRZfd_% z=r0hvy1>o`c`)?}w1Ts~xhM9vfFnC9=V6sn{XovuKmFlPB?gnKw!CPx{?&*^44P~- z?fnAKZ{qxz$%cZmZLVQCieTg|8hw4io~sSrT|lIj&LCjY1Qg6AZxuY3zdq6{Hgu|K zTP&`8^Y!y*4H_E9;D*Lb8pF&?{o<+jr&dVH6bQVS5*5%w2q`=Bk4nQ`jqKEnp(FFH zwCwh3YYY{O+*+8;i;oe%uXpT_A zDRHvj;Obp;-{ZxQqIls?xgK&Ekf_%SBTHRB{E0dwgeTzx@ZQYcPMY+;1|;9`kU>|T zhv#R1_C7hZt&A(teE6aWPTAQANyxeHM@Mmfiuq>0=v?D$3sW{zOOtIyLG@4BWcLJK zLUgyi3eq9n-{lD}R~}yZarS8w!q^oeI4o4{ryPLd$etPinDEp6 z+Uv3J9p}l;Tv?%DWpxMFuf-jDc5hi16)x5yRn_Arg(Fdfmi>4jLF5ksxG=lC zUbZ0CC+ic8H7|uEObp?^oR<>&^xul>Rw=mR;h_g4O?cn$t*U)USeI9kPEVyi3?-9) znfrpmfYf+8N|5ebXuwtrr98z_-AcWz%qwLQKRRb3#^~%ZtXipv2Rd4e2xv*dVo&wh z3#0&E13}h%t+Fy$zsVD{tQ754`9CT@*~}Q%im1S-8rt~tr6hlfml=n|RuaLLR)XL| zCgHKmUBr1hIQtJ#I@!n~&%ZAH&1rl3kF_o#{GP~!>uJ=C!XNPT+hL(QNYC#}5vNUh zYPYN+-IONo&L7Dl$^G+u?U>u+8fn#twd!pUJ3velBqVwy4xH3H|Bkx9AhVz+Aw5b9 zP|>V+#=ow^&(CRw*-VslfRwx>+lvA5gT(+!DXMqZ!#S^g{GpPTGFK||q82j@+Sb5$@2~82 z2!v)oUjze0=VC}t8Nq}f^m23N5druDz$r2^d|0z{*H!t=ujT@xYD)Y<+V1;s4dKY# z0~>Id7$>kxgWU&f^P@E33{6=3vRT%69+kNWHdi-O(?dfPPy6hGbnGj9K&Rf73m8}g zE6ptHxMbyAE|)@BFS}6lSh*AF_b#W<+B=(|Z~`1eNotVT)=6~Dz1bj(@vm|*aa^CK zhlH8RX_xi%7Ig1z&|ZmoPNx5EAy;Lo;_NP5i`p}^{RXnF+j$<-B?|MzuT>06{W#ma zRRFSQ_~|x>9%>wi`TK&ow4V`>6FZZKf4UeE(FO>SvyaZo<`J1O!WcJY^X4$I5lL*7 zgZGK}>)fdo^baBHBGCs_k%=PtrMdy&8tCB! z6l^qIV?P!Wk}%i4&b{zAG&FaW?OUu^H|5j;5IdTlb``zrg3or-keJK>zl0Mo!z}PopU5zH8ba* z2Z?(Ob~{>L*n4!`v`L7)=||T|&jZOEkH6#5pQFDrZ&L>hRl8CQ;r9}}@rRJG21wptuT0IAs!96-uS^7^HX$JS;O)dXVQ0u&U;9<4 zwXYb-!QM_tWX3(9c1SVN>)zRBLm8#;SipReroN8(z!c%@9mLtV{_j{G?dX61)J@II zWIY6OuJSC?V1j+#7*`cQJy-_%sqT3RhExZ0ZDDx|ZTL{2mD$*6P#;MrhynMVs1@*u zs6tbq9oP2|N^wpwV7CNf!kUiOJX)youqW|e58{YxVlclay1ucXeW_<#sdcwz-??K^ z4@1e8mXowO7o(1^oyrFN~z&u2Wqj z3EXoKx^SMVkp#Q9jzYx?Kvi*YaKJ1EAtfaxFzW@ZIUR<<&6+en;RJxr;zK25O%{VJ z$FnYj1)6X&8C>}5c>b?(n3LYlq^F7t~Ll=kv$^AJSH(Qykbz0DOR;DDC);)U%Epj6t&x zeQIiIbRz7vkmq_BL4RpXF31CXLZ|V6FyH=dOSZ*z@B!Y0+%D`36ru|^Z~Z?65QMLo zhl)TWo&Uv8L1r1_|F<--oj8e}vvJ*&!sWTWQ@RE!;y<=N!fsSp(aUWNbY^W~KKAlt zH6tNpX07f9O#>-v&-+s$j!mE90)vC^-@lIoIzY;T`X=D2?u-DRESTozx8F`Z_n!}J zmGNGBh4PH{;hVBd!o5C^2EVHtE-A*vz6)D(kqIX{SEv_!78>(OqZ0)bBO9nm49zO@t3#3VcZ~#HaMHvicv_Mmx zlZJ?#{AFixMPM)NQhxhB z80lw(m7*i-4CvqXeA1m!f$hleYNy0G{pnyl7m@x)Y>j$qkj}ShJ;BizSslRovj3}e z(rDhEUe=(cG+50!yLXzvo8@#j9prt3+07ezL`n+t0tY+$ivKJ*C+7*L)9;me?x3nW zOm=pz)3b#ILBC2MKzb1YYMA17`5W*)XBhU!o+eblq+#|+U6BtXtKHwS`Hz=+kN?Ph zgZPH|WAHu2oZXX6Jq8L#FYLWkQBkQ#wJ@;@*sYw=aQzAnsRtp6u(hh3ORs`Exv!qx zX3MU;WC7UB)x%W{&2h9h_P03eOZFBOjn|e)h6M=BLR9HT-5Euw-m{c=1pox{to@0Q zbTIzGQQg++&*<6T-MzTev2Uc`GOj=YIJ#GgOm+^96GT?aY&9`VPIrUNebKUMQ(@NY ziUWKHG#LJx?@w}USzw1IW!t;PNiHh;q=CLE1hm?7R|h91^w*TZi9oh|EiIOTj~s_T z?K(_nM(4y61(aEIxh?Oo!Z85^nV_%S)$_V;r6yU7*me9+6+n2t_mDk}C9*A3PAg{4 zPT3s{!9STrsiN{GuCrqG5V*mxE1NaS4vEIY!n;nZiRrZ?XOk;9(JNfQGCs~tS2b1K zUNjpq2n0ZwUaq;^Lpb}Gh*_aXB>ixh*KVt zeSJH|GiI{eOrgJq%3V<(JaTmT9pJL;UOeyFF^rtH{VA0424aC>wQo$r`J~SFa7u_U zW_s-NlWXgzQOvJj?OD&X+sjN@C00CPZfi<35KWKDetpzF-pVpn=b5hW*||3*E2j9O zWpI%2?9-=1u)t#@p9tkDNO3jgez*mib;7-z1Y78_pObBcoL5I`zbA$|RNE@b%ggf& zMuXkmN6LJ)09r06NS?#M3`)gny4iHAf5PPHHE}yXjr4dsV>zy90&TKqbB$%%on?`gy!dvqw1)L%Ezu)%%XXXue?!UJVs z+0=qO=+nva190f3MYFEMU<)fE4TF0VX35Du4<6GYQV zsb5(zUf`z|e_wB9!*?RRum3upY2et;HWHh8;(yRDZyY-qJmsqR5`_@`9DoY|y1LIf zyZPFynW2exR7RNGpQsIl)BfEGN-0pm=Lk7h|LI8sCY;{7qT*BG=@#WQ6Z4bc304gH z!h8aY*?j&1)_2$p9-c%Uc%l`rBg$STY5yM=;Bf;6K{9@f#GdPN*GVxO(?(YAc=L`a zHHvLuv4>|GJiDmhEUH5`g6fLjOhjF5T+N|v!U?jI15Srv(C6;#@1Vk+i=g^ zN8TFhkW8^26%Xe%9=0hgZ;LS`i4qE5H4ps!ArBIM;0Mh~0$U5FyS3OO81~TxrXSq- z6TZYYlY&Jz^U9s!^Z}`qXUl*2p>=^^Z{8~S4ER33P^r=$6A=(?;M>u(hdiSM*Lg`N z5oa1l;5=u>8o~Uc$gWsjdjZh5;h*c$v&UD&p&1oc`iNOD{Dco2o=dY1TUmr|sj2a` zMd+K+nPxr}!OF_|10X5MV0C^#23#fB?(WHK$KG&d_w=nmX$Q(jKB!i**+Pw_ZZ+a( zu;+wRR$JewKmXdc{uWFy>fiE;ziYT=;Z{G2k|DbR@I=PwzSw4iGYqOwYzHkUMmn3V z3uca9N}r8t`b?=wqhA0gcsN?vc&K0b7e8dP12GUz1#Sx?%$QTtc2W3SFm9#x}TO<+2Ecy5Nnh?PQaL%d#z9buK(DH`M1*eTW{=`tn$JfAu>Ar9ItYs zLGoYE-I6Kz+bBL;;VWmKrcn~kXjE`Fj$X*gtrsBb}~G$ioglM0RRdV+ZiLO4JCD1=XUSX zjt99$l=C{fHZlg#YSfimqm%ZrFDgJz(_#7AKygVk1Yd;QCnZ5|%IfLl?;nh^PVP>f z4TU9^c#t-)-ah5Tu!`#4@UF!W`6STp%_u58U1qkY=cTV5U*xVdQS2`Qmef?D!;?SV zZ`l_Y7vWD3DGHr?uCsi6t%{71MoW!(R8)%r;)IyMq@>%syUhRo$sAHrE1-hZPtp<- zf4x<;z|A%VgZ6>ZOABCjA^j=g)BXn<0|a2~QfD0H{rjEfhy1E!)n?I`AbX!3OlyWv zFb@|%E6mBiJ3n3AOnBVx`HZ%Ap8oPneP%up@J+&;?7I+A(#bqTsO$-?$BSiQsGnL+ z$pR|ZwL!msLHNg;P$mk%LvAcYKszI@H2(Nt@DG1nARhleuDn)wh(uhBR$7edsi6nz zOyhHbjTuAN^j-&DkT!R$>1y|P5SV3WSB%61-XvC00f+I}M~mBl(Y@S~SYvQdP*q2T zh1t9V7vid-DPIr@{W!cjhoB&UmR++*)N>MVROn1fET11`AacA1lfQ*|(z{K-Fow`X za?KX4s3)O33eO^_8O1+0UM@e}_3)y~MP2fIH1Vc3reeEOzJgKwhh2~vv@}qm(&C+^ zG-wWzBT6XrSzHskj z6m7|_Cw!R}jl+K+t#OzTmxRlJM-O)sgwJ5G)#<=3n}Hh%vx*X^)) zpP+gI9-W@G%T0u)6K0q>St6-K+vH*b`XjgGei5Y@5@euP%_xbG3L-7JkZDCYK&?&z z?(A`=2zg#%p?{qQXJMUpyuQrd_VzDL4w2HPa|RaQ)3*Ug7={a-iC}qD_uZlC0I|9) zqk&5sI5SyyXjV1077>*#jWr2HJo8no)5CsfTCI<9sCVHw=>S!a%)U-!kFiL0v&uvc zA#oAwp}*)sS^c8gcbB~OcRJ4oTG?OM1tEy5RE4Y$DO1n_5MZt9>e5!0>O$hJ_q`V* zJ~k|`6`l1iIxAUMkUds&8R8P0EOIB%@wbu8YLqyRJrc6;iHepj7-aE{;NY5#LES_} zbZ-ql8V2jz!q^nnUoJcW*ch-3^FHWnFhT*7^@SMZc=S7i`Ao1!pwLjY(C=aef*WIg ze*(r38%*UM=elici-JDvr#W5{ot4uWO>n7l?fq~&>B~?vv&T&yt z?C9D@cRa&$@A6OUA);uyS4<}J?PhlNgPYtNMkj6S08G0@M@K*SiLV5j>WRDUwt(zj z^6Iw*S_wjCp%1_*4x4?P+WK@~HS!tv(6#hN6K*zC5uf{26r=6!u_43Xx_}rG8trh2 zEmF)5Gpzt>6eHN@4FCAs7#ymoAilLYEqy_VN4iQ>YPq*#?YbuzIMyss6z*@U38c;!DnfJ3*g zIm&#EKYlH*E_zO@Lm4}c0(-z}MD=@L-x!Er!tyq&IR9weL{{@vFe!zc+&nzRuyzx9 z6I+XCyqQt^T~$japA;DXJL1x(7Tgpgmf^p&QS=wUMitizE!xL5BOl=8V4tlVX(Q4LGi;9W@GB01^11(d! z%%~wDWAXB<)gNkyTY1~8Uh+uNySy!(5zA2l&nQ^~BOeWASGdTd&XX>+1mC4mMe5$ImMADM`MgJNnS622< zsA+4cqZ$Sk@ke*=iSaNk(x5pUgOemJi?6iZ-uF5?tVgpPD$1F2AShbAHh<*XH0G_E znP+xM!dCBY$Z=^PBXZ6V*Y?ffB_PZ1%NGH*q+_91gC56rrkcG})JORCvmW$rZcE?1 zs1Nl$ufHq61?exZedCk-<^wXJxAB;Lg$JzNLFS+!g4?+gPvtCJ(E zzX|Vw0JG~w8Z%&DO!jiQmsNe6DrkfP7+1LGv_@HmYk}#nV*FO8Q~9MrLU=DE_tG?P zYH<%H6?nE&7iJwn--C}MHv(IEPY)RFGv@L&Gow+@bZ1*}SLf%PO&11Q=7u#IPri#y zouAc_esM4Yf+M_;*!r_jkmD1FsE?VgPyL)uk&$0m91tM~0a1tA+J?4~Ke%d=l4L^k z7q@EcbF2(B(;vES&EZd!LMONc_<7{w=MD8vh7~-~GW3`y)8rIVZUi%0cePf|aLrmw zkIry$ah)~>m}6pNGe7{IA(s&-`OriHjut!u0tSzu@uRK0w2z={H$#E+^lX#2HoFql z4{&_2HIz``qmgvBD<@s}t`bfJ2@N`~=m+oce)aCBpMT)0_nyW5CA@R{HIwnmX5@n! zqM<6tA~;U+dGkBjt~>dtxLs#ZdY@RNk;$zxZ>S8R8R|y)HBav5nJ?*Ti;|B}0)z)~ z#)ck(G$cWr(==lBYKqvD%!zH#pk0jg@Unzg>&&iVBpR4#S8m)s-Q z@~VzcFGSFC7v&h!Qu^8wGt3B)D9>TUE~0-NT)n|Tk$rq%ol)rOtMbo&x#?XipdixQ;@7vZ~@02R*IuU~~LpF_W z&G7fQ#9(`0FXPjb71KEh-^7tS=RkJ za~b>74z9=UM#Zg9lT^o0|B1uBsKOi_2-_v*UN@_!o8@&kbAIsuUAveA?>5&Jct?eI zr{EZub~V&-svTeUpL1*u4mZhJJzGvr`b%m{*|^V@yehQQx!&~`C=4A(N+q$~^c$T1 zYtK}P{^Tb=50W4B`z*N3yAYfxJd+D$frEy8i(vj*(aTGW-=Owidb45_3lSMvJILe+ zCuH$xSw&)z6Np1l{A6)Rkv!^<_$&>Esp~l#eD{7?Ip>yi^5vgJDN3%`OW7=cnvvEp zEm&(!mkB3NcZ=s3lziK8S^^-f0ZgIK$dm*rbRCQ7Ae5d<8$S^AvyT?<3797L;Vb+! zU_oFp;w(OgvPGw^ZD0F}2+qne9}Z*x9$guK1&9Yb#DMq@_@q8rC;VO^$!|M?v!!l-;TZZvL$7QXhOIWF^+3bz`35N}1Nm_?2 zBZQYMn3XPU=X$@DPOTtal4zdsT)ka>zU3s>ef+7ZDMu$K|1eSn(G5HFMy%qXIl{H+ z02~+Jr`%tcyNV(`3_z5)LamcwGe@d7+%SZ7(R+8$upeMap3j86D#yg3iFE|)mXJF* z%U+sWxGl+bgB3(7^qDVyD0Z*|Toc2UYi)kw)iCFUJb*Y0n7|HnOwm-i$(2?7mSY3} zqzgKU5fJViDAw0Sgb<(){F~8TqooaAO9Jl`(xNt*#gFDA)ef#N5K?WD0EN`hVTk># znhzWIno!Jg5{zE1*GvW<4XSqu=id%T#30+Q)8-nCf5jW2ay}5y0Mmc9$hYlB4?CgT zW-^e)d)L7ic+YiP7X)5_zXt+ZjA%?pSCSvSdb&N=KY^_6_Y${03rOeeCvFj8GRV5G}vcX4k;~l;3Ud-z^LR12wLo)kO2~NbKl~jMu!6M_r@6idT=q1BR(3D zOVorpi$Hukp`=Sgj%eM)1xG)b0~P2$R23E^L51U8C&{0BO}di$bDCQU_cPl*^Y+4R znec-Cb69Fxe{=XR*|V37wy<}>_}D_ZqtWU^=?kH8d@SpFN$HS&^CIkBeslK%TR0A2 zMKwtL4OxOfCI}ki?2H#P@E5<~1($US0)Ewp z<#9NB7<|Pbc|>;#mh-j1e)Cd2xf4EQM&( z0HS>YLk986_H;bVZ?+6@`h!++Q~dbZvREDXM+Bx~Ik^avX{v!=jty{V5Zh#p{qyEZ z+h)2c#VZpUGvXX}?6w0Ce11(U$it*$Qg?RT-UUK7)&$H#J@ zJA5b!iPO<6G(m8V$>IeS-aT^cMb8FPnllZM4Bx%>a>HoeGC`o|--ex0e3rz=Fw4;Om{dsmK z?m5?Iwj!KkWj_q`dZdpyaEo9 z<_`}aVO&5Q%wFWxkO4*)DN)rvhu>JY#3x?;Y+RJD7TbW;ey|SMlg)a3fs6v+;DP^+ z^nJ_W72CQC>2lcLuv6y${)rWsAM8sM34_4(iWNZlLE5`_J0&C}008Q96l6*(4PI?i zCsf8jksT7qr7R(pc(%p&r_9(Hkm)O+I6SSy1ukp0()k2<>Hb7V+vusV9lo1%Owo#0 ze(V%cUHH7TZsO*8Ql1j8BQP$;P_6*Dh|Rd5@7muuzJ`MZ3$QcVB!qWVTa1m3c?AWj z0LQK2hpq?n%m7I3104hCdidp*C9vO8n;1r+5-`>4Mv)7Q;)@rXBEZ|XZ;Pw@<5n9= z<$soz;#R{hgitfC0ATwiy!|_ujKU{!b3bYRZgG`Z1;%BhgI4 zI6yFs+bqP^5RAQUTHg=G6qYU7hX1z5?lLTD1#JbuH8*tatqO2i{4CYqFCXNgf+cm< z&3aeDZfVB+K!&PLIoK>zFrYz$lk=EsO);~Db=V9q z*5Z^~1{9AU26Z|Va4jq>EQP^JJtL!ZH&+=FypeWn{eZNYIc*9+LSq3K%prtwl_vYfZNN zeIE?y)5nl7+Ip^t*rCDUOYQ3s%%#?P|4r!E71ei#xmYcHhxIPb9j{9mvve{s=pT&= zgIc@-5!U(r#H_A>J2hHDoV(U&fgv;E zR{aQdi_I!N*5`hmh_Oiy7rA^mA=ppL%vDR}1zd3le#yf0*JRd_$zd>oo- zpaiQ9$lb^m$g?!zqt+rZuX4suNeiSIA_%}beCw*|NqL42@tvoRZA$QF;WYPgyT#_& zD$U=NA7{4jOq&eqH%H%&C!Wz@qk{op5}JJb4heoB66_xH$RYUG+qq9Y(hyQ*6WR4& zzh>#YcoE?y&K*jLLqI8&IYv!}eKoZ6J}~$<^%38JzZw`Ye5sJrExrImT1s_e5e{8h zJfuuk7k|-+(vIre&v!xDs|*iVu!(aA1u`E`_``{S#w+Ol`-#di_s>9q7Yf3LuvP!` z^4)pFYPPHH!H0XPQmK)BV^wAE`Q78rw&?*1zp-r`{i>`vWmZkA{nTT2uM3y99}R?y z<5$w(eRA>i6^s5w;t^HqTL!E?d06`iqgJ{19N3s(Q9S;63lONjWHKK}?ztiHf{wlO zpQJOIVOUJUa~F;o&>P(sJ;%Op7gri;4p5E$WWCemCvvB7fv6_&V7Ba^x?3OKL_+TI zRFTD$l46dVcy-K$k)sm;gu7}jSLhB3fvlf{cW8?P+ZwllPJdNxcfwweJE0}ZW^>_ zuu;U#Cc(j5Szymjs@`>TD^X41!hw`uX&2HhRWLZ@i)?ib^Gc1nj$h2= zlHf?q(?*&NyyfK0=PAs`F?H`8w6=y^*G~eT){85?)KqcAvC+&tSNRL$1o`XYnU5`k zTwBvh$>=NxlYAc2i}=))zG0aAI}uRgi5$(;R7|6YeJAqFmqT)FAukI$O|BK_YE~k| z=vXE4(6O??R_H`v9c=va{Us06S?8Af8{{p|6lV#rbCp5tLiR`3#oo_YO3~(CXi#eqfa$~> zH0YV_(TnDKu<<}v3HQ~2a+^9?N6pIx249IRTo7sa2()By-t+Fp4avN;0M!)6YTQZ+ zE@`qO?NF67%rlqDck#0G^5m78tb3cC>t;vu(nT)jQ$HLYjj7b#b=X*4`?wrfQ1nn1 zZiE@zuBUrlY~I})y;Ma6ZDzwMJ9-NNC~!7OWj5J;@p3`7;b_{sG=2q@cO$5vz5!C9 z5+c?E(yqmO{qLH^KOY^et^kTT%my(s=Jt0!Fya;L)E$2Qr;g4F*H4tSpA+PQZpDi}zI58^n`A1=|Efw_ zC&Uvq#IN2Ek4rK|C2{**W*H`tG+h&)?XX0GAtdy}lGGCmTDSln0Z?fosw9{(0%T+v z_a}-Ji3||dnqWdW9z5`Q;=1{-fS8!r8%!`EPeG#S?Q9Ahj>w<(Wk0rd4%}<%FZBA7 z@of^IGTz}S5)3T+`{dhKzkLAaGM{(CHpQ}VjRI3#LW)uQG_g;wj@e{3eVfyL$eNn2 z+1Mtbc~a~VlqhdYir2%We4DJC4pAj6hTvmREx`9YZ}$&g2f6ZDaTQwb0IM|B-B2xE z%`u)o0L{XI>sFYTgP^;7){v1c9yC`RCtdbpf9|o(I4{SVwM?9x;1%G23SyIiHfe#e z_u9)x{!OxA>>1Hk?%tMYAQjQ-Y86V1mk!h3USB$_sdm(aak$P`uV89%UYr|iyo&mD zfmGDXPXpH~*RCQ9{f{lCTmV2k2s`)T^Dk!%>(R*A^*$4O{YxvEv;IaSRKulM>zF*T z?mK#JBSO}wTTBQY|BMq+7ne>E?Y;dkE~o{*nl7dd64S9mzs)&kZ`<6NBd{sJ0DOb>$f?ZMT=($sS-J`g8x(H*2W+ zQ5vSA%=bQAEX(1`gdgcxvpH69BpGy{QmhK&`w{>^GB%{2Jh>guue@;Ej0^8X`qTEP z1CS0y_<2JXRR!6ss05w*T-{u|lJe2J`Y5&3paq*52*6TV_Z9XYX*`;+Ra8X)`K$f1 zV(O$VV_>l6v_OX@N26zef*}yu;}yhrkMbOzE^qCxe$6ydlHu2pF>Ao(AX+U*H5y?b*ryfORYyoCl@ak)Z(j&^Q+w5 z_KYWrf8f#;DimWVkavf`)mIT(iV!Gs-CXdx&`knWK>ykG0Y7%4=pN&M*3<+o8<%0; z*FhU{=r7dlj;EV%f20NEP~}_$@N1A)hR`iD@*j}WuePNognWLTQ^|JwCdwF3l|b{G zy(?Pvjg1vIx925Lm6z{3$z4)Xb)Sn{Qmt=uEl62X)ju_P*>U}IHTl8ow9hZC$oCL7 z02Kp6Z*odX(x=6;GQna94?n*`BmJYlO0E6jww0uZcEiome$7DWUSJ|ZL8iJz|~EG|0|rcsnEeTREB)pQa%6I~W&J>R?@UDRLj zwESFaiD0z+$38;Y@>3j^^cP&K89&w;~_#Ktf#_CKs_Z{B*`;FZJ0_r_yA}mU- zWN(2BEw!GU7R##6y=(TaN@5_*LHu%xp{!-3t1H<1q0QXmKa6RX<(h z6}Wa@yV~YI{+3SD1GB)(a-fLg)9>t0e*Oa@BO?Rcobc&Ye!<7Xvm{3xqOzi-mfJ6g zzTHP}v=?UVem_IP{vN!akn>VdRAj}6g9`Xdy|Fyg3(X)j*N8g)3qo-(Kxh`!PDJ*D z6Nr0b8B>b#-Eo7 zDDpG*@JrP~#qe*_h*IhQs;TeL@xC^(`RK1O&8mOfX7uqH0r2_AVWGK6^=hT#;j{U` z04bA4U4sLv({>F2N zwO)_u9qmF|#IKzU{w|n14Iad@iiCdSc2>G`*7cB9`J*1j(v0+c62S5N z4LN+Bk5~*0Jf?*#Xpmz4OvalPK-}};@iDj4!@OHEIRlu0hRJ(8QGbfVHBJxM`VHXV zHg2|bC8VN@8IYzAN$aIcbzIzl>~hBK=R(JdrtL~T88r=yN&*f+h?10ck>DsjiF|DpXc@tMhM5f4>2yvO%%6Uo?M+PEVZHI2Uq$j>JtP9+wT1=J@ncu9CPYqa#A`UpUFj}Dy;I11*q(%52O9mui>@E6Q*^2@5f zy%*D5ALc~#IwUwK=rNbWUGrD#e9)dPQk-x}h1Uc3xVb}<9-9Q8GvUB|skg9~RNC*Z zHfMubBb$EpZuDbI1)h4?y{_z-9T>0^Bw-avGoh1#;=6k6b9_woxZ{ImF zfLkg@5uR z$Se(OZuT0yK^U6!5Eky1M!zK2bCC|AbaAk>5_CyxM_wGjCcZY=j29Wpaevc#4WDkL z8XN=1!v|Qs{hiDuw14f0h4IN};S_N&>(>ubp{?5Ho4gfw=Nh#2K~{Q61+>Xdc^Ib9 z=c!oP!HN+DlKy!;iLkeb$L$UQ9|scqrU0=Egko>w;B%7~IRfvv48oBDQ~N@kC~hQtXyeA)@xPmP14`nsL`O z0;JOh%<`j@1Pp()3L(TNK;T=z{}kp!1dxYIcR7JdMSK)Mdm)DIzPJD`PzjN7`#@mJ zCVGVi+8=O4eoPU^t-gIl+?p$R?QU{B%USL5|0C|L!=j45_t8Ul2}*||t)!&10!k~0 zG$bD#S>oEc`%nKNhB-skMK z-?i5Jc1=$C{dr)S$6=!r^n)EzB>n_D&{hvvQF53OrMj$D(ZBaIwjD{L7KGp9(;?uJ zm*vEx%`+P0z>IjN8=qPsckb?}&?rB2ldHDi_N5pfq0|2LjSby*$flHIopr|whu)sn zneRD`!=s|uhd?x~>v}+r_adShlh?vn?jjd7Fff3>DHC!b_xiZNa?MPAw>#6p2PRAS zX%tBv_dx$dMVgq6EeAnZkG|h>o&Xz6UBECKsmBMNZjIJXA*wM>e-A&-FVcn2TRA0; zo#9gIWxcyQ&NkhN6)fpb8Mn6^wV-4Llq652&MR^mZqEpN@T_tfnYdPUFWC)!LktHV z(oblnl7r$RZ}BU5z~BUcDa0?)gIdz0e)f`qMwe+Th;~(wMxf-=*st0Y_(Bp|nrA6K zJdM3>c(nNE68h2I?XK7tB|-M6P*+UwESyqZu9Xo6pq7|CjHTtP%{jt>!F~cP^eB19 zd$Q(CbNQm=U?S>3fCe}%G`$O6oxFJ*CetqLs!H_+u#nq6Cu#_2{H-ziadjKVuO8q8 z!mh8QgFdaXA0L0H&Ao>S+Tb)lM4l4zbnaQ?BoN+FKSp(XBmINK=YpQ$c^={9BoP{$ zcy+NrG+y<-VPWJ>xvQm`H|OnAoz^F^vbtCb#aHzkTAP>AWtzsx5?zHA9rPOV5e-zO zg9HTG$I4Nf%@%&n(h{Xk=^w{PW6~c4yzz&r-8s3K^=w@W(_n&-ryAV$o9~U@xT>c} ze3q1y%*@HbHG`q5Z>M9T?)KM7l1ywg4~?g<@M&HOsFrl>$!r0`7cAA zg6om+t)m^SroIMPQXm&k&+&=+x;i!if#HoI*3g)s zuzSomDWRWibOl-gz}H#nf-N_A-f3N=z^ku49BLq&S#G&7yiIa&_G>~d@~bzhL<<~` zYmRissXyrbAiQuC_CrA)<)*`g0r~c)giZ)W$;wJC$9s4-(*(iiK4uc9&gmmt3#@G` zANQmGSFi z4U{h1i|cIeIp{GJ>FMWL@8EB+YWDBW1+{AxJrULS28DqI(>EucjFDfb=l^l|#jmcQO2 zyn4dzW`thg$`{0Jk+&aZGHta^(UlWoiD2M|Puq{f6K(Z(;wfg?_Tr$Fe%u7v*t-SR)bT zyg%PkA*bTYSMuuzii|3 zO0OS_KKr~_iK;!rfjBSKyAsGOl5(AOAvR?uQfM?WP>6A|!~zTrs?o~$s1aHMeA?mk z(BycExTaIXVieZ7<;){5RjM2vv2vtT+9LI=-K>Av;rwLgH+Nd}#W-K<`MWU^J15!q zeej899Z_YnqqwR`cp&8`_q(*SH5=qe9Eg;Vq(nk!kvSzG~@jVyOds@GV`Neis+^b)LVwA$yb0 z^2wVwf|@ghy9lr~ka8PelX$cb_-c|G#X0F`GgQ5cl%@x%5$vs#jvdyo|U%ciW&7-o9ZMs=w+ndo8>eI0h5ji~hHVVuNLdl>a_UE- z)jpWLlri=!lcOa*TME@+r7LkhCX@$NWk<)y51sdA-#zMev%)G z{q}6@gHKt@Mn=$dsa)Jd^oL064wdkBqs0HzN)^o;?Q=|&5JJ^)`8&5$fW8FWSSYEe+Ki2jt7d`gz|G4$>eN_Q_XxpW@U(F1 z;CDy$EYPb0soKAsC|G5UM?X+*#>ig%87VK0PO_?PcXxJGng+bKtBr{|q6h~6soE*- zi=x~gue()qY}~`{_ssbC*h{oy%=|Mc@IuQ(>1FuT3Z);;T%Eb!67ukmc zOVz&m@4qli?P38H=w6SU0v*zc`~sa%dr1p_VuXKO+1X9=n((M_X79L7zi2%}>P?rz zDX*7C*}IEgFOw}1|4ur6#<^rSy5yZ>6{qo5aK@5OUnOj-Fs|ZmOgKD2_Ekz zwp7<*B2kPCju^&E@ke>^?MLe1NS?Qqg#+xJVX-RGUxZJ8d$eiTxNY}|);I9TcbV%# z+Pb=L9LgM;ofQF;GHp67ReUQUsjg1qn_RW&x*8k$U^3mXtdcj31`$!pEIfsNFiHNn z^gkn^5H&G{&dR!Vd+Iiw11v-%BNUC`BQ6}87`&#I(*>{U~ zD+s-LG_E=7H(59aL*e|>AXb?e^#Had-o~>PNKLVeur z#Z;^V+nBjoxutVihRzL9E0&B$E&1iiDg3B}nP~K55ssxtl$i3>I zTUlMj3d)Hw$3sQBi*1bwOjrE)hM1TLJiPX`)Ty;NdULIzOs)wl3=iqf!_`KNupro2 zYhXo)bp3a)j9`V99@$?e`3vC8bIgYEp=?ep#%9uj4!@=ZU>8&IqG1clfyNkY%3{GnVnDf1pT0(DTJ+Rd->r?;zF z<<@g`KbkGF`vA@UEb;=rPFuN^ueFUkjUPz0k<@dOaPFwq;3U6r*5X0uV@N&+^ku%+PoKWcgrwJp109uC7zr6Lmr)vjPao#S&Vs? zv^B2-4o}vtlI``)+REM>7NInn%x0hb-Hz6WIjoBMcN`+LDw8E{$D5i7X0Cr33PmkN zRV15YLrjK9tU9ivn`4jbN%Jx?_cdGB#$Z20uog`>@gbk0eyfxoMms&!UaZO|?Ku)i zaO{GKzgOjPsX)R{ccP#(iq?@K|BJW9@!S^)~q3TxwVUx@X&`qIfR1zYAkZtqDL+mdP$@vjEf_6ajq9B2U3{bHy7 z-VMc6q5dl-J8=K&TwPsl1F!+OU$g?EHbB65bsq#WHa-3QF~?pTjx$xiv$C^q9zT>h zowD%R5khOwfnEYl9L>zl`tVwB){;OlEx(#1xHB8*jB9_=Oyz(+o$cG6aptR)LZzWS z(_vb$BN$*1i*KCV?4K{uS~RgO8wV4sQCQ140!Q8tg=HQGtO*az(u9Y$OC!Ks>Q+%v zLHRl>?EWD(QlsFdg$0L5`pL=mBGJ?w0unTDg-GdI8@1iH!R%U%NJG0-ZcO5Ly8C7M zWRpQ!TI;NkSq+z})RBQ1JjOmXkn8!;Hcp(QoIm#VaRByU7N#waqE1fBEL8B?&)g3b z4IYQT(+O(Z((}vct$^YWsHmK(cjw|F^?cXc-`_EmdY{9-sWk`-r*30o1Ald7WQ0!8 z9QyB!TKg2-K>-n@obO*tezBV057(!r^wra(6OWDR1EW=ZsSVR*p7=9w);gguffbRL zN5|FptFW||aPVr-CLsH1&<}ss3mNKsC~{g*`ES?cByIkZelmJLlUzL|{79X0b1{`yYGMfP=1!|^2Ap#2Argc^Z_K`gqB zJ`;Ri#3|l)5vI1ipA1U?yX83q3=|z#2KtAB7f9u@@4To#qF4JZHw`o`%BgKfa26y= z;Bf^OL_FJchFwy`C3LCW3Jql!Jljo{>Oa7yo zBp0I6xFvP(>xn`tNQL85Qj)q<2USFtw6vk@xVR$>Q!OufX2B*>rE&F%r`H z>y##$`DJAnHfWox&N(JJJd-r1fd_JK{)<3wIih~XXZoabiXlvbsMz@k)_)(dh(3j>* zoo}agzw)&vFSFr(XHG*u?bY9@=DvKMzllbBFH{nMD^{o<16XeTjyKxy$(i2j}n2_Ox1kR_De?@VJQhjzQ&6&VI-7=C5fG{*|ma#B6tZAeTR|KtX2KCapNE z_;zQsr`HK^^AvNRRsd~chjocJR+bR-5*u4EUg)8UikcIk#FX+R2LO_-o%Bai1Rg0JD zSaEyaRQZ>>*hdbxudi5J+i>AL>aIEBcynN3fd$Z2z=s-wKKf@grA!X=l#vkj_4kuS zQC88k`IG$U?A*L6o@JMkN_uPs%;ikkYRI2HjR-}(|1jR)Z*h~D%_1@1kOgQKLmB-FHB5#C$P0{ zJZ=T{;BFpg<~gTybWp*9{*(n08lMCeAwE__*x%STjU4d{_HztKSdo(e#u?cT?M;Yy z9^4^<1vMY=3f?D$$<^rC`C6LtMxfp=5O(UbttvqB++BYrruYjI5RJE!9z#*McsP^4 zlB(e4`zxGJy@6+4h?t zdGI1DD~m(en*+q(0f}1BBzv^^*myA%#2zgjqA}mN3|LgZY%cI2)*hx;0NGb0=~Vd4 z*hzSc{)d-mLHL)|V?gH{W173%tDW~2YWe_8Ey(9b#ve@MDiz!3-xM2~E;#e606yd6 zg-~0qrXD5-<0pfCFZ{R$RRk|jc#7|iri{l+tbn5!ijpk+2bp*-;ltrc0c^I?YX)LBJV$o=L$f+$|UoergOwO ztN+V&D9Ad+sZG*f4)Cu=fqb)D{QN^J%?BqZC}&R`d}adZ8y$*8c-Ayd*KDBaSAMPR z>B;0&AmSdhR8a=+l15+n7v95SlPja)G2rm=xEV3jIQLtGouby;7n@olWiBPMG*Hv! z%)_A?afU6U_#kmo3^Mg*u_3sh&y+&$IE?5{b|&vBf6-CZJn(1zX{GCs@|yWJq%s?x ze$*w&m`I}_Z=iA0!Exs%F4oN7nRfh3Ra>;Xo13;z_lj0g37(xjmXQ(nUJfqD0ukxb zuHy#fpkn$3>zOFQ0h)EWWzEIqR;bE-=j>1@TMz3RU@Ez7wezb`t#66|43n=5TTTNv zBNYWPkhV#-pU}5bo(SVSK?x~yVldz~bH{vfaWAuh6X*jIG~o3u0TU+3I!J8*4<08Q z#3%0;zHBZ=?vn>bfX!O08K~w61q|n|AjWkIj*c>iCU--w_kkn^(QexWW@l$-Y06Qo z2nx*mzkl6y_4E|8M_Q++=|S`iD4xDCED1N}S8>>R>_NH*Ma775to^)1a|fKWkvA_2 zvWZ-$W+7MHSrbn@pzPDiU$858=4YxJ?kuC?B&2;Vw$FzcNtC~{6;JMW-w!CM{yE*9 z#XoBfxD*3}?uD~;v=VCc5bP0pDMrv{juSN3>?C38BkR3q?6BA}pOX}R{QFqjq%(E> z>GlVpIbY91^?LZ|NVR(HzSUI3dCR%qdBM@=<1$O|bQo}W_K5!U=F{)0RhRG0VDPQQ z4?gtV-opC7UQ+`5e$|WL8jID7Z*QAuTiTFUt5~Mt1{brhWqkh9zO&AYZk{R%sLo?4 zizXieCh;ixwlXLO;dR@B$K&c)uV(?wM`je6>QniJRW|fLb3O*lL~s<8@=VHp`wZ;9 z+cEl)Rh(tHJ5t=9(p>W@FH#}(zD+IOF9CA=5Gn80zt2WWoFsd|ik0Su{iocg*;!fG zVPRnfKy%d7QxwQPt+*LEzE-uO*VcWCPfIikS5)dK0ax3bW#{E8cIaf=NY%jiI+WqP z4(+nPJT`YkZH^h8n>>qJe70I=;FNziT{@%03&Zc&{5kRYN4{D^vD-~3MHOIl#mp4} z7YZk@uAf@X+WPu$+uIdMQDY>a1s~%6N(}aRc^MXUceIHS(DuvY*ei3R-1Im z^g{-{wuLIwvh^%HeL=n>5f-&6fc{b1CL2#~{P5Cs6nTT`zSl=a2kU$b1YRF~Xvp%< z$qBvD;Rop#&Z?<5KN3Ssv!;p)wl!^tkWmMTnr6%6$M<3_0 z$^qo&)8{xMjZ$T!(%x}4_Pf*|eG0q**Zq5-pZJl+^L-nF#*LVp0~C!=gwr3i-*S>b2xE7?siKI}5uGG!dmkhl95Tg;j zs#e5@G0|TU>4))JT5JL~x!Is)W9pP7? z1?$a6?$3SEdT@JkGU6cFndivf_KpyC3z+>%zcmb)2N-xJ-adkg^d)xs*^KXfw zutP4&Ud4VX!N!F!7pt^GKg|N#f(t1b{pIB3zS(+{+s~wirl+Sb1SEw#!Do{k8~)*MKZ@lv9L_5TD++R*4gfw^Y=}^LhvmgB&_Gai~{qw4N0q;k8324usBL4IyEzE|hGs7Zi-5VOUFkC$oz@O<2Y=9#0wr zY^hn92-oD+dSo9jM8~T{zEn)ZT&hHY8c|R&|NWXkG=tUXz9n)%gGtkhO;q%HVPPTQ zDPzOMQfwAF!xQASEmU)11Q3$)zeK%eny&F6TK-)@_vTa`+N*oS~>vJ0s%D)zHunoX!gOdGl z*=P~#SYO#DQ}VG|-LhHLyzczoT1Ti^p&cdby^I9UPpD2mk0L2Z$gIk%@g&IWW}7P| z$jht8`Kj!9QRj)t62DoX?(Z<{t&_Gg1^k~CPK$XgwY^xa1j({XZ(@U@x>6M=CT$<7 zf53)F$)j3F>evmBoTDzGgpPv`2I#3kP5pQ4`y2kZUze%C&C&Tw>W2LID*Ize&OCZc zg=MUZ_RRPM2i~_e1|))iZoK%i0hZuEn!HLaNbD6_Wqx{iDmjAwLBO(eDQkOw{Dp2z zMT|;E$GnMA>CkZZ?v9%y3N=6>=lo?gO*%Z0ujLoRNt^6=O<~G+#C~z1%b5#a_q6#= z-OU;h8gX%R3jsw#f1KlsQd3sUKi(85yJkP>uukrf!k=7j=}iVbY(CU7_)&xrokijx zpQac@>Glg3!+J$oh{M?izO{;r*Niu;hB|Cc>|_ z{h@cz(dP6xHZjS9`dZx!g7EKQ^EduXLgZ*8x~Di2cjnrI`boPvZ$FxGQri}nU?rhj zA~`%X?vBY+|4foW7__UQ8@rMP^MCg&_txX;73+W<2PX4w9`pX`>;fs0KSA>Hs>=dv ze2k1iLQ7LZ9ruO8%XW5i@4pMi!skL1Ij=$a!XKqlM!d1nliz$D*QZ}KW z&kK#NMgFpA=>Ree>ZMUJT1CGCV|(M?6ct$JFCB87CugCMF~rpEv&*kv^5|)zl}AsL zb>skMLS%nIqV`%$Y`(7LPz&2|a6V}Lj{Ywj+DVYRVW?zuR+@MxxxoQ87+=iQn`VH1 z2Fx#g-}IG*1rFdx=-G9A@=p;r(38Qh9tSK4fU4p_=lY_3WZ-clwUwx-Xu{z{?OkEa z8AJOFx_wLbX+oe7fI_SztaB_j@=a$v(J(W8QfP*#_4M@gkq682}lN_uCwTavE zk1&Vj_W3%ddPZ-H3}wlBjls3+z;q`*J4MK`FFN7sc19fai=V(QDmi%5{NYw~&;{16U%_RW8U*6@9!!eRPRf1U@kmWyn9%(!q!^a=wxMOG<#7 z21yvCyJjX25RfmnzdT6mex=F05&=Ju3zV!$pKOrk3G5OC8Gtd1-XBp({B*XM@>+*2 z2Yb9*|A^wA2n34moH1=bc;wv|SuCH)wL~}X_X7wq!fZ&){&Fz)>MTj2H}V;UH0p^t z0RTr*NWi~I2yK0AX%Q}bM?q$ldbWcF8K;VoWxirrt*ny0s#n#l#DUtSD6t_5EsE5? z3(eb35^*VWE}Kt0(-@#c*uV0|w|-={&L+xpXK%@n3n()&+r)^%nDm>!{#9P$x<)I4 z^3nf7bxL%e?1KM3bX9QZ%nkjw^pTJ+Gl;JNrVE*R2jHs_5$p$mKgu%djykD8*ml$Z_r!LtdCoHEmn}xM4+yWFqn`HI59`C{nba_v=;!>rowrK|*g4Bh9zY9P}O;8T> zgT;G0T9Q#8695*)>aV))=BnL$_#eQt3U+LpGFMLz9sC>!t2^u$e;XAQHwQo^ zGxPDHXLkUD19UK=!uq&K(r)DuKBV%}f^l5v)#4?Vt1MijT4v|BIU7`fYi&d_CcN@> z#m3BeOJ1G{+L@`O(2~23AA}9Le{Q<-^{zj(;r^YAT*ie35-u zK8DRW=}e@-8Dvw{Ro$kVuazOUG>!lFV`Dsn$pVqKmV-w)dJ7kZB|f-;v)@0RABigy zU}>b`n13W9I8Q^+V_r9R)(458PZ~xV!bjh{jm!LhNR?pXjaB`Awg5QqosqO4>z4(F zbR9rlIyW&geN_5zqXKB_JkH}w@NJu8ROCH^ug!~38#y<1$@(~-n4Baxqzma*29I33#((|!@gH2c+N(Yf+UR!1*B}rGc$Aadu}n95>4`7Br&IS zydiY~VB+VPbY0f_c>2WHjd`sH1-~lc2mL@AMgAxg#OZ}+c|G=6-ne4?k7LCgn`S(A zHWn+MmytI^s7-~z7o$0k9fndQ9d3O8y|F>4qM`!C+1ua`?hh!|tQ>u20OEq51nr|N z*C`t~liH@UOEdHb<#1DE&I1e!TR69|N%rQA8dKv^K31(*?s~cGFZ{GL5mbeP`v0yZ zSa4R8^w*;Csgp(TWUEK7klUVX8^2!&?&b?Q7OG&IN}tEJiC=cO#;6xLYTkW7xP|~p zNw2pr`S(bmFDLCJ2*1U-;@ZHi`#K!sW>q#+$)M!3fkiHg5snObBV=(U1gtq*n~hw= zbX`U1n91sr+v2~kWBN^u46Kx{&)_2zbo9c7v!(ZJ9eF_y<|Iu z9npgx)HXH!SNScA;ZL0r!H5CKKaux3z@+xS!=+FmcTCLy$`07zNUR?pJ7B3&83$a(*$HAe3;pk)6Ja*($cS=!!x)fR^DQ zi9lmwN#>{@U2fUwJ|U5Te~9#+J0v^J6GRr&x6;o|N@`s)2iS9kioRhS#7tN3| z14|eTnr5kkz{17GfLo-Ri1t{ng~9gVOhA(Bnt;cGxf_TNlDuMFB7;i-#za{*%1I61 zKs-<{T9*v4rU3U5>lTywCWaj@T&x$=-8a{^LkDyff?fm|LBfz&!MAVN#U(+_ilMEi zXh={g7qKd%vjIeZv$6MvoS-0G`EKNgek2kpXg$RAs?USX0zi``%JATrD2OIkNbL7cqwx#*`S%U{EDuWh` z#Mmp{IhISAALfv=b#@eZV!`>ZSY@we+?xYzPOCZEB?7_yk27ty=Wghvrxno?X)}0x zd$Zlbwzaj@Pe{DzYKmeW5fnNk^Yiojks^h6mY;Sli%-P~$v2aSyFSeHirNfD&Cxj; zO)7picdq4+(#Xl3d*E^)iw|k?Yuvjer~fM*5_-mS4Of@;`c^Dzyv%={pmpq3y1Tg4 zQ)fmB+;c};Rw2~d!2rDQ_Zq7p`T}-leDNq~v}X`ru@4`wwYF8p{(39lq4aZ#uIHVX zn*2&1^4B*U#j9W%zhho=X`at)Ji6yhD|!*nK79JTN~5aflu%wM2*KS`t6*FBHyw_D zawqes;<0JJz$znf@TRP?Kpp>01Tdgp`FOU#)+ya;78) zn2i1+qo5jpb9{^|A@!PJ>?><@zPDedLTkqlVCk5x03bA2wD~K)Qb|lKfu5O6zK94j z)q!(lSld+;Ehjc>xzrYlUx7v;gmP7bJO*K}l!bSgjfI?$4=rEawjXF|4&@6c^)>BB z;{0?dv!&EF)TJnT&0CK6*^hDO$_gRojV1o}HM1_^W?8|GityxL1uL@ew!b*X-w;vL zr4wX)=y}|#07tfQ!u4GLD%@Ud5s%VHky>y-gbSXmFBIl{@H)vw8bZKmNh8X{WW|sA@G6;%4iA0+nN-Z zNWi4*yexUwD$2pfN8;tAnRE$+KFYo9aN~^L{&{J;Y2h2hhF$+#y!t}?p~(gEL(U9V zE49dtrMc(n45YXo8a|qKyu@zbScu-^LE+aO@Du=w{@no8Du_$qdn!X*K0M@lEibs5Cpn#BC0y21z zT=!@yW4;KMy?F4O4+~3v?FlVXr(rN-2#rIaJHH+I67%)_$l5e4&}ed}f1eSNPLNwS zbxl5?wJ2=_o9%kg>yxd_oQGTf5BkGr@o)6vW+po-tH}He%pLGj4ffb*<$B; zjq&~-hf=irMbSk9$SfU1i4CTnoYph(e5WP5cwpb(-xb_%z)TaxF?D;1cs)nZ2Wek$V}IUtRMe^o40CoCM_u?B!(c0w}ob-0QTU; zb2yJSoCp7haK_Hjnsy3lD?Sc?j-p8!?gu7PE^Zc@`ojH8{<0#8?Y(cccjrubHQx91 zKM+ug#-93>i^Il<_mks}sQL_-+H@aGtfr;8j0ibFacacb0 z-!8$_2=sKwJ}$}l`ZvRB)e{XTeh}V1c(6Ue2`E!P(FVemcgK~|Q1R?=v(y@bHWsJy zU=j0J3i~O$8WH@0zHmsD`0l6lY{iPOgiL4m&or#L28a2VI>SqqVU@+lFngGBkpVq7 zkL*_P^W2_>!}wR7tSZrY`n3TXv1sS{Q_-Z@;O|bz+^HhEwvkp=)F~Ybi5byKxd5=E zlz=z_Rhv^ucSHf*yg8bJ4FGylIzcEcZPYmgByr=D(m|l91ZBrq>m0s3agrRn=e>>4 zm}{YT5=LbyZhyDu`$}W<$J9aiCHweWayUW8X$t8#sYDbZJ9~~OC*O6y*C+Q77mL4& z^97IYPA=Z4dA5H9zw1!!f-2~b7ux@MCwo!uh$YJSVwjlvWtKWe_Z*%CQ*a1M?;N`wUx~Ku>`cs;(?AHW-2OLw;!sR z-B29>q=H)er`PeBlDS&)>t+6IYh6z#y<-*vME|HO8*P(6Tdl|6ys047lC2WW+j1?s z6#Yr>LDfv?RTshN=%j5Zi*2%;t#-#(k%=7+bLa1rXMGJmRn#mk1r%&DLH%EI?_4C^ z=jW#*y2O8)cek<}%8o+5!H?5B&z+Q*%EWW~j1v(jK5{zvz-5CjwCN5X&Gm^;&kq>C zoJ9gR9J!Y}#p8%YW(9bANugFGLO}dr__%C=DV{n)OQDdc?JtK!@+_7B^9X+gB72eL zN1X51C7adfe@4dB{T};qWN@U$gOP-bugXW|+Cc#U{Z<@pzd_99vZ;kes)NwV$&Oq= z+yCSOh*t|A`g5?ElK&Wl9SqCelD$j72b<35IeKzE09=4?Bi}0;516DN-6_6&|9d#& z*BARHib?W|uaA$pn?63&Y9cl)&wvF9-!VQ^^1Gj7mAf2ImVEseD5Pcb>wns}BNt<8 zipV~7xWlZb==*2Wn(y&xxl#Zw9*;P2K{alEs*I_0pmK45R#}?7SDptK-?PJ5pMeqq zGwiXBY|$HJKhv!5fgy04Q#F?DNxZ;wUkSBEZA1fR?=zUaK zo&uDPQ*O7x9lBzUNJ0WBXE@uPa!ww1a<^i$SG>CB z4DpJ6$A5p-GT&etTRuRm;z(Hi@w1R%&}DW`lViy3r?KWsKYr^Z&8n8+|IqMpxpy## z(xZFnP5@D+%o6X5wcsppy3uQwR`55nBOXXmO}+5=!RYloY`gz=Fr@7lDHp-$0x?i8 z;)E_SX5FHgzF!D6c^YYUv_wE05Nuze{qOs0!0T{^xH5uHCY@p8nyU*Ny}} zBuyxYKa6Cp`4pwm3qhX}55DO#C9^~>us$wsVm2~nZGP?>T1#YtKlTwJP58FKpI#QO z)e#cX1_f!AoU(7NjxRZin&OXrx**7~YFRy#%o>nmi^Yj#;7AQ=DC$bL*xvbgST<}y z!GL=Z>ofX`S}@?OhFHz*s~84Zu`u79%JFb<3>Par>IGuY5eR~7JK)_ixpwUuB@N9R zfE2XtaLMrSC(z8+N|z-hCdP*DITpdC%^iPo9d9GD+tJ}#vn}t(E*Z0WtfGh^ z<=tRME1Y z68ru@Q%_7EWR(jGf1;%);WM(&wfa5s@Gk>Q*Avzmo$=An8=AwK@p@npFPKp;2W3?B zU+?vgNTtn1YHv7CeWwL~>1bz`gZqN(9o{+NWv3naI$U?oU8ta?RC?wjWWsnFF6jmV zw*U81?xW$)1XzE2JG(x@uc;ft~?CK>g>S7ws=6#ijc z1cMO7G$TfVqx|?mbi)w@ao@mA@#j}M3VZ%_ma;j}Bnna9I`Vu`}1tO9iA0*70%MElZODDM; z38;uuN>n+rjNt((F7INO0uuks`vwW@FK=h81B!L+_m$Lr&$GW*^|CMj1OA_7^tnTI znQOriTgw_;c*PxCLX`nF)ZviBx@N)7B14*p0rMl2AxTmW#vC|m!g-P|fsw9mP=;A< z3>E6TFFPcUrc+I!(vQm3U{R&l4tc6SLulxpbQLqO69N~)op$p{Tz7mn+$W5_XDG?@ zSF2B<)#=M4YjP2J2BLGTBV|&sEK~}^vzck96)#O0MPQs{E{nn1%@+He_hNb|I>3+5 z&0&=uePMNW-B1%H_U&*K)p^lX_u`r@?0f(rtn-@l*I<0AuLs#vW8$>Izs*4#eW zzx@j&uL=gASPi914un&%77C%=dR9QWBIS>4tg9GMd?PVg67+L zny*+~JF03pUhlRu?qe*!pp%UjQ}F$fIkr3Rh8#boeg0UxwgN#Dcd9$7Q)kUV`v6Th zWu3&^yE1=6Cu$^7d2B1$6`a0k99n`3p1VOHKLY!Tl>I&HOYQvQ!3(5-Sw*;K)8Dd* znqqXc#l%4E)*G~SI=^Lj4ea~Ua)ct>+qrRlbvBy0f5H0wvT*h3=|0YMPwj(&(`0+6 zfDoUtLN6k1r$3$(N7KJ;cA+X$-=_@{kW4yr)ZCA4d^laKW!LB1V#~StK;G_y^MlF* zN1GcCj*dd0MR57i7nguQQjKJ>@rDFdzxlr2Z()^WQuTNl1t+F7)e9dqov>_vJA``j zagoU3yKl!c9$ae@7NsszAAI;)`CV7ghY7D5`;7YZB$KyeJBot=){Xe>(KlUODMRzc zo8}oThSXSJf~|eFL}+RAZZ%Q(_Wn?G$Fap>Lf{>i#-rt}l$QE5%qrhRIUb3uqJWW6 zQkxB#_~O@O?mdC{ z*tON~@4gL^H#~>N++@l)HpQ1dZsKLFN{2X@iUesZrm>Pl( zIXDu8EW}<7Bt)Knxdyc+Jm(@5{k=9p00A2Sp@5}{L6^ZABk_*kfA+9J)92CHEsCAR zNaw9QcPbX#9u~8L(*~=6>71K4&QF))Ts*&&a*TTAt(pG>J)9=^$^vbWE7XyuNH|?)Ytbbiw6{htwnkaqXSGE0+3OozF*r;TPpn_d3_#A@hMZdlkgPF^V8+qMKo^-*i4LG zXTZ4*kZ1W2bh!{n96=pK^7)-a;A)g$fK#bRsr0Mz`8EtbM9A0q8_}>Tm-4X8MDe7) zoF9 z>8R)@ck#4+Lms%0uK0W1uk-zNhqZykB4G6&{7RO8()VhTYW6TI8Hw&PNb9|qFIFFc z-VeGmd?(d|&tFo$O~&PDw(lnYwwdLSpAvFG;hEk2Y0oHfa6M*2JXw;J{zmC*$F0{K zHs|m}&XL8b>O@nc;o@nE9J5tPNcs{3fHY9IK8JmLdg15G&FLIS1QsYFxuK9#3;R01 zywQ3M{z)yWf#`0$|9g6sJ;5iONHF%xjjz4ogAlQfMirQpF|l(ZsxMGq<^E?(mCyo) z&uHZPrQ_8#!Qe^!0xN>m` zQD0j0ZF9a;zPly8vVhd!br@<9ARXAW1VXtQ8y#74d<|0@m(F@mx#Rqd##95+0x-MT z`;jnonPVs4hsCbH*X{R=x808hf773P?FL}UyC)N1-8H<| zz4BOx4pPDnF4~}A9ifdhas0jF@PCo^-tknw|Nr>YCPJy~S)y!N35OygBb#vSk-Z}8 zC^I7>5!oZzd&aRx$O@Uq-ZT4foZsd3`n*4%&!6AV?RUFz#`T=%8jtIG+@JTy{Xt5| zB6jjy7orhA_|76NxYXc1N%FmWWjS?YH7)dLs@7HSX)xb*#|$ns^=S#3JcB&UZl`P4 zH&0JvWZ0P$P?a~Vmw?KjdFx0!Y4<(7#|I;?gc}Y2UfUQQp|GvDYAHjR9Ye+nJ)KFL z=gw5(*w`?~c%L@eFHVNO;f*mD1KK%*@gG>P-RtgFQ0JhvcjQw1vAGBLMMxypyjidG zt+QlBS8lKypk`Wbf~I^rDYt?BTS3iGet1~zUfrHXG*CQx$JpTlXVyhMcQk4MAe?gZ+yAkIi(}-t>1VbnXJjF-zJ%iZJ0y+!eDPhx<8aHPxRM^~*@Qx<-o`UYBr< zY~uB5DpsjuRHE`JlfOSMUxu7WMGkQ~#P1hTK;PHo#1M0Ib>BX>U=)m~`1ttR+6(18 zD(Sj^9Y!Y_X`TjXQW^a^Sd3*fHZ1t6ea4 zDgPR|k0W?<*$>lK2p{{d)Q<%yML|@|q86J9G9Swa{U+Wce zmCw0WtiJ-k#0u0lWoypH&vOi99(vF$6^&NdYt%2;wLPM-awbnseru|+ZiO?pU3**D zgYSH!y)}~+nmylJ`1zsYhpkpv{&9Hew=Qx~uhEwwqgQdVAbWb;YgJuR8t9Jj@i(DZ za}itgxS$+anh$R)rBd)}#PzH*LSrkNgl7j!xg+mEXPxVT>$Dbr_X}PCAI$n%ii0eg zYyJEbNw|%#LQXC*QVZbeMOQ!H;3kJU)?8YtW@%}yGL_8wz4P4xojUADBEH0%eWkF? z{j>^$zxP_yTO+DMvV+r?VpN0Hl9E18JL=3}w+a1j-pl|?kxLs7O#R~Bl~+|gSDjvL zG_)L;ZOz}`LKGN&<;Q@fhirA|fEW3qZf;KMf1-VQN3=HwO?89V@BbW@V*XPZD)HoxjRy z4@U92@4XUR^A)m+*8vvDPUG<%0WyRu?!bid1n*>V&Z^2fufr&rk)M?Hp8;|W_&Vx& zMI);NiY!FZHZbet#+~+WO-LK7K6~#`;%W=3g`l;`aU4!jM5O`(RgbCMEYA0{dZy~i-(2uXylpEqrH8N(B;2vSi zna{A}#RAxB$4==+#gFsm*`@#|dwPcarlY#0W%DZi!UblPxr1Et`&Frr=qXOx?LG>6 znu=Ae;%mEgoAeH6Hq2|wGZVwy@cIWo1}8F$xsjvct(4&-Ji`3e}&*BD9ty zb!6)o*lZenEA=BW*ofAe+f=(l+wps&6*>a@zrU&FkLaJ>Q?@{#9VN^5eu*tXn50u; zWNfwbOoz*(>0_$ZDFuA$v`qWt}#gN+$x@Xh7#-!yHGjImjn$A^XXb_2z5Si@_LwXv!T9WH2h z?KjE$_tyvm{6SN(3JBo-wRjwt1JZwf0g7hi#Wo@}VFYvVKoWsx;EJM#OThIi(GUVdS$wd!L zn;7F&h6X2+niHKdYho9miU2SSRm{bxjl!Ym&k|Xl3IoJ4X@Unc_ znT+nOy(h*utZCq_6~i|*J^c}cRBmqCffVVifM?{d8O-wY9L9}av0Km7qVjg52=fbY zB>iwsJspsNvL0z;0vot8%h6Vn?9B7t5BCJqsl@Sh9z`PapBI$ASr0nyixYU3&TO|sEFLjUe zrx9Dv4MIN!`^z!n!QXSRBZ+~tN$F626PitWMEBmPzG+gH7w?sdZ{u~fSFc&gFV@4T z?<&FmdLzo3n{;Bq`Dk~$cN93xO3OJr60@sl4przN<4F${Pg@o8vheJ`QK^j@jf7Ou zg-=rB!m{Q4n!X;X-!)$AyPYuXc*Qemz=FR=D5nDQ6T3}Nui;hILLrc=fnN5!I8~H* z={FttLFc0V{qm4YO@G_d`8@2xtUX&ij&S@1$3AsQM`SX{MR4`U_I0C__e4U=*p(Y_ zx9xM9ZIo)ORVpHHRX|e<@pq9`p}(smhTZW83l^dA_3EEL=wn5jen3pai5dSK&jR9N z=R%l28NNO=8BtYHd_shLt(Ko%#^L9Snc%6Zdw8!5KTiTOF7Q!5h9i>YWn@@gT*90$ z&fTYKW4UFKY@fM}ddpn0EJ86DjPp|1Vl&yE14%)dMwS{x_NAZVpu>K!Vd zY8SH}SE&t?kYMmP-$gXyLvv78M10X{{E=|f#aq0U!GhYOH*C*ME^0qGP^M*7S-YNc zu3om6A@a47twT3hMJL?rJudHmO^V(q-Z#t4yk2VB{)lgPY*Z5s3Eg$=o^Rg-!5+Fb zYR|j1GeNQ>2Jk)`+uO)jFWR4YLIOMM%%vo zDMWj+y@XS_o)dW4P*ZQeNIqoT&ap7QAkKx6o9-E`7}NGGr*|56j_|e;u{Gu?#1(R| zeEY28$$!JL{b=gfM#B!*F*C{=RgJuN2jC~;*zeHnf@-62aondglkp?qTHEP1s1F;_ zA0j5}*_qpH)oe~;MnXxu@c%QtjXH1J;8bcY(p9TqmWmc`|lD)wuLN=5%g zpW~71h0HR8%kcP94vmTfxg><)R$;7{smp*I)TC-wZ+w7$a91+;W@^OPI?@_ovTGZJ zI5~n?3evi}niZ#aFd<6V;;|Xyzt_K7i5BEjp^GD!TBoKZXJ^xrE&98<0`-$Q+s*Iqghj)}ZB`TL-8Nm1GpFBr331ZUopcH=Va`!$xN zZS_mv+wJVW_6zUSkHbMQYO{_A6Q~4aHWT0fL4}_#@$ddG?Cau+EJgenqrJDpU%67U zh+T~6 zgY*238O?P`W+K$8?ndv*;8wn_MGic^MnOqd{tlj+2xW8;QhpSacDysu^kVrb*AmMXky@){i$11ODy*xTdSD@Asp=C;M(>UF@wq zEnVo3G^HmRQTBz5KR9>_VCebfMO_(Np2!(|8KfWV6y+z6tOOniw1$Xso0J!`cX?G{LuqCdiL>5=It zhZ+SCjd)>#bdE}9AFQOU??lGn6tkS6%&dhGbQ?>vA5yJ+)i(|iu=t+_lG6iaPq-lI zoNx3Zo2MZbZPU%(j!}7s=yS~R`V<8OdBg6tFDLts_bJRqjw8mrFqgjrhsU1Z*psh9 zw}K2SHAX~FbZBv0I3?g+eKJJqy1v59)NUj>KxI9~yvDZ^xUkb&S(H3_+_I|&FNG5& zzjepjhcWk%hEr(2$~yKFQoA<2Zi#h|L@4uX_V@Q7?q>r2JIw=2vSAE-x>MsFtY~c5 zTheGYy9?A;{_gvY^iS&nQVfCo^39zMi@hK7b_mzFF9G4#!E$)J=C z)@kfM_wJwQXz|R{y5~b4rJn)zi1({J{~NsUAq475Z!CtVWc`@u?`vd4@Ds#XUE|^| zc!Ebld4%ue+po^`>28X=WRyeV#>o`t96BA3qvXZ4&ghu05w_Fv%{!^~i5qv^uNRT| zlHw4Fl8o_%>Af#lSQ*UK5$!un-n0tZ;5$3B`uu1a_UCw<3~HKP0ct~=*nJAJwNw0p zm{@`OosE`5%t|8xBsTU3587?R$QtZ0a~dF8Q%JefR1xMmmg|-59Cujv{cad}mjaqZ zD}sB()^^;o#tEbG=&Y;|>qgkaBRkM>2tgr%fGwEiM#>=eGVEJ$_=7nEWTQJP)6Nhr zWc(4q0PS|nMr73ghYK+5+;S*NzTT4);Y0f@{vxP9XDc+3U)`0F?n`*?koj{779;HB zpN$f*YN@5}w=J4XQN5OjDs&Te)kl#=Ixs%fuD<}?SOM{dQ!5v6C^JPe>>uCht+Rr|$Rd^8uNqt!s_$kvp+3C$&Ck#FHPR0SsEc8cGa96!e z$#W%t3w>O+ogAA9xecq{H$-}0PP=~g67}>D^z_JSTS^U)2NRF=ht>!5{(gRkOTTy_;NrR; zos<;v!zUR0=^-nx7a>qT883UlblFbH#@fm?&;blpVHEWisLQ+PZ}4WcUJ0p*9#-h% zer(WXla|bU zWO04*wwWX+!l1bGqQ)qy612a}KE)>@g5ak_ufoI|u4=5D(g^|JV96B6idv__{`-)5 zr)`{H3f}|E3*~ggd>aV}TCf^8$MY{N)TXBQW4Dp53_!o z)psOHUxUO0Vq2c5x^)Cr;75@V=6%!^#JEa^@*6kYo$ zNVNRuw)yQ~i>7c!A^T2I?kD9#<`OR! z!y*IFg4gssi?Gf(lpf0r(D(*onPJn;UZ5sdHbIKxUN&oiI!IxC1&8ceD#gt^`;Kug zjL+^}eT)9NA)=rtou0&@x%TXjuMK0}AK`a8)mWC3Ra3IH{g0OTX)@}MBP)S9X|1p1 zg1XPE9hTn{>p8qlLOfJCiY)Q#A$U$__J;;W4Au;ZE-9OvoAUQsA8F7d#sud_R)=-i)pzmM4UXhis5RS(E;;kD4Qdy@5ni0yiKvY zhCmkDX)z4&t!(|T644WnM7{3~1Qx?#=TRi!wKw!^`F;~Vd;hz?_gAo7qcHd1!nwso z{OaJ8lCJ8fmg7+=oS2B3M+zzmEo;%jgl7nG^GHkBNA&4EcEYpNRCP8@tYwzw@_x@; zGT|9=&yB0kkL{4l8zZ-ds&9{RJz6$2#o2Qw*S%PmbTs?~I} z4der|@cY{DFNtfvCT(9V&}*rvt!17#y$VTBojT%3zt}HU+OSMXoOJ&9S>FN%nnWmm zv`=Er9HlUPi}B;RbaNBP?V${BNe z`m-`~EygJm{xfpx_}M9q=hNrt?>)GBAk z?7HCJ^k4VeUX1Bb#>e2fYqR?G9CU)mNF#4*Ub&uGif#4;i=MVo`AyFJQps&hN}>k< zV`o3nmeba2@gh`r+uWofr56|N*pB)9NpP#jh_XEI-3I0?(QzJij2OI`VPR6 zC!$*gwf6mV&3W&bIoc1nR*?$6-xzHNT`taU9wC>`kLN1P3Ux78(0uC55cyZ0!V)ae zug_P8M^|+Q5QFF!**B5cOvUy_@WSPX4Id@SQcvpEE8pEnd!W|eaP@F%^3R|>qiMWI z6KI#m+V~T-KEYv8;$6xY?VH?grM6j>)AyIWB3B@%yOC>Qq4gx8HA((!!@d<0V5W|$ z=;f|(Sk@DHtmbEM4z%Cv?(ULZG@En^O_CL&Z=*Vnwb;)1M6pv-^qFNxL^4KyUD&5Q zT~t4v7H)tCACnUk^C126)8p7A1pD0bWHV!Et@-(xp+lo>tduCWk;i{wC31&D6g!gs z6GytZIY9H3I~#!f?v$fm3*zG9I@NEP<7c0-0%VX)Cu0shDk8EvR-9@CroLKc-z;&_ zGrYycrMV_Kjyq$_p#Xroe8XVHS-=4+mI!~a(;ZD@#zpw=>Z=n4bIF(7ju!#^^?O;f5&!g zBDF+szc9hd6}7b5uN%FxfWoVg(j$rrYG@*AYEHKlI*MlGXtna42~Ma(V`P^vqo@> zLydR>!NwK}mXTxNtj`HF6;Vl#dXQB;q9M;3D|R_z&Rr&M`ZAyd@=G@ZWO05(2QFu6 zc^7np-R0lkFH6D3%i-6`3}az|;C`ps+AmY3d;>Q)4tC%sSSs`}brA*4HuB!VA%5 zYXu*D1~YEIuB}otKOOwe{7Z-NoC{a_%{YZ9w*DwCO0ZK-{}pcFYN&YtEp|N-@#Hdm zZ*r1;MoD6Dt5amxX#PEDMH|CKd!SMfW{!P0b$}FhZJb#|UAAB1&D4d?hh{g1huMYM zX`S!2@4A%wBa18kCUu;o{D^wMv9mDDxmJxG_D;7PWOlE8U$Gx|HD?5t8u(x(cDMRl z7NXE8ejW|-oOX40zbz~*T=tENjST?P+U8U(m7m{&(~&3dFQ)$XaK2wU1~81#J;C4V zYs%rjVl4X9l;W3=@$-dzw3^or)5CJ3`WrPbDmdfT;E1^N5YmBG0tIiaH<-4wn89Ov zoP(HK(@#7j+)n>0`rg^HSj9~v^)KSc7nRS_@A1cNifIqm(;k2{F{7%t-Ev$65(`Xi^6kDvP*YMO(|l2Y>ujlZW5yTl9` z#od~K_99Lbcc(Pw+dsADUWh#nkuSZrg5sZO%$yWw<-m#EA1&wyLCDh5Hv9d0XUP8X zCaagX#o1`%ThxWA-nrvJPre}7aiOMNlBNirjeC5wxS#ZnQM#0BFTO-wUrudRu3@_Q zX`Iufk(mxdr29*w+ZEbnk&X}h>GO#n%iz%B{yn$%Daj=_5SQvMV387BLGIr>6M1 zKlhW9hyfZ100;^VB)Ys%#b@lnE4@GfMO7SW-Cuy;oblOLwp{%IDbo5~()+ZeuF+iX z{+s>v7HKCiwxzakG4X2mj_eZ6LffW_WoF3ld{15w4R%R*Rfr36Ys*l&2Z4z(K={Ju z%g}h2vi&7%@6&&=^7tR0B)dhBG6i_d>5Ez^rcVyS$b*ct!Z*DcyGN*=n-p=GyZ0HMir+w7m87eWU{waCdS1zAHm$ zLf8wWfCuVrqCcNb?ac^4O&Y4VSkKoED`$KfMJ|v98%@%gTh!#i#;wcPE8a|&eMv3B zQj@LLXWPhMrl%RquP__ZoOu5tr?Lc2`&);)q=j3~qNXJXRD9yu8AY-M+jHQ@<8+@# zoxrJhwha5J=ejHV=2Dge3=`S_61h8Zf)(`OOTBXJeEhfBb^+TXi;q*jtZY)4Sg%u~ zn!miAAnbT0lf^&xitrW4ltN{IKJ1m0Q*8H)=kh3a?pvQ1TH|h%=$DIlu2BKVdeN8w z>iWsqMDzf~|K*}>EQcQ|ar{jT==X6!k@U}x+sm;HYz-@jT|hc=WW!y7{~o3|{Sn@M zurN~Vh0b`8mIeRyNpgV(BJ*mw206_di2Hf&QOB-LCSNs!jJGx+s7tj^`gK%Q%Yl2J zD71+>W^X(>f9bZpCq_uI`nDO*Yc{+eX~9Rfm3`uzpn>!lW*IemeC-F*uvCi4nb*R> zZ!?;zexlZ+LlGOwv_y#joTk$s=o&R7zSS%Xh;XFwyXrPM;{2lJ05hS(;D1ti+?=di z$?vN&H1vJ*J4f~`MKmsRlMuTa!?ZfLyTPa3G580Ed!t~VXFzCh6^j=KF`{jlHkPR0 zT1Gvzu}6B}zPe7<9T6rpzdQ;*?W0>BnWE?UQGr01&1)(sKf`4ap-d3AqTSdtmltwO z$5>F(Qw9D0bZ72uQ|L#tFW*8q?Ck6SPP4oWQ8E+z2ycs!+701IG0o^tW?s+ysLR3_ zpm5t@><|wo(KLH>XLdDzI+}?*Oa2lG+MM?N8p$MjqtGW2+z6FB_1v{RsEux}t_Ws3 zjTkSfE}Pxfg4@=M7vZma6SUyrgu}2V+tV1~j?~!H#JBH$yRp9YPbZV;Z$#{!R*N}{ zD4Lx=jaVhkz6yGjud0gaaOPbayUD#d$vbwE5ukRTFj5B%YnTOn#%lnb*Ul_}tYK?q ze|=#R{TgCvBi7cwXuYOIsHt~KA#YAQ5Z#>lrQFtgcf};G|E}kUZ3-#D8y>d_{r>>= zP8$u~)rC}?K?_~b4L1nP#vGp7yyN@$);|VQ3|5B^03m|FYdPumP#}m!usTmRoI2=* z$(vL1+x`+%#S6M=wTZoI+f@H?ofx4iS)0NOG zxbq{mb~6Rp(eeJd3mN>TvhdA6d!kbfK0>g@@7p{R(&8cFGT!EUVVXC2Q5q1iq2aY}M1 zLl3U_i}NamHWr;OVTjTMnt)9pegibe58BcTzQjNBq}<)3u~nXI;W>rw>?1@~A`9s~ zxQhDE9J_qBPj;EydRjk`<1Q8>OFzquw6Cy5E0|7C&?q5f_gWDJk|=a%Pwi zRI3(-T27$)f&yl5nf$1>WxTzQ8x1eg?R*+Z`wmoVZw73y@?L>f&uF3xv&Q9U9xaz6 z^3}n6pXSIisHt{=W5ok<6{2>2dy1 z(}4$0)`rd`!JL3^&RBPd+BT9Ba~^f7CBl{#@t~#Oyw>@kigJRaqe$d*Q;zO@c7NVf z_JJh9cZBMh(zmj#Y>k@_$y0nij{nN^)BuimbujzoFb={CF;!+&6LaE(tPkX7x0eEH z=mq|OK6;R#mQ}k6>SErZZMEU4;&5K=qoV1EmQJ&Ry`LPS!tqg^x(gG1oSGu?(j>o~ zUwG{VUBlXD+@yRXIhxTj5|bBxepp;UriAZvkj=Kwcl`yXc!zKDUeUB>j$Y$#&=qr?BShisrgc&#$*I87?S(r6m z%;{3cnC>$Dz%M_z_!(a!`Ia2|3cp3aSVttXv=;`BuGZnA=9~aVbLxa1gcwhZW6w1) z*FPqfY@C|yGEBoAy<0|GA%Byz3S_)Stm7yhM&lb#`iJnL1eD8`nV6)OH)_d7b>4C{ z_2fInWj|Gqb({w|Y=yf!dN@#ClB2jmQI$=n81KPCllL75`x|;H--PROW;gFDfr>W2 z&hzB_NYDGn-}ecP7L~zr5M?stz-S0)p+1d!iJX_c3GHd6;4#MY~)-Zl-c_{G69*$3`QYNc)N_ zpl705!smvT%-yyZU#WvQ@1*Konbmd#L6 z`1O75hZG)hPV`9@T!3zWXO&bIOX3N$0>}HkJQZracw!~sDZM0Il2yzwbzbj1(iw+v znL|zQ9v4rYbCHN*M}Lubg@y`<h4x+KTSh%0W#MI* z$%e_)ivdqi(}~^6FbYD@Sg&SY{$;sbHsrP7*m>&LYi8%rcw?4!`vWvDh8Vtm>&TeS zpi{ydC^|-A#`I_s1NMLc;hu_tYhReXoo#MkJLAw-VQoSPhrdkAz3MZG=92=UvDXILy6eGjxxo$U&l z@v}mD9OOAuPUBI>_S2gE_^9`Fq|oYw1tr~#Qd7cSU^ zevZH3Bc2V0-DZ2b(MbHW9QB#7$7C^-|6R^#d<4QP)t-|f%Lnxn3q~l2%{{)G_kihaU>>rn2@8K;(qG|mI8Vyx~(0VBKB!IQp2pv z&jX+0!&t@Dak#@pTrPHO3vcI98m5kJovT=~*oIbL%LuXN%HqrP%b_eV01E^FwsNt? z6d;Lh{y+034wyG_tfOp2Gj}Jgw&n)0S5%UZ)MSzCnE2eHQ=&Xw+^kh|XgOYG8KEuJMz}6UqaN z#k9&r4k#B}n^9vVr?5Pxqj4QiA-HS0N4^F}D8$eGYS55xd^{7d?~gTbnY1Ty_;+o^KDEsJVt(s0Y4 zjp(Hb`mYNJ&MPjz9_tj@a4~g~2Mk?_@Ga3NuCudn4PoEywmji|-t&nwYeoM%3w)Iv zc9HU3Yd1U(bS~<1?_-FVB>oifL&WuyWcEqVU_$F;T)F*=KlLjkJ&c*V&kbhwg(2gn zMLA)=z5LAL@ayQ>hYw3iPnL`%=pLe5G$;Q9YtR0Md2sw3fDbC7TW2ygbl)Dfwl44X4LCP(7y?QY8;M*UVsRqQcn z$ya(l{Yt)@FQguOZleBfV*iT1x>)E}ZmcZFyP`fU{MP?RA5D9|yUy=Wm)Js5EKVaZ ziIDR$iUG}r_a(2XN7<8kX`jU{5(ZCxdV$Q?JrI&;{xdwR;RzY5_-Y`T-Qb9aE(?_=l)yfWA_`L(u?ta%ey#dsXa zgJFpd<(jWyg4>D-J0Wt2B~e=%K!DWLT+R$UUD?fs0k{6QJjs6loDyPPeeez(`06Y9 z&egP{%`W$Uo^YA^J!6(0PsB5=^=D!WcXd_d#vRzlq>DGuK5MFm_Y)WM z|8qW0NNwUAZ;4h7^h7a9VQt5ZbZb|02Vd7_RWSl-*P(k&HG4!q`#$DY&Vm#UJ?D=I zSM8B5!Z&1OeqxTkXuze2q&=kk@69Pit*gKA|F&5AH(SU3yLC}ej8aM1HX`m9p3~~L zH(r$niiw*chL^wS;2=)uG)@34oh1QM;Aas*^H5tA{wx+w3y-WX{8pUR&5j8pIp6ia zphesSdzN|}J4^arv(jhxZSB?n2Jgww>MkY&&com^waMT77O=1%FMLyFUCr6aoijOw zUY4#tZ=-aHH4iIqZam&5YcNBjlZu}oc_lnfh3zc+rP6v~l;1qhvi6Vvm!mKL4(w52+wiw}pENuBu5g+G49`CRq|zB1 z=3@%wZw78@63Z)k&3|zcEoq0w(`?%YFT(O6w!@_a{Zx7n_hsFm#tM+U)Ha0-Pjb{;h;lGLe z?{pOKefmsi2fTNdJfi=CSrk|GEibOdCDQ!t9lPt+hYTp_(_~k0xq7<41!1H^f4(Ko zaCx;Odg~J0;A}c*lK%XnTZ)!nLPqPJFSr+EhOcb=tW&Sag}WZ8gP16MG0hS_8Oq@F zYak#KKr{ZMhwC=VLcS}>9=ajqj7}J|yU+2oN1hfdYhIY5`6sr3QlDH+{cI6hpL$wa zQ3nRw&E;V2!k12{NBO?Aeq>IO6R3>UKi4khRh1Kk zWI(mRP}B@kv(SpaZVSrSG5Ii*PXJG`f}F6Qf1`E~3?@g%>@u3v zS0E;t`Gtk?^-B55D&?dJA`s;$+#MfXdr0z*pJ#8~K*Up;BETMCEd-8d^ZSnDq))s@ z>UQ29UtGKtmgJ9CPT+sLw6by=24e=`HIO$XRJ(OUddlm-ClCjUp$YKGO6OiJSw4F| z8Xw1|XJxJs^x{<|-6iRt_c0R`9UuQ~u(awkp$r4m_BqmT_gNR4Qp_!%Hz{up{79G@ zl0Ms?0(Q(%(jywk-B~cRwi)o0+;vxr_`);slVsMWc&>BzgMnf zy7{LRC=QrrC<9lX1cdVbL9B8^vqR$u90+)AP1rtc)U$W~HUS~lv}q$}0m_0T?!R+i z6nN~+0J-dhj`RJqB>b_K4V8Do71KA+21%%R7zfB8efNfRU*I{&>C=Hc(?o3aPWO+$WAsy0~jU`Kod{w(wCQPfw4G#5W|#I~3_dbzH3c6OG7#}rLKqJ-~5Qn*0BJ1%5*x-WQi zUWQLXLLvroWS2buQG59CSe4fpicZucwmKt({5w<;ugbE8vTp{~i%H`=M?R=g({?0ox5DTplTA7D>8Vh%ks@D%k@@>23xA9-(!*LgUeN~1yKa&Mw&Q01#_a^#Ve z{$w%mgp+k`LRBJ|JaLI2!2fZ8<^Yj{vnwxqy%)*srf|Ukk1qMUUVTm@`em&2Jxba=AuH7_8 z1=~wY5BHy91itnpn`qZ~JYB;0NGvx`d6WOx=I;G5v$HR?(sjY6s{!NS2*GLEZm)N* zQZ*2`2878WXcnk?icg;Xn2;C2G%)uYM+JET+1^ci2+EH05ZcCTVlI7?uv>Sq(~t=d zDGed2gP^aQBZ$TyF*Z{~{z%n0(?7o@%Ni* ze>C%v9V+4Ll0RE69Bl7V$=q@=ijxa~Y|Up$Hu!DPQp+Kt(Vw%@iXBOZi{#Cl@8-sWt0g4{2;`CEu}i-Eevie%6C|E| zJH==D>gwi1SvH)7z^)dPCiRfZ%C26rjO=Vl<1PCJo~KhjCCUPZq_`w~_X>U3UMkR{ zqj5TY`H3_3W3r~zI|(0L{?m4kJBahCb2!o+FMdBy$YIQJS{k&*MjT;xJ34`e0IByl zszfRrCiNCnfA5S@@ZQJCl9L50h~*O&Xj3A+br2>h(q^^M*)5LLS3Y{53cB#YMJ7^@ z&$b@3@|u6os=tv-r>UhP=XkA zbC`#d(%IR@awAECX!fw$s-#pkcvjt|PGz4@)E1`Ohd$g07%p|@JaT$$VaHJAFdcQT zG?k?D2P)rDPU#}Opb+kN=ce#*2is|W0B5teYur^ z_DWJqDRB)NlITQX)k2w_DvAt4f9lOCp$AS|v+M^zEio_mjV64B{@&X7$}zX9ii3pBQeb zy{@m_`z7eKUTjHo(uM4r+^7H15{wIVAkZ{NeP?)3w9htwOnVvP3va2Til=K7sie`^PMpYV{_ABl(6yMgenWJT>2w*E7%n&|`qe)(lL}1! znS;eZEd0LKLpDMWf;4i5WnN#M(b-Q{sKTJi!#77L{oPH38UH{FF4=KwFXv4R*(jPtQGH+P^V7EyV7&1N-r|%f)f5P{P457jr{3np`C0JM&-RYdQ2_FysY(8#P%>X?Y^(X>W8}L{H_(~cK_c{xVB=k? zJfZR=hbj?}3tUElpnrP>>kKVmb5TYKF)wVU87WJp32_2pY!~KX20n5 zFW7-$YNvuaI+1j|K-WptEC{M{m}DFGQ2TvgLk9Vf`5f6CPoFI5l&xA>Ej}LOlz#oR z$PS$;A87&^JMQ@RZgdX_Ux|Jrsh7FaAL1AD9NQWP7l3H~wk;^AC8-Z%oQyZv3Q%>-skddss&3fo1mU3&L5VhI zZ@-#{uOaqUsOd7H2?O5R2)>JR+|DTGvGEyQqq9BXf;X?OLhc=@QMj7-@}rYdLO}1{ zoro&#&On~Y-hG|gRUmmqE{aJKu$O}Xk;|aY?OEndPfR}E#?cb)nM;t_6ZC?m(zl+z zZ^?$Xnp)EXw$km(8j1?Qq)(kcnw(&3sH4O2($>3{gs7d(!TyH#1sbym+@tnqyizti zHpDakn5}nZ|DnJ5+c%mm1c;*4E{%-(AE#Lg?b zx!JKE)aKQ_m*csA4Zis9fP82@ib**5v`Pn2qzsskv!mI>N@66`qN3@l-__qsUKCQo zC&=N|NcQuT8!}BHTu4(=>OLH(O_G^lStG1)0rj-YfBSLjpW*j3B|DN5(Od6=Q1VEoDbn8Z$$3ZAAab+5H3tL&$`J!B>!v2qp{Aus0r69nv#=X&8i zx=v8`(d{9M4c#rTZnAI29TSzMFUt&lV1|8QF2;oRupipu@WmT+M2-1<>N|JEXzk@Y zHLfza4DYLD7Yy-Z^XGNCbC@+=+D>N5Q;^Y%kQo`R$J_?d)0dwmy$%LeJz%Th5BeFl zu7AqQqtDH&!_krpihlF?{+ZneKO;XT-t)w$4Xc^zFe%8O=7d6U^lMdEV_pWXhb2$^ z!6}ULTJy;j7+9ee&<^G23!^_xH%87QupnXj*zVxqbMsNL?ih^f^Pe}L!zl27FEcy2 zZv(9POZ7+7z z{^bo|e?SglwbAn1jXSF#lu%1d+c2^$h4BR_0UOfP!lzvT0#6bZ{D2jO+EVP--Fp^Ea07g`sLJY5xPvd~aTP7`@CEA{(li7Qc_kwj&~K`f9O5xz?SE`Dx+ ze~C$^n_ub2Q;u!IydKjM`yIk=RQS}NeV4St?IURO?L-9flLbuLusiB?2fY4hM&1Wm z$ykbzX95cCv2e`%pv>s0dHCx#EBPmbwZqB)qTw>^N2Y4yH*Ny9Pm2U77dkh-z30y2qxNA>S?G*1TcGX~*uHldn2Leru)JEP zZ1(ACplI4#=-iv0+b7=2G{SqdY{#0yJpS^vuRwZ+#mS<`#pn<-jP+}!gFVF-w~(67 zs|>!$AC8U-E365b#pIBG$lXa@Ic#Bu!4D}@x~c2rFXfmAgs|%Wtj5muKR=PU(lnPX zB{7NI`k4y(cPBFuK)utqF)?nck;G>6`Uq*m9SUiFER5-+2Z_PEl3O{SAe`v-^OxaZ z#Z(&nyehIbfwz0&{Ga90FFL{TW1p61&yEN~!UxF2s#?;t(lLi~@P4(&0$IGNX{n!z8+? zz*lCuy|P#KpP@ZMK!9?Efadb;kkb_j;m60cVOhV5D+Gl|e66b(iJ(uC@kr+9VaA*W7MCAfS}WKA(Ge5LDKi3GSG*rvkAlTr)eB*Ji225 z-5QS^0~abpY&~m&xXbAI;Tv%8>-_$NTZB_-$^Il8<<{LQcX@HV5T|#-{Z4dWre0!A z+}#ChX9-1yeo2aeB@F+Mj@6*_0RbVtv*?q5Njw0i5n?6V{wK2Ql8@4cA^303%wXVu zqVe9bBvSql`bG6$OdN0(>&O2&uMDN~|Dw{6{7+n*(ErlMy8A!+SpR=cZeqJd%0ld# z@X$(0bZ~gk*MI-a; zpBJZA_P+0;W4r|+Po8y){i>r4=u5TBLimwV zO7P>$B;)Rl93^jd^@j+U9w^|uU%BI(@vPK!qmAo><)#ke0gbVDAg*p8XWME9G}sUfkuOOR_bF8;w1T z*4Ma3MKzpDS|(I1*UY$Yj!h2Dp`sm3T0nHWM5_wvQu`lX5Worj9Jd@^ZkC$ z@BCipoWIWNyk4exp67mMn&-amWML($7%ldlmvvj!tTaxy1xS`}y;?aQH$g@qLmo z@xywgCQ?|`Rr-tbiAEx0mb(oxUFV$O+{%g3&>6ZmrcF)!m9;p8gT4x;M^r-ehS9AW z4|5}nvo-Wpm8u!C2-s#U&(beOqtjF-TyD)3R*Y)IKtZ1aE2bCKBsVzW`R>>c)XagiMw#Qjt zp^ckJ9jWhn9)(j6KE>1r`{TK$9AnnPb- z@4~v8%GSXrG7`Jo;1X)QF+l~e&62iWfvCjqZG>_C&US`6&gn?!R~1CSZY|og8q3LH zb;at*DJhK>V#eW%bp^FIGx?T6e~*B2=oLb*(@wj+8L>{}FK&!e>6>%5LuD*0AXqHX5|XLYvv(1u&fSgU{rOEi&n!dbOx%XelSo~-f+U5*(0 zr!QPO6Q!3qPQR$GzB&wyK7*XsFjhM8TWVUGvkuGzJ~IY6t+L?RweIPz?5O~R6sNcq zu2#H6{jN8yTo9*m)>S_bnH;H2F|4olC)os1Ev@5j&~$W6y!g(;=cxwhn#An$WeEB= zjrcB9RuT^!8QCBN5^o7@47(K0Gcfp)@2Yb~}E>K?{-VG@x<~;6Chu{7C{EN;Q`-W6gbA4xR>rD%7*sQZfy*(r>poq5N%(T5#(r&2C1j^( zODuB!e%wJ+*<9IrZ5L-_?{`i35C2NvVrB}ybH9tO?UEo5pN*hfs-YWu``8`ls7&W+ zF^Y$jNCfCUp9Z7PiK`FY3?DR)b-)%1^e0KvC~WU^UQy!RS9{pyXatXvF8{&PvQU{#|@G;FFSa^3y;T1sL?Hjf=iuEG1b+7+lt>6S~o{NeObPfvz%L1 zA8!3&4~AB`z0u%Bu4PH91H_f1F2z$dS{$sy<4w0(_MCqUp*ib`4;4paUg>vqS!;Jh zU>fxkXP0>cq@T;HIg77EUP=guAO{uNm=vlaDX#eNpLb@98r+q@L$*mFEU6%QrSVK{ zqnB2s`WMCg!4aWmk8reXNn}2}3JWx|vKB!o@;W|Nc~%cu`N9jN z9qFq+zn9jftHnX3{SimOxH`pq=jGDQ)Ahp}kmReBphnJLL56w)RjR8Rd3;B zzwl7YDRuvVn4v_blSJ@1N& z5(~}?)Q~_i0jx|w3)A${=c%P0vhqErAbKxzE0r;~<78xxc^8eIBk8a&(Rs|{>Gz}? z`r%r40-)7yI5|L6lr^mp8%3Y}B}SL?N7|ids3b-mtJ|7Onn5!|qM4;n*MuPS3S0_C zr?&p#-1nW8vo9S+%-A~<7lC{b);%H@rRrlVCAdkkx&^u91CV|LaT@%3Q?qzV8HfP- z8Sg}e9&2R>eLTCynNj{{L<%}SUY{!{Cx-SP?D9D4O?NpL-8w^lKKnV-fy^V!g=B8I zp=r8%SoK~NLBg(>%^muA`7}jO6RXl-6PJ~J63?e0oL7SaVy@-6=Py}t>cmQN1dz=P z(&1$M-U6W8c$=!g&8;|5SfEwvYc3{^`)zP}VQxBs!Fer?H}?t2;^R4hDqtDe6N zr>aF2A5^+a#J;700a9`oyf3jn?H!|nCiEl6YFbx813D`bSsowtEZ)lS`I>1B7m47( zOi5bvLp_U&2XcA)SAi`Kf^N%~yYj!%5{vf|r4QGLdc2%YP~fl#qWT;YO?gH?4%#au zs&qU-F{D8T14GIO2zWUw7#$r3OusZ>Z5?N zEPI;9MyXz(QK}vo5iAae2V4_)t^up2?|oqOIjexi>|iTNTR<<>8TuIuf3^JXEA*I# zVtf(xZA99BQhw2CyaX&gI7mgz*s;#h%n=ts+=JKBEq0VN9DFl)n_loU@Fw)heKqbTxxk(0H=>S5 zDm5#UIw9Z0KQ`sHgTjZ=?M`{qrSy1GVB{!B5zm#~ysos;)y|nJcQJJON`i`f8#m*v z5^`t9S5L|Fv~eYgexe$`rZYUYCX;+IWttaba8Psj z-rMMm)@smqUrqHliaKpNHB{9|J&I=0l!A$P+Tkw;v$D!ZBI@Z*o#1=u%H+uKILM}C?@Vp0|0*}fhf zh~>QIZHFF%667gT%E9c&s%8Ac4@EW}RDzO{F+19DsUvPxpOer`e}vevGrC>{WivRX z10k&t6Z9Fyd>8k9&Ss^YE>fZJP!Z$Y2$`UVOGr~(Ufm(d?*)CF>V~@~Im3})7g*P^ zQBd65c+L<>p@a&gbgnwn49`6|i{>gOCNS~(iF63S1?WxS*vN=ZXHy#Nh7!)UcVv1$ z9QX!O9YrF_S@`Sb#)nP^qm0w;=w|8SkN@05h@SJ!CM0*=ChxrQ$?W=Ro?c=)T8h_> zZ6}<8wbY@1>hnm>2j;ATrmD)u{E?qqThplAfm*QAYFo8gecYf$I-p{I+z21EzaIX@ z9fBH_`0E~$YW+J497y{6tddk&1{V~_3kvTgNYvyD zCEYOk4;Fy##fel;z+bJYMAy#(ffP1uXBHDR?7{|Bk@Gn~cYeI6XZ|S`#uYX&MKa6To!)87EH% zW!Ml!7?>Cs>5<6)58yw?XrEUu=XMG=W_vwGbqh|Yr4 zn5MDDz@CK0wBeuc{LS*6d85u|JamthqLNX-#%shqh}@g z9`jx0MCg&s7;?p#j8V$~k50h^&Ghq-^m~uQkDjMXFGD)y<_4mi?oAbyaDQddnwoUOeJ_1ydCmzDsGyRYPptJbbmGeD5~ z^h{zuxZoo%@n*)Ma>V}>n3es*UfpnPEPEz3$H3)kYCXK3>K*iSKLYvHZ)qqdaZ6K! zTV&1ZQK!9kSJ-CSru*mpJUl3%M-JncK^+kWs^gAsrUKB17j0z6bK1hKx-n61?3b8i^q9-$3>A34`uLpnN_n|S z9S1`b4x^^V*|6c_k+ml~UZL0Zck0n~Hjlrb!KIe_?W#(FmoVENr(ziy5}S$4g(z7w)P0zmGi_2}Ym?liyY?X` zi$32;c4#cgI!6hu^L;!gH#g`MDI*$fGQLk}+22rxW(?!?EM_<9q~gEW(J6^ zHrC|A)VkhEM#nyeg9Qev2f=$6Fg}=pv8Sp#A3df&s%3!jA~(xV5xiDm0W=uF2GOeL zIjX~rS7MH>!FFKZ)Z@pDIfyf6z!fqZuIA?IcKoO<#lt2mSEiq`=zs;drTCp#0nkOa zqCUMfPpZJSY6p|f4}ZC(^&PW&vUg!|VRo^HCq_`M^8|F`MLBs~{l<-OXygBQ0*ag- zsQweOnwe0AQe`{g1qX*q>4>&1R({33&!J6Cl+euKHmAfFMAZ!#5}QX_FdDXxS6NqL zE*W_cuwZPiYAWi?CMY}2d-kJrP!KoR#+E+#9~6_yK6p5`JTbrz_u6@Q1lzF@-E?=X&?974`I@LStI`XSYzhn_T(NcV0_oj|I``YBd z#G`v^Q)+@6e}!b%u%;fYfw$$2lYMBOh_HS`t7kqUZ!6U<`qDruii#sja_bdw_5&pa z7d3TaH)SooTFN)c288I&6pHG)LT7CD1uJ+zxI}#D1Cgz&RZjbK# z3Lef6_~SVL&P>*SCsp@R9nB4pi3r54$w_$Cg{trTOGn{wZ@N9O=OeA!?_g(xTr&B~;9Y7?doQ zJ_pQc$q0)SFKUWoVLqKo<5?6?+xSLMM-N;pDc@A7<#I_9rYrUKc&12c613B9 z*>yj4&q2byDLb1H$|$|aE-5Mbb~z~EYE)q%}~*Cnl%ZSlRx?A{heYW=5zY#W7)w4@EvF4))tbiLL+HmsdDa9(mu=mQ4rHbu?n}B zPe2jp(Xbl`;r^-$+pRe{lgGMP3Occ+9=p#flrxmp;L>OWyMXCmMM_Fy{QDddvLlZl zr0Mu*+Jt^yANP|yV>|B%Qiaziz5|c#HF{VRG5!qV#n@gV97a3%0Wm#Xwf2dV7FH?o z$wbc)aW30o=IOnF@RF}!RWqIb>6ur*TR6}dBHTWkF7b;7raa5WZvG5lYoNgk$_k>) z0Oj%dz%T3WT@y3Fa$)5{sz7KK+=p(AA-)}skoXNWV6SPQul(l83T^2vU0zu;4+9^B zKZ|o-vDT*sqn|uE&~kkuyhWq)43!JQPLfylJE&u6q2Wf7_+j3|F@9YMpYh4j+h=Rw z)_XxU)8yEKS6+rjNp!yZb4O5r(Sn5kccYPZ_S5+&y4_vxHL|qK7%udYN#v@mVgO~8 z`$$Gn78le%M22NOGQWAJ=4%n2&uvdkObiAUykZ!gn7CndKj||kElrG&3QEJqsV(hb zL6~NI`$PoT{4;7c@wZ$ZHu2j3Gz=L_{xGJUv%j8`Axq4$Uk{kB9YS246{Z6$iEKt2 z*XY6*1@zLBr0J5cg```PDm(>bPnYK)dSWGNUW>fA>8bOvCO zvo$DibV&bmYMb|w)n5y#F(voZJmAOD?NB*cx;JL(5)tjHg6WG(QdNq+6}&5*b_QG8 z&oMYA0Ga3))M~eWv__XWN!PuuJ((_v8?vU?<0M=nSmyj;xRV~;Dv*wTH4+xHQ_NFw zP*2FI6{q?7@kVwc6_nVw`aJgn)ht_qN8X~o#SK9Z`xpF*{3UOV1oFgoX1yVtbjAm4 zlJF7h;5*#50z}~I@5ZMl5NWmPApH_2RY6eOGjY+1AlEZgETR7Prqu+Y#N?==zmh9O z9r^JwfG)nMNr}@zX-elOtXeF8@lCU0!9}~2_t=V&}+wX~~ zsFPE{?7~>_{aW7XI3`MDsLF)3Ey~Qp!!zt_07x)KfLUexo z~ldLx+nG8^$GCL#ah#F4vB{pdbF?;367V|CKh9UUCni{;-lL0dCiOvO90@fmp#Fo}V&dA1a43z)2@myaS9;Z!LasYu(S#gH zpqwR555ILl%l~<&HRfFh4?DWtgV}6(K3DSx?YOZhqo6^Na_LS!_oOldymgt8=I`~O z72S{!@d}>!Mr$><@1O=Mfz>lNVxBUJq_L#qJFWg@Bp!y2WaQ-8Q~q$}q#(QU(dOak zZ=P(qdX98j3hs@?7AgjY#EYV$;e~}VxZ6#KKfLME zcf}_vutDK?*5n}dkzeIZJi!XxC{e`3sPCP~N?^*fJEMlVPQ*w5&`MhSfY9k4aye&N zD<19k8({bS{&+xN_#%V^bUb&9U0>`Gcy0xlQuk(`7X5Jq1GE+N z39l9&Ef)8k2A)vCzlB%^%Olo2N?4;p^2fo%Y%!pA-cR(^5t?E}174+M!%34}=S!Yn ztGN`&Q)(S=-*I{DR(ptWx(pi@qS)p?! z;Ty%~oitMGPxKJm&1uWU=9i9~{}@(V7!=EUEW6L*>gLGHcQ)T5|Y-{}j5EaJii+Ds_iJY=B zc4Q-!p@ax@uC;ph(-+??@_@2khv2lOrG>e;xED_<-p_x-kYWIj!+GZ_&ESt*I(R>5)ZWYtJt)7q~Bo ztwW$P@elaK+G40O$Gc0Ds4}wjZ0IyyfF_bj=*+chf1&%rjBfNlK9Dd*epfYM;$i-S z$Uf@J-=mNa?9_G=${kGp3UBo_7IRYEV=JaC%1p|n|xl>sElpc>(LFK8yj;{ zf2!@6)J{9|SH97pI41};X^IN&c_2IGF9m2h&ffzA-+Ch~jsE=5s-~Xit$dMEY{~C7 zpY*GUsVV@&(uAW#_jj*tOEkW^p_dw>row7%IA`^<)+Ty4>WHGkRX>)-`v=_W{2&24=%Rhj{iexPYu3lb<4z+QQ!ikd2(=^^tJaqm>I9}-{ey&W=Kw1oXfp-&yX2z-<=8srq zp*)$t_-^v@w{TuUj)2P3Qou_k!j+*!$L6ehH0#B0olD)s~HL@q%_hH;<*zlB|Rh%UJ>HiWb<2K#+`d68kDVCp~Z#xuWY?ZW$)SAE=gnslB{U`@Oan@cnk&c>+epufULmgkO-_dma5&qaP9cnXL+=7rDFoM^;|rAse;eUc@}EIE))@k?oGUcW zlc)zbbw_VxNu>#jv!}k7vXM#SMlwP9#$G!>!aN&sRE2$%=+}-kw|S^M=A~qhjFL{C zNH8a-e_ox`rc%LCLlrxH$=tC;yp_v?<_&lC?7(^vD;XZz`fID!x~)6L|GVbNnXBv< z$vlX0x0`#r5+?fu`*Ug1^-d`t2Xz^)61;6jZv0`N4LW5y_D047?pJGh#M1rN2=)2r zHCnV`_a{p0QmQ-jt{&>3l@Us1WfC*!zD123O&Um50`+a-NaK?_VbiE zm21xyd=v@VM{$HJvw@mSi~}{ECU!W|_JPBvq*pKEhDE(F?m~nCwND$faWrS;$Q)-? z--gyGx)pQ*F(t)FCnF|lP%f`eEJ9FTQh=0%SSyJb#N#V*Ke}@LWrN;!6`)bnmvQ!} zGk+O@Di+Q+3Hv+hGuhpTeq(T0w&FcpV)ZpS6nEhnymZLF+ZM=P2uEqA4G%uGHd68+ zxGE^gNG4+#;GT;BDNOANC|}@s6tZuHR>J@ut=DHcEVDh7t(#mY;1>T^CQg`i-5V%# zYkh@F?>x%;X4}{L}Lb1*5c|zspiL6C2IeIyWNBx;0-q!!a0RHDE6M-6o z`C#4)@6PeTM0?V)`SkKSg}-a{oDk< zm<Do&li#7&?xzbc&#t$w}XakK0F*Q?!feT`c7jhP&-W92)< z+mrP#{}{jJwk=~Xbspkz>~yoy$D+#CoKF$LBxIFOgu|MAyUf#KtD4sB9E^W=Xat7F zoJIG=?FgbLKOuR$%C_W0aSpaMa@_AjP#s_J*X&mq;3%j~6Uv&R>YixP+3EWb5tvTR z{An;Z?w(bw@#7LgOE~nAll8z!M?R^H5LGJ42qzkT^O{oLZ=Jji`ChQHGFkf<3eo-# zCz6+VDO5a3PlA|xQ*5rX*a4VUR0%-;wXR$<95L=xfeo6HYx@FJ4-e3V!RJ%7u!#Kk zV47YZMtwV?+%v1b^``X7+nCg)m`xF}%R7;rJBN;IHqH}FRqlSxT_yD|blb)=x&+)+*2;2rIyRfidDN<~;CT#^89!WvCGVH#4y#CiJ1m9~slu+Cin}1pI6zN@0nT(fEdyaMR^^!(@WW^oe+|UT* z$g*U9;SO=IO_o@i1qMIMT1+pW&purDOiI0gefMi`?HMf${~q?Pi@^JlQqL@^SIhVB z6>{(isu0AqiPGm(8fu8|4Bf|=dukw}QTC6!y!wLmD9$^J4uY&Zt36$Qx4Sc{gW|yD zmIzi5SFHM(8s|<|iBFw>5&DDwf#THRMe@*6`!!!K&0or}LhK4O$e6Khpqef|>|gKLJJ- z2h~p-!j^0$N;;{-X!pis&U%~v zQlIgk0r`>;an4DCvEgIM@Z1n>5E;51UC~ojf!#9FwycdvU2$GvdmaY9P@zH{VoWux zqVFTR;pwmQZu}C^%Cx}SJ^8NnuacXWUk{vsT>Tx08n^PBQx?-@0@tl0aVbS1DpWR4 zHm~{_o7ZPpMvZrjHO=8={6cbOK7=|`QEbNgod)jmYn`G01bh19#*UGOegboX$Pog@ zPD_x50+%%{oLv<|c<%!y!Ts%fsFSCpzT}8oyh-*Su>B{RIi?(fTiRV#2fk3L^bC7^1c%P2w>y68vq_ zUcYhUYY6>=NDb&;SLnXbs~;Bz0NurQflWGq#(8PsJm1pdg3VE74~N+kmnZ&Qj81DJ zd?M`jwqwOA9KWr$e^W0iZJ(HxUmLVCxt5dEy2ncPh-cHafyYyM+h1LOPWQKmN$O}d=P4aR0M z-usrW-)3?dIR@Z_7WLs=cYzr15d41AtN_cyo8-{&|NQXRGs`njP*4zX>oP2@Z)`~9 zY`JYwR6StPdtgkrH2Kif?Z7Xnq|$?aJ>u7Qv1WxNv<}Dbt>0CwS0 zkE_FMc>Y~jfyxF6JjGmcWH57QADEibgD)S`gn?ft?M9kU3~0V*Y5@b^UlvCpj$5Ia zUxXjU!6VF`jI&o$J$)N;dS;uImRpWIQMu0M)=GW;@%-%FOo$mNOCkKP@jxj>yl-SU zv)GdoxFPZIJC%Eqohl?n6fF{O#iro#8)lXNxs=~6cHPuTzv1apulme}S2yiUHr$b{ z5RF-q8gkzHQ%CDxr+|SyX8$*@+jWupO;FE*GkqjYK#=|adi+E4_?}#SLCobK7IeGw z@Hd@LN_6eU`X%(Bwu@`=y399`=aDjyho|?c-glSYLC8NrPdkcHgs%!9878p!0_Q; zl~Vh8T19MmxtI9v8IzrXR7EU^{cr@Z@(~W>b%}4<>dZmFZ6DD0H>I;m>-w>Naup#Hw5p|&=##lP zdd(*%XGR)R+YUiS5A;_K*)^Tg0v>pFb+Op9@un%AS}3LbzoJ&*xv6n&hr#x;&>^!R zE9v_*ByI;e-s-U*FM*3-0?XF7!X$X%*5EAnrs>6_AnR65_bVGC=?Nv>?};kb z%QAwfQnmd9wA?f?DIjo#^tP+7D^n0n(H(NF))HhOZ8$}%EDeKNlN+g11J%!8m~NRE zqD*BtnTep{Q$?~W`3#3${@>_|JrPy%$={A7h5C>Kzvq67BNAW)A}{ZeJ&LIGO|hd{fqA6o_> z?)u9@u?HgNlj=xSjMTE3Al-341s?D|Dvbj!^4+S%Qp*q~R_RV|s_xjd&OkpzzqNou zIAoU&L)NRKj|9Ft5b+0cMY`%p7Z2mZ@IeS-+PQO6-Ee+mWvJNFEYwmGdh!}qU_{cpmqp%M#MA4I+p<6=t<6|m}A5>yg1u9h;sjMkjShR~$z%G0Y& zz45;>4O=>;^H72={x`uJpb5NE5V4;H)pWq#bDHYv4+15KM3_^YlRWHyj#$Bj0>f4G zvID8Ly1K^3)g17PH{qW24WbX18edIx33SK~vZMUuW96z5LrdDZbjp zP(N2apSBY&2>svQziW~Ags^1QC1TtI838M+Ok!Di*`tAx)-ZSY@Xuz4B~II?dzu`K z%HsL(gQ3TZD?==JOGGV+Bfj;;L|Hl7s|+)Akz2& z{_T+VDkYS!J+pk@F4_GE${a()4sy@rb@Y`tHZ{aJkQMYDkuAB(UA4YzkFOr}y-}o8 zhT~mjAN>^8C@1qNTtPp-i;!0a4ZAAVd3#YU;G*a><$t@V**}68kN>A#v%jQ=9-$lXzNS`@GS7VvE3|MCO<1n_ z5a&l6nPk(CquB0dMG#v*2)O!lbS4f^7|f0#NO%yaA317jAK?Wn@MZh&XhZ+~bQDRM ztsfh@z3p*BJ?v!8YmQ`wJ`yjUX=b~R!a##jJJOMi!R!v=E5aZ+M~h6;@f}^yhurfx zp?;f27~N7ChVh#XmREaK5P;`xF)BV;q!DaY%aOGIb~VkDWoa_hKk~av>uE^HBL~hW zd>A!rr`tk-d$YWP7N?&e8O8Yg)w`O~}bXM{G^$YR{`J=sTkc}=Rd+SZ_>&Y!oB8HVF9Li@p^ zGS9KT$!es~c#0bfRsbc`M>2l!0NvWdd@RA3o}1j4$iG;q{P$77*Dhe?ek@1V$$g8= zJ?3|aC$tpGM^^g!G$8VMEYOW{e8~T7!1eWts)6-`he&1xu{nz|#D*I3SRP)p^J`*H z6n+9Zl%Dxim!WM`@H@CGrebfYkq2Zr3kW7}g~s8|KJqvUB--kl)9N`k^X^O@P$NNo zDQgIKP-*)_2UecdNR!$)`4t4HzUVn!6BpzcIPdeDqb}S2mOKRVWrB?uYhlkIq;wk2alR#cnjGI>JsA8u{6Nh0g*%dCnq(UFhmj&8R=2_mpTtEu24@$+ z;GqPm?RAtiZcPG97hk>jn=Sip_GN{8b*J;Bw?~FXmvx^$V8Kz@Z0KjSp+T9`OgJ_5 z-EI2j@ocr2rcp9{>F(;a7&0P%idH$HL~KIpf|3|x@UzmVqI!0-=j9-#6n9U0om=); zm68&`=I85R#yjO!Og~b5#LB|Lu=zW8;#W29w4ssM_Q5o~tHAyBJ*&+J+8_8jpqUn1 z&i8v6ez?+@BMm8P!4TJXg zSuPr-4Nk;~Olf~85vgcQ^@bZhFog2tVnFFHelBLHE%r<{gxr>Sx!y{z-h9X(l(0P) zA^34Dm5NV+61{iw1eos=FKuSEU%hUu*FBClqdR^%s}5LU+@J9Af9lV< z$E%J1&ZS0trw0n4BtVgx>G{coHMG{?Nj4xrUVX+BIPh) zM%tFCDfPD}1r4xqlzE3J%5ByFnw^~_YYdWEr`=-mCI+IrF86keD)>A$#UtSrP&Y+! z%1{WH&W|V8H~1qIf3%hT4aYLr3B#xl@5ZD?<))TCF|ivf#XD1{(`Lj0*GNoiVPX04 z#Qz{?rb1ImstPR1HR6`A_hqR!t1?3}(}FMu?TA8F+$fh^hlyOCy3LxnC~Dm>psN-ad~H-wHJVQ=5j6aZWN zwz9aAc6xH4+|>TWth2wQ_}wzWqE!v{HdX#7*Ft*#of-QoI(h)~ z;isy(IomwLg}08=TQniwD@VAK(IB5|G0Do-bFr2};g-%L5`8n>1zieBB`=y}wg~JS zB^cBzeCA}YpX8mexGGJR-%|F&{s(Cm3 zR^%uJcb31Eq-4m8$;iL<2dta#gSqt#KpkXIGSPH=~>2<;%_Zct6 z!xTcjIT#>!@N(rC#@YE5$-ybi$&Xiz@k9yUM-%Fml{q;g$(v(z z5P0YUOSmUc>C)~9%PQhTR4qTnA5Sye7C1F&?0Z2Lz}g=S z_bEHCaOONhha}e$a@K!x&(>L`mI*t~n55>3X?H+uF6=~^k+3yRz*eEPm@dd<;{|#A z$79xeUKBzO3ZwB4K}hbY4va_XFiucj87GrnQf+vhz9t_z zU7a8EajW<3X=kh2Au)%L=I0aUVB*dWj6Unj4OdCpENA@D!?yUg_=)9dSA1$CUr91M zdlOKYBMhX;kp^zcz5E6vxC1JW%~5)J3*G0dfr^1qu|Kk<&X%rp`M$NV3*VC~Hh_fm zEhy9{lac|3Z&gsOm{ExC#_fjU?=`pW7kOV9Iy8PZQOZd2jxr7rH?Ot)<~7E*Xg$pU zU432s`8CRrSM5V4U|C4St68uKsygP?=LjtZH9hmg+&UFThV@s;(m}|9Na`Utr7uFq zDWq9G_~a(K|BXDmHy3ho6%Lj#>B~M@9^}y9A}@|klv6;?nGGDJ*(Jko*9`f=zjJK5P^>{Q!FQ)yr8%Ro7(zk?!77|iGNi2Ei% zLA1Dvt((rB>1Mr0Rg=-@!@ zd>-0kB?Z6O8Oo%4Rt=x&dbZk$KEmP83T^si_Ehb^%|I&3mnN#(a5YNj?q6pN-r}!0 zcJ#bFiq2^~wHUtsm(|XszP;$oTkQx)=3+rK} z_ht!td0?-~(~jr8NVBA@7TTpwpAGPoc+}ZcrM_~ltv*gCj*k2AG4E7uLyKPZ{p0$& z?yHo!QbUQwUp$V~Pj+9++|3{Gdg(Mux!o>zY;^2N6*?9C;`!C;&SDs{>9&uq(Im-O zo|}=bX=#Jy>GQ$&`KGI7rJ(AuDdkR{)h{pm&pc%yt2YkEe02Bs7C9m?*@P|T7h0#H zl5^@?4z1;2lAX;qe74hJXB?u^VYpBv^V$}RMfaE9`_ub`gQO;h%ik|PrJq8c%cK7> z{}b6jaW}ec5ZcPd#Ikyp2osxrR^Y%UW)p_cS_s z%R4zg0~zgGavlAi&UZa>AWYCBUqObWWJfEB;Yb=zWH3WfGKyZjiipo+evB=!*$*dS zX~%^~DxbB#PXA7eH~uC<+KSuRPo1Z-sT_y+lz{CEiIQXy@#MXm9WJp;LL!F6-XnB2 z8LPHF`F92h#A~RKHmy;|BaUu)+b3c5l+p<=e}OSPzpfc_G|RhJ_}$^(yYV2B$vyo9 z;aSTrabkig+!E3l&V%F5Wz?h>*w6_L3o7?x&3QK_(oDX^z1D z-Dpg>)zN^(bot};dfD1v$u-qUCX1M+Fna_F=2Np+E^w+lXsgzZz6Tb{e5LU zilrh*YWZn~U7ZvS?H3~liCI0SA&Dfaq-2R6!LnWY(NJzofz_45D5qjJR1L?jO3Ts_j_Zo z*@@6-T}@pbO<87D`T7|TeJq(~>*EE_1qleXTT9bKSJzADU7i06`A@-VP5Hy+?%jlmKE zQ}A?(N!8WW%VunVrK;5N=5(43@NyYr(1;5Yh)hW6sn_L*sS)ZrA%IP(hqvBtnmy|V?FEaLH)jEch-Fx^5+`St5rB4?8MIu$MLJ~2hb zpxpjp7d5}_Y&(s(FSW%`YR62aMe9k^SXDB4m`p7l{o$I$ub3FLXWM8crpaCU62aFh~kY$(yPtPo7{tdgQN^ivk>iA`yp& z4lfrR_49jrdXRu3?Mig?KuLr&5MM5GoVG+h>*UFwx@leqg#EkYk9dS#kuMe*FoVQK z?kq?Bq|U5Hf{?soc<72{5cB3RSx?euyhr=A6mOc$MeEAFc)g$U?Ip^nX_)WAdsWqd zvNEpr_V)CqCTjCaZErj+)(>re{=9VC*R!nFIo)5NLac>Ou?BByK>=%S#C%;Nh5OA> zms#i?^+3#kurIQ{uW~1w#p!j#6z%#Q{PG&PP{W)_WLJDfiOw7nKKC{zc%jkFIr``W z1-LV@)4MAAV&!v6><)#V>@7^Q6dkxR=U=V;3ZZ=wmWssWozcT;=_A1Y`pl}f&ssqv zp5wSK(o2pPwjkeUMi-Q2eQ#v5m>7n<(^M)NKPrq8)~E_nG> zcv|Jxi&3;)nSPvjb>+TSOjXwEWo%AKbYmB4Xo~CdmjPW$TH#V64S!rld`HbRV|whG zO1MsNd99~P)=1fPo(WQN03+@>me*#2c#d_ZJy9}!Gy}|$=qef-lbhxec+`F10bWio z?5A;O?+>jU)$b8&uQ=kOe|wT^3Y`2X`2}wic6Rg_Z~^>=Bhw@{iS|OxgEMVSFcePcO-1(Ar{17nT(n&*Dq9(J!mqEsce30HN#vY; zKbNYMde3THv6voo#jS<$D=!aZIZ~8M5poUa`RfzsWB;j`>{22@S(a0LBwi{Q&oN6j z;xpxE?#T7rDzOn?%jg4?Sg-D$b*%=M{JA`vfkZxj83~aI+nZNQR2BBY2Ujisz1Kv|I~siN$}9-|c@&B76jrxBOO47DQ^X3%W1;T{;9$I@n$3U(oa^g<&WVAnsIM6)eiF zRY>IRv4uasvxrzl-BI*;gQB3Qhz9J=RAT5>P(~C@QnN)V%VjE~KitCd_1(l@2V%SD z?Ch>dsa^$5p}Ds3Y!$tkb-MdY48Ul*%vg>^XcYOjBx*Ani3stG5Xa>Dhbhd=0VzT!kB@<-z(vi!#ZN@Tg9 zV`lOl-Xxg>C6yTLP1!3nSwF4#5KWnL@#^ORuc5YfPqmECEs<}J35Boq7(Acqekty* zf2?q}>TW+0<7V{UwkN8l_&zfY9_KT~jKYKo_;?~gZ@gPdVRgpsxPD1Q!pR^zJdl&x#>C&It(#T*MTph8^LCKJ&J4&KoGVh%JwTFvt+5NJd5$no#!= z=61^?l|42^-f&q&=Q_`t;G5EVaqK3}p??*OPq$xrhj5yVV+UkgURQn9qcLgpn6Dr4 z0$kPCYH0$9b#+a$Yv5`M?XrDbV&lBh{s^he5K~?B*TjKHb@UKiGv{-(0<=%<%LTOe z0^+W^9sCAva97d;j&5DQP$EEmfOruPFna+C8%kiS=w1Ko08mb@Kfl)+EhuT!~L9%*iM?@6a6b|HgC@R4y&zRWdhU; zR7yauTmI1F&nQQZ-I%j-jMondc=mtSs7r9G=>T3pJGzzjPH?5t7dl!JwPnG4X>d2J z`sm_bS^TP~bfoS;Z20kQV3#*1Xd30R#*EM?WL!Y6&Y^V!_u>F{z%M%WYsVw$m~9S+ zieI4!ZvFkvo$A`}u6%={zC zU`&Y6<{;$Af3*7l{vB5N^BdSPIx+7%U@vX=2 zQ2_lnjZlHkoli-VcJ1T;SXI?KosSSzJ5B-9f9$zXiuJ^1fJxzB=UB7(!GTGuwtru0 zMXMdlp#;5ddjp+1`SK-{6bm?9pA~r3dhfwI3el=Wni31QmZzi93-4VFb$8+8Bd&(#9CbKP5Anp-Zfa#xW>+B-pS||QC7D(J5tg3Rg#s&o`6Yg%Nk(b~pJ1G1OSov>B)tnJ)xe-kd?H+#iMK4SEnp=4*#vROc5 zaf|o<{v(92){W1&T8ACfDxM@&j}!jf_VM%}4LNH>4xt)vjAo(}dTiB%h_EV{d7}Tk zHCpX@xABHT>xxIY=0-pd=RHtDUP@dB`zT{mty3SH=%B6bk!3LaqM1>J(-NW8nG^Im zSDtWv^EQYL)U1!Rq+9FR=Z24En^RNghJH_t0xUn6nwjx6Se}AAQ>A}SAvwpj2gd?t zkP@2WL{rEH3}ji4kEnP0D%}{~oTiIK!6jMsM96hJ+l7?)OE1i^?|y$uqjV~zzIg5T zG_h`t&GK)h6xQq@!?(f{ZJT5W)A+_OEeioq)b7Id?quyWQGiYu6gg0a*SBi3`_5(e z^1|x6|0aqF1pCs$wE(W;ZPQ)h)Zm|*%&Wnb5I4xjZzhuB_v_@w7oqr7m%+eNZJ&H( zO5!+6^U!zi+^gQ+UKup-Zs27bcyD_yf8YL{$X4f`L|peTd*4HhXv|$$kGr#PHn6LN zFIG5YB>6AFPWLnJ&w&`|Z47J#N1Ua()1=X+TNq4fz8jcj!f`j4e|u>H0k~YZ)n2Bt zhxsA}W7a8i0>2mT{yyqlxkeHoqo0zo<~?=6e)NctXEB$|sM^!8V@U&Mi3lT%_ScN~ zC&@L%5g|6v)7ypnciUcl2eQm4?${_8j5W_fZD}>`6n+`^qZtj?`M0}&T}3-MEM<_TPOU6LlnDO#^{ zz@mBRs`6VOdkQ|d7odr<7;&*!VzdSp;2JLmJ08rTm8^BKEKx)w8IppXrWQoLEbCgK zbmCFio-|J+5uThyk-|jYAic%G=hn!Y$7nl98i5$9bmG6mKej_47n;vmkRQAuao5~t z)pLgPPIui8#Q%13Sks$oPUP9i&;?aXmUj=zscuxQ^UCed8@P~7HrtDBTg7#36)G;o zV@7%%_>5)2u*zx*&On@he2ikl!9P70AE3MWc1qZbSrK_9M`<1pCA#}ZXKdsvLU$|#NmwjmGh(Z0m?2F|Cv zg(}I5KXgLJYSa*R-11xaodII-SsZLKK3}qe9Vc$%087FsnRFhDL1MsYb2vk*%JQe? zMt0W7k;r|D6rA0EIF6fhaeK@}?oE=>a^{!UE-q@(I|$#&XFX~gwg-kXV}m{pnaXCK z+skj;&O4$RXYjKRitbPULa=K8YZD*DT@5VmUL7Za^Ite(dcwm3D2fV4Pl!XNxF-V7qwn$l7C*PUb*3f z-hD+(jbxsJjmNO-Otg51eJ7TaSjHgbMdEXw#rSWLGCLJ!%FPY_&I=_u@cnop*8&1E zI*b-t$Ih-U@Q)>LNT&e8rX@LuCIwE;&(>q*JEAL@Jw(V-7Y^y(_N7`NWqQdxXEwQViZL_riDg+4;eoA0dNb>%BU@5$Arr(Ugg7}~ zv^#cRu4Tg-7)q67N>fFVrU&9F?B6&L0O_(Dn8|GUF0)?~IOmk!#a{_&prwg;V2zBt zSNf!y1eOU*4B=?tvdijn@fbAAgmrW2XRVP;m^;$s{}9wh`MVa&!2LGD_sAGvPOn+S zD%L@3WkSq6HASlB5i&0&NfjlYv_;>uuogL3iTHWqV5YA@LcP>4I!n{e0F6Rh7n{b! zi2O|C4Nkq5)kXiFeq7!uI!f z&nvdYUU@~8nc89Dr4_U+{gU%8TgCzCxfOy#tayN>j2WMfHRZw7XL81EFOVy=ZHM!K zm_!r|64ezc=KzO***)@X=F-fwNX&6!XW{fuPkCrI(^Y%Ndf<#X;Cv zwH2QEVhBC%R7szGr8Z%u0OB?w`;lZ7Tf`NBw z23e#`r-rB6@n%n6R z<&j^#sCUiew(X6kAYK1)Hea6P8xHPkQ%i!c7a>Hs30KJHESKX~SeHcLm#`)wZQl3F zBSqGyeMWPC|E`C8-Q|1%Z}w1mf$r)C!uazV(FO2Br1iY@qW9X_J4`EJOJ@iqwfrae zJA#X_sUH_X$S$%7zhgu9#PQscQ4E$C@r2>y(eN&0QaGl4&DnoMsPoinPfUZ- z;dY^matGs++O%&rDh2cIPPe|VPaZm4CG5kMcH;aR{%C>9kih&m-uSzHlbq;&GaB&V z0;MeJ&{Kd(WTVqp&?f`Pz4sL-@U5;D-yw?VH=u74W22Ri*&qoE6C1eES0{xDRM zVIJ5;LT>9bf7AZV*k@2y-ns6Bta>>7@bfy`{Z2RZm%g^!j$3rKq{^+LD*hY6i2Dpb zRjtLxNLYQjvwoVTf`{c7pL^dj9YIjlh%gR!yM!<|n0Y|h;dgw`dC>OA)q=7jYLZEr1? z6W7B5$OTx?sRe`FrWi_Fo@t|Yo+53WD}_5plN#Ng{^?i|n?cAAB&TKu3n2{2No-;B zYZd~OKsx?Ji<$}HSSN0Xq<*tB_wD)*IlB{EJJI^nW@#*+Qk=_`qrlAs8}V*sLzWgr z+%Zi?m#!^rw2uv|@IYp`M*O0mR}<9{|dgNA;hSmx_q$A6!{Y(`*J zUFBV~J{jZj8yuiz(QP!+l^?$uL#9rjDdrKgwOH5Rqs_dt^;n0^Vh5?Rai0MZ0T^2PUg`2E#@ugR;DjE0#b z^vyy4k&5jD!H*H1XBnEl$%;uit6S=8=bP129@PAuRX zzIte%{@7=bc=P4p9QCC{=^HOYzYFflpNZ5@enaE5pL6uRO56K97dy&af#-(1=l>y& z)nVKF%cbQ=>=Yf*Q>j3e_a7qiLt#sR*GAE=cDZ@JDh!B-`yi+O6ef9D?Fpp$_|@R)O2=+`lPvSqjdVbmrS4tlE*7d;OT z5rPBB%zA3^%@2)+WEW03CtIvsP*(GAyH_ z@=Tc2`Ji$Ujl1{73&Z0jzE>NS(phI!dLW)wc2X4i^K(C?w?9ygB0TlSsOJK8djmFL zf3;*^0GCG!cz$f6=@>4`sKETV05X&;*=;sfdH`Y0uS4*(N}AL9dV5D0691IWm>Ds- zBaHi3jO66v@X^sxW>3Xu7(%q|y!C}?Yy|_C2=M`a)7Xj9EkBKg920&$v-SfKVxoT= zaSD6aj=g`*z=*Kh&RZF2^-&ok#m!tgNL0(FLEG3#Gf$5mCeAw&G@5eH~`^sS6Gxq2lW^wN_Ig5aE!|rw`aw9JC zp#FXZj>w<6Wyk=xqqE=H42Ua1f7-ks)KQS?1`(8+zFNWYmu@`DuzI=o`!7Lmf#vhJ zJL;k0FpB4iyWd5YynkXbAMf@#4_d4axyd{&*0d#pj&f7axqNucAf2VS^>~J5z|{wl zFt8zXa&kU`Tg;`5B1G2?Sv?Op5Kd)Ie7SlyRKvh5Kqj6XQ$s^q1|}V-FYJ*uY?*j1 z{q6Y>FIIyAEEVj(ufPu?q@#o7iB9V${t{_i7EkW^C~X?Abfc!0bkzElN3aS?PG=(+ z7-Cg9<`mt*+LI-xM0mI~$Tgv5R8VfTQk~Mur`A@%+p_o`+i|(O(jDFryVKZ~;dq2x zJftwQ__9FH;P$JM1L!6@i_u_|*2tj#F^Dx+tZ~`t21=9Lg&Xqo4GfX? z=z0v}F&q;Yzi0S72W(yRIOqbcH{^i0D^T zAjb8KrMRf$L#f@;Uvh#!6MER3>L&1MT9ziYg}gJd)_P_PLf4!m1E}B$TOp2iKHhWTy2B2XFb(IvlT3slTzh)|h|Ead#>$)-hLQ zJ664aiaLPCnonXEMo9b?yxn&BR`zqVeMk|0P2l`{kyPBK%A2p~%lqF~Bfb0F9X%G^ zgdgOoHa;FoQi@$sM4HM6b_z1b>0Bz&Fwq}GVv%J|>P&+N#N1BY19U@$x z=@@XeRn4{oVY|RCO$M+PoMXBNX(8eH%xCt>u=DWm?%M!^tj<-iaVYBwaz1Jv|3ZVl zfh|@4B>b7j)$LI97ZL2?9A(}XB#lC#x_5E;yS3$cQDN=t;&qioU4K(tuB8~xXLI=3 zpfs$!cY*Lj7#hM0#_B^$78hYmf^uP};2%bEaTXbG-nRwErF!+F`JB?`=1d&S%&U#K zN$JgNGP$l&G_x`}nG9QAu4z?v3qp1XV29d{{zObI>{r$EP0yWsB%p!m3;>dQr_oKq zNM<_Dv}%<+iBSDg>RT?~f37qWR66KK+mDru(;tT+c0>;#&ju=4_iFEn;}sZ=TL|p7 z=TuO>?F2sun-JgJfcL>X%!`t+@vD^!gbWet7*mYFb**pSKCzIMj^9|(H2b34yy?eN zlb?b&Iczdn@5kf9HcPl-NLH%j_)$1*YjW$oc~16Vxs9e34?*J7^bBqsI_V?i^E^yI zjhfyCPuAc&FOA>)7M(a~7?!-Eqd-2d-LDKczFvL*Twls`Dj3+cA;&RkTN=z11Ab7E zvqQy(S>TG;70Z>0ExVu$LXAJ=zgKxBf^Alf6}5>FToeyEPUfR>xac0cz{l0hH5QKI z*ER}*0e^&3TBoinfu+_t*;5oheCT3Y$M3gLk0v`5+J_JU&UBpD3?TH8>*HUWBccg6 zOn|h0nMlS zXSu>YUk8{Z2->fa0L*VMJ?%}6Oj5$h~TeLb_T>X=few zWu>aHIrp+e*wd6i6Pj%AwzB3ehfk*C&Fkv1%G&0SQp3XhSePyO zZInRE#CPL79$l2op@Iw=FUkATUhr$xc%I)@rIn>-_Gp@beQKG@ma3jOoK&k=Bl`zk z=m+7?3}!c43Y5-66zmpzec0PPz~RV_G750asn_;_6B?TR=DNBkjiriV>zbE%t-*Dt zZg<7gyZW9N3wldEr=cjZT${F9c$-UAkUCe3*i&iZ;6ZoZbF9Wi8>KC~fug-=ZQe*; z#9BJq*i*{%17yI1jP$CtG4rmFasLFSiiG{T(?lvuI>?XCHT!g(0zLJ38Rg1n*kaeP z`)72~!}j|yAHR<32^#&m6^-!HJLS!~#gUcM0ZnP4VrITwx1Hh^b$zLhyh=?Q%n~J> zzz$Z_H&FXHuCiPoxEnSoWfjnD#jgTC(^wkxe|c#bqj)nd+=-@SnB@qu!Pps(+OaS- zT{^nLe-Oj`E0-6OK20P5*F|c%56x6kwL6J9yTKPB=VnW>>;q9T>6UP6B~ZWVI&Nn` z_RY>lahxWmKewSQwP82CMOR^L%hRPkzKJk}IXd6_6VnX(-yo4qXWuu4@Yj)FQS3=n zd`qZbE0BA}7npsA$U#lEhLQx70l$kyuZYU8UFOB!TLTbI4nseGH$_C{4!%(vyUF2@ zvRfLGUv@irf68ZpyZSAjziG9#1I&z_mo)yLiEl|CD8W<@ivcIecPC~xh9cT>le|9& zlk;THJiMw+z*MyO!v=3MaP*)KE?phquyKRoc-psjxv|b!w&d?sz8}pw_%QNz|Czhp z9(wMXW`6?xmafNarPu?VEvc21u4fybtqk`QrQ{{Y(W>+k=v;7MUKi)0pc03DxiHlA zVPa#3^>~{v@X(S~h8wj*s z+uz=a&7S|0Jw&jJ@*eDIB!qLgL&Xbz5e6V-C246JQK&fzFs|NF0mXrcZvQKpDmLb| z6j@X$i{E4Cy{Db_51UC(+>*QTkXFJBh(u>bS@*az&fy-VJk^z_B?o`Sbyj`#W=X+d zJVhza9~XN#%UB&Vtgh3@x8_fn*Yqvx>#@jvnMR?HI6-DHMX|;;WOY!}DXnU<32~!K zl?mT)m;VkLi^{cbkBLIhY5@c7SV`67PD-+eBXy1NTRbE~OO{is;46}MYk`VvDRgcg z?>(W1B2b-t5nclD@Spp$4AOaNTw^Z57?Bd8m6v;%jpwXQ_(Jp5Q~5-(qiCOVs@G+= znpk`?Su&K-$;tP^t^D5Y)czJJ`;>FCBInh7?zxLLaB>rDqf`nQ;JZlK)?|EKxc84{IouZlbRJdVc~kfI}lh97@U_=B z+KT;cxMTIWy;!^ar3z)7dSibkD${bu<-D%2oD*lzR`qEtGA#`s2v8G7vhB8I6N|s%u@c0s$aJJ_8=Z3*dy&^<>2VxqmbB!bioPig8{PZ z?a{Be^>D)aQyR--k)Kj&8y-hp2>$#~V)Hulc?<-)VIY4h3R0FqnbX9$ABWO;;as7i zA@N9nXSdD3br$DY2Q=r}@VQU1#++==!$Z2RB(@u^;E81U_n@1{(WG~_*j>Echb}o? zvAd+UxmAgGx3T2us8cY~gc4%-JAH7060u4Mg7NIRsT+xay4ups7i>ZILwbI@`Ayri z!l4G$E$}*v{fn62BKt(_YiO%C@!Wm5heP~@5U1*9B|^IlkDtc)I(r=b!hdzTu+}m5 z@@Xvu#cqh`)mif^JOtNvCK9;~-wFNw3r=$epX>I^;e{diI2J1iWb-?MYT5pL( z7TmnR4?poAcbhon=XAQg-#=any^`~|d8zLPcFB1O-X&$$uS($gJhy{*PsG93qf4L= zLy%?zCF8)2x#+y?#6OlQeSDo^BE??*0$PgBvT=WqNS4z-^pdmW%967S{J`r<-JK89 z8|SQsLWG(FIU2*B@fSY`J(tXRqO=Dj$F`S*>sJ=hAfJSs9hapkfdf3fP0iF9;ZROH> zF!C?2AtT2f|(kn7}=i3F$?naM zA2{CPLPUtlttL#=ibH^Sf=mNY7C8zUlje$qQ&3Q_=-=mkgujb}f$zoH*>U|Rhq}8Z zrq_9;!^Hst4HoAc9u$?=un|nqlcfw^f}S^ihp{Vg|IQH9?Ym0*`7@*YiVoAK79CL% z7L-O?pV=b0jN$`ekTuEVrb=kkBWmue1s> zdEr z{g8~_ARn$qh_|^GZ8kIr<*Bg}$Mdm_$@EUHM;VUQO6{y-?t#)5_w=)fwBgv9toCj8 zFb_?`jsK|IHTTyTHcg?4D+_b;6(=Wd$XwZ@SzS999RXgD=fiPZwAj|azO`;X5%y9} zHkYtRMhK92zP@JsKe4p&j)?p9H(%gz83C%NtHdM!^G*w&2=(Dx_}L$2D9t}d-d|G% zaxuKDsOa*`Wr{K_cVhMNv>tIotaI&VUoVXVf2j&BCLK`CYLwaMpYJVR=E3=^C6AN! zNAhtT(hg;K8igdlVef|sq*b?%S8O{&s2CU*W+`prp0}R>iMucI@d)@4_1NTw?bW~E zKiU^#_<|hi{|~V|`+|5d_^*c_V8Ur}FE>ZBw5qL0+?GyKECge)oDY(4fa$vhS`qgP zLC0nU#1J`&lRZ4Dxer;cBmVDGuT>vDXue3Du9VkTpSNF5&TngJWLnyco6A_ZL4%*} zhW{I$Jb;MpHMf+Si(10u)3<4-Z$ZQXZQd!Q^FC~4(u_v{P@}@aw&_ZXm%_Q!ADHLA zPA$R$rZn%1`?XZRZcN${Or^LExwn6^9%`4)XHiG}T(r&1?=D5>8k3k(Vwx=~zsk)6wbj^3X4`7a&bO7B5f5M04 zg5*D!<~;Kt8mV#gKd^;?!+)LmeGvCg5eVuCw}{x+HxE@~LEi3WEh0nWFWh9BGWh;x z@%{CGDD=3l^TC@YLBv!s9@+;O(WGr92GYG-e>jOrJ+`0HhE#?`z;C-S$zo|^=aGK0 ziY-=)bb>$%h(zq6>^R-8am|KZ#P~Fi%s=P*L<0cx;9u~?kJ%C`Mu5eMH^QWDjB-%p`G7s(|4-QqS#vaV%Z2YgG-D z)XxXRq-ZFBU^q&b<0U*;3P8Onvo2J`+**l#nO`)3T*!q5 zQ5)ILR|_FdyxTlMB$}a!UoZJI1I{@$)-qV-j7>mDDM;3mPd`3BT_nxeSEc$1QNdJ2 ziV#s}y)A%VwpPh$Hf7P-Czu+80o3`N64=0B&;Z_$L1BtAHFUxM4NP7;Gd;^es(EAh zE_+h>owxKbnzMJLMivQbBh;$8wM?s@71;dE3IO|=OiDzANBFH)XinhC9c9_^V^l(S zM92UD1h?x_f)R;W8kew8Lfjei%4NuXlAmH)jx!26PMO`^DRya=(FkI?Lz7n3J~so@ z|1C8vki^6X4e>@q-G?-ICC$2S73U2LR5vQxfbey|#PHVZD$+s{oiIxNR`kLNETtTz zE=Q1s@G%mw@L~fA@Hi`%Q}TYBmtQ>-A|F>>7fdTjP>gNfU~FtG_x7!S$H&&aS{Mf) z;o~EkQ2s-YH#R-90v(}kTESfZysXFU0#U1DvhuZ|4N7dAAI*R)9mS&$(rCxnSPq9v zk~Z^oBS}_9P@G{yAMoU9j+l`EY>6I3Le53OK#~-~txBX1(oB)bM-ZT1!l;50#j1fD zJ4WTx!)Rnkz?V&QKrp)b&2jW`nzAVUB>I5Q`l?^rXxugRS- zfZk}X#@6LUcT0g;D5}ZZSG|f8-$sL9u{-mAG^G9Fv>nuO(&Vm+h`DKZZ`{_M@7mC) z1s&3**H^6#5GaU`(`l2Lsff_?3@f;vgIpttWMU$Y@G*6WCxn(-Fi*`YkB>D7Jubb5 zgY@job;$#}-yFNaniC0dvH~+(^Id8JPUIOwg9Jn`(g`R?k!didd0TRhDf``zv;2}z z``yQw6kZ<`1}{as8A@+Vy8{w~31bzBTs(`{vbYY7H!v>{gC0sq)z*cH5!~`Op8u5K z)G6_>L_dXU!DZf2_K|>D?=P7xC(4#%3-P0IoNrVzzgJoyMDBMzTObmmmY(i+{mqOr z>Z?-(ByrfQo@%q?eaggy-t2Ypb;9b4L1|Yg+m;N!PF+owL9#-1fZ`89Ua)Dt=nFY$032&9JVHx`v|yYR=vY!H&tepMnQ#KaXw z2Uytl!iEX1>FkJ5gTSxx9ZFZfvDjW{;B5?2r1+LLnCCpZUN#&WeB2O}Pe@tt+MWDx z?M`)GtWLNhjA=&EeP@=Wt?Xqj5@6TliY(@ChStFJIar8=98fVUh#Uxl!TYk>^6uWs zZ5P=)HQziYI#2D7>j=^w-?4)H$Oxu4S9-^@SY23YRC$zF+zdXYdYsvHeEXZ~x1R>t= zS4^x_;Y9kNUW8E!-jRML5&)Ou!@E0p%B#a?qd|o#XVS8xDf;X*6kpcGhS~dk?`?nG zOIp4f0-IM_-*n*}PijxO*F|pqUogWq4j?S^T;Pff&{ECNxwPtLAbatbcIEiwl?4F> z5q4n?tw()*6hg}kzcLg3Xw)(Q02-Tzo{>S$`j0BA59;R@+;U2r4w8LF@kRao$2B>v z>o?<%Z*F_rFVr;S=wB4^P={SM9*{0w9<9>WhK7g7wg<(DUw?P#YEPofNfT1v*)M zoSyM5eY#L0q?XA-25jy&ZGje_N?J6BoH&O+e&jTrLAR}Q<>?(MTb6$Q;UfAck1>4^ zodUTK4F(6vS^CB+T1sR<4kAoL1_5uR{`6>m?Th0yX_4|uuDM=b%cx_m7It#7O2-|g zfBKXdZ6od-T-;@^NJ`(8f(b@|ZwXYBU{)ml9B0I=&rxO7Up{d&Bre&8(ftl_I(=JD zx#2tn03{TnZ(q#uW%=vVL7oD@(8;kWYKukv#B`%0*ZOHMqaMHzNa|%D zxy`?CWB0lv2TLejwG|qz#?5dPDwm3tp?`GKe1rMu4hV2BszLBeTifejsceCb=f;MX zz1~RlLabQQokEVOieQ3=7O;yh>Z!urwSL>vh0E|k`h=Z(k`I2mIafHdS(h_y!*9t; zsfTE6Le!miDvRF+A-2X#;Qcin9<9i?Kf(B`2)qpnI{n22TCA!YXo}hl|3Mx*e(m%p zXDLjj!-)M`cXu~HaM?{%Mz!QTBpQrJUkYl(VDx&AjgCH~GtqB>Si_~2FUUAZEky|K zzOVzU`WtrB5#21HA>N0}I_*L8b<9w*__!h8*Dy{IDrBQLFaW%=P1LmzT zQN~`x`|e=cOqbI&ED^--SiSVR!Sn`?_l*BeB%;|y;#rF=`p46*-iG)k@fgayd#9P5 z?b1LBYYR zgTe>I5coEm_F#`V2ORr+m*%;W?A9L@yQuT{159^bBXh_@Qgc9@9MR7895gjIck<_j z&7J>Vt{G_=;NoJyi5CMf*#LT;CAd(^?KOB$5wgQPqufwyK*zzMnLlxP(K#2%eL|JH z>5hr$sQO4q`51Lfd*l3NKIVku=I^QW5*CM%VWnceQgx2~?3V|gpjUO}(QBlJXH3hgl6V~JX@3}$q0hIw|^?o@_Mgu6oCV3&_mMe3lF5Xx6J@afWAO(uA}R!cCMXO6D8 zr+f2@vH;10hlwXt~qKG|gnF(}E zKwe;KBGV%N6}<;L8>g(cN4?-s{~>tAoa^jHf$ofPo+6>`@#-c&z!w3F=KXz`31~>Z zZ050)6}M@7HG74_YSMKug|z#%ZQgUNgt;9V7D(%_NdeR29F*A zl=x$E?!jG{g3#ZbO1FsYu-DtEi3!OZ)r^)Re`%`kC>W5)oLXnu$)SO3kSA_h z37aP)CP7h(!;p{RGJ)U7*RadGxh+iO!!wTSF9yXUeyeJJ^z=o?&yKI&YzAx_=aJ_Hrdqgkm{fpqLQS5j~;YJBVOMUb5-!9DV0~ zeq{HyTK5kZ10m%M8cd*YT)Ti6(iw9yW~Y+YLYRz+B!YNB1Oxc#R^aaLu1rc1s$|PILXbg4MFmJ2VCplG`$1%J z{Bu^|5o0H|(x>se9br4%X(O(sl-IzQ1i%mB`t+2PI^C%Fm-ipI8@F&A&`EX*!!IiH zu}k>Qj{s*!OuTw06cAIwof)a4<2)4-6XUu`qw^!H<0pWcSI46DB4*f9jipeFQG3x> zm?lU!*i{OI`AR5u7-$vvS;?aou(J7QzsLL@-r99=>(|7JYX?Yfpz=%;~SIaYya}|FCEeVVDgC?5Tvl5{4(kn{(}V5^J_vquJAdw zUeN9DVC%f)zfX66IylJ{o31sxyu_EVVimWZ!+ryjZfa9`Na zq=nqUtsgp0zkmNOr=;{15s?v{g-@S8Z4t88P*d~U@Cf?)^(h;h{JFm%R_Hs&m0F(_ z-Us>tqra0H%`XLzVPrP3H=yO`&aVi0T^qo^4Stc}>j0O)+1#X}XZr4Ygc zK%aK23}+Xv0GA9wpJQs;`_N`l_lXt-(5V(H+!L~Da;9;6J^MPFaxDP+d9g$or<&z?}#&d&Sn)=7=tj@H}dHJ%nm6cJsmWqx}$mywz_Q@(- zk4qZL{wE9RA#--=(8mw7_%(K#v>iH5-<>E?E8k;*Ui*r9uErL6wO5;Gx!}<_n>|w9 zM>+PKtQ{0Tu@#C8=M9zdi5a?v+CveSR-vG;vvYzbCV`HBkt}HpYIP zCakyLA<|gc2NYp4xXv``WBDzPlz9`|UoE_fzlGs;e!&J^hx1+?@=KJ>I2?@-WND*&zy-$RF<8x7*80$#Ghi|FbIr#O!Y35jeyb| zRLcL|fENI0d0-a|_BVT0&&Hwv z#q1+g{OtKlbm!cKFwhQ;bG0Gg!3%C}!V#^I)Im{EPS0E;{`jX2 zt$bY;jZ85Mm>>;D5hs(%QI#y#VEYK6q2Qiv8PUm_lStwO9^eL|y^2(UiAar=q)G>5 zNAP)R{fLD>CC%pls*B=_AX3}K-~YdPR1QkzlzLj_=9`kS^Sc`Gvx|?6N5Z36xaZ#u z!+?&DrC4OBRQ;}JWizOG6Rd|~V%f?BZ~Bbim#GS%8+sq1QP>D)&Jbd+4rpL8$* zEwD7uFt{q|>;I|a%HyHx-uNB+k{CN-Y}v9?_O-DjDcMB~*-4ZZ+qE~O87d-DSsQy4 zvL(`Jvn3{Fuj~!7j_r4*_kI8T&1dc(_nh-N&vUltocsNr=b3nSf2>mt-sAe008@s=?cOEjfpcy@Ne#A*c?^~Y{7#N3^Q*4KOfC3QKs()Fo6Dx=GDQEjRJ7k{lP&5*?d z^#LBI6RGO%5Y8@iCv1I2tTVNwV4mtV8^rhOA95F)`DEeH0F~X%k2n775XiyO>+u&b zjJ-{7@fVK`e*Tm#tA%;$O?G6-6~ROI0N^Ux+%e6RRR*_6Lfzz;3sptpAdRVAM;AxG zco5*8$`l+yGyIAqy$Qj@jM|jw7vqIFMEPn5tE~MziYQk5!zA-muIH{X)=d*Qr97T@mzx(R0|R83*c9 z?eJP`b)E76$gMs=WLJKqQB`zizU*xoyt=tafus8KrDGl(bzkpF_bi+z&8B1ro85|& zw#uDZl`bqPVO&MZ|3f0+o*D!UN*D(YX*RD+sv#8A)J8={nlPlcJP(SJ+2u~JR>6?k z9>nRUYboRWBaQIY29FP;d(%YWNdb2vtVc?mL>QtPcJ4jF#R-Wjdj7eQ_;Yh>h)X}a+JQDi6Lk!gWZ z%hv;K(c{nJt40HpIz5a60|N`@1pWoQYQB$*7%`%2Rz=;+FaV%JTcQmMEoH> zp)r(XpoMTKgJdMTCH#61U%$25w0cYu^;9FrI`~*YX-)rZTUlv2+Rp26+!gJAmA{`% zM4d}b=qxwpG7mQ*XZ`CdJ?iVShOU6BolyjHz;@TWcYdKQZxZO7e$!<~ zW9#^}wC?kKCYQ>YnKaN7PdD|%f2U|^X*Cc|bIT26T--P=x{4tE8TU4zvvB(u4-dyp zl_<&NEB%TsL)&-2NZ%+Gc4yYmP{ku4P3$|3ja`B`MV|e}i!+v}H1fXBkHAe1AA=ok z3@SP%@5IRRxEXnJL19DG?5SzhS9Z$oHdr!zgZuMbif2)=4nr*+pR!e4yN<{+s$c#5 z^+orVOJ-k-n7bScqF7C{EYX+$1d7|>}VC^uO@aG=I`b}3!W{lhgBAkkW2xBC#w>5gq#SP!=yuF7{u{CuA3#cQ}3!8Gl&eE-W9|c_$yvoL? zDdIla{aYB9TVg z!oYWx4gv}EP?p@0!;2|@XMf?C^_uWYKhn|f0m02UrB)IRv^jZ8;rin3p~EU}Nje?6 zVe7hgSU#D{se5jQ5lAiMYq{DHB262+xQQXSDCL9ILp}0cUV&=%+*g+nfI_8(mb>wK ztc;{Gw{EwFalgy|tzWKyMX!r1KM0$?Q}&j5x;%r!A8PbOn!tR-%x&hR_3I#kp@0^= zb+7(_(54BXd5HX3ds}<4qHE&CxL3@lUZ8aPi%TDKadFXKR{L_Ov$GSf*%e3z2QSBk zFD~T|CCp2>*xRihYKy6eA&TEy{I~X)iNv(>7kS%nHaqUn|4C%AIeeA8Eeug58tjJ~ zr^ZM~v_Fd&BU{aubmtKXwbRy^(l?+a{ouicXtTm=)>Z0R`&>Fsn zAijN@LT}q2`FAUG8@82}rxJBc`7OQ0+J7DX(GjsA8if?+<5PM`Xmk8)_cPk8RF0A} zh5SZ2Y8rZ=T)KVsarP%Mq6VXSpYFNU=A-1zYsRvuay4nSGfQ4@}vGTK_Fz9 z!^PXXc<6}Q)M8)Dp(M5i+2Z|Bbv|H^Y0`$U*~_z2aeZ3)mX=B?_8qpijE3hWY@Hto z1n+-4Ywct&TWp3l8~>pp4Q*b0qt3wys94qOuJn37Z{aH#F!!>w_oQrX?X?ujo|aP$ zCN=G1fu}6hAGJ5a@IW{_*2s(S)z8U`AP|_{H1k|a{)<>T!m$L}1%I8$utg^?m04xVT<^;_iPKl)kMIo4nEN@kDM8T2 z1nbhRxsheQ9b%s_FSR)y zyMHLby*g1Nll7v7CPtyYVKgLrY4(XC?oZ&$dqK}E=4_?=3! zl-ixQ(Y3iHfHSOQ}BSp!uR1+>7JxBwLMOJ&EyEE>gL_NLE8HanSr!DR!VK}6^%$V zD-B_POba=kd>a`GimZeqm~~&xpY&;LO01mkdZF-Gfj0@My0p8c@$u6qBLnUjq^kQ* zd6E(<6GQw{y|e5`d@!M!@x6s=I^m)sL)}-d-P&dsX^0l7q?LljS8mQr%GWOmo%E{i z@P(kjWRvAdJL8As6q9AI_fB!@-d=jJO#PDJ>0j>82VVOUY=|*x+JO1Md=1;rkCvO* z$=%BCEFHSP56v{YDQjS*SCu5bd-yiDnJw;#TUC_4j2mO4C;zM#8A74uZpuY zaWT<_M$#5~y4ms7^px%G7ds#GSzh^DCO8xJEQaix_AJVu zC-=RUjH_Vd7q%?jZbhS?N8ejhFPuEuT$bqna>&l2F75;KbBjt>rL~jqK50qaR7-Ok z(x!N^KEQUNc=T{-d#Fww*BgF%YB9;!9qaY;y{quV?s@V2wTgTqk`sxv4pUYKS=h)n sND9ma1Z@@;+r@am9Uyur<-ZwAT$(lK1Q#7H$V1?F!o&()Y3v^NKY6a13;+NC delta 20936 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 diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 387a2f40f303f957d2698519989b90d5ea7c58a6..7d5b69ab1fc23c5c81c4eb4da5329a4d2c2b9f75 100644 GIT binary patch delta 14784 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 U1m4V(0Q94xpe|n|YwG{M08%t!*Z=?k delta 14259 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 aC_ltve;8#iy@7x~n5v5E3gvR9f&UBg&y3Rm diff --git a/icons/obj/clothing/suits/hooded.dmi b/icons/obj/clothing/suits/hooded.dmi index 5ced5746e4b7b242e2f61b4ba75f98d423c11f82..ffdedb06bc8c93c22c78a77d3c994db1e6eeee90 100644 GIT binary patch delta 7901 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 delta 7111 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 literal 14854 zcmcJ$byQT*`!76%fHcw_DuPH$w=#fI0!oK~fOIzl2uP=tbhnh0)F6$7bjKhKL&FdQ zGrWiI@4a{3_pW=_yVe_joY;Gxb~lo_!+TsVNfS)8T_aAfh))@|qwJ1`BY2 z@Nj@0a^8wYppobEUe`_D!qwcx+R4q@(E$YV%FIgXbXepgl^>naA^p?-Il~yj$$%~W zq=V&0sZcW!m`?fa+Z%+`oI~R4RYus0)e%A+h97=M{?gJ1CQFCjFzz28-g+2Zt`E&R z)D6z%FSdjoEwld&nNuTa&@gXu_jFIWh`Qx!@>ddsxo2q9w^ZKD*b~1c&+!lFyCl+J zu#(D`Oj#|#T>F0a#M?nq1NtV!g0hGqmtKtXcZ3&(`Yz7H6s>lri!o8Fhbf6q2G{#4M>4 z5V#OWa|R~KJ(cBiNexv;Nz809B-u9*556mjD|~svfu91hPE;GkV-zbR|H3NM(;jeD4suwp(IszY_S-8x(wV&_-Q?jF>V==+K}ijn+LO^i z#aq`q-^;6?uC3dUOX^7OscUi{vs4g>1@uN&`blVR!jY7(Y&LV8$`Li z#u=25JjP%BWbT8Z>Zv06FVt(@%8v8iA|Avuo{XJ3WUxrKXIY26SK#O#R%4&ZtPBpQ z=F_#4=>!2i81zd&eRvt0y}d@GO+THmm^W;bS5G=~QSA1mMBipdz-&_@(JuTjsJHDK zOTOvlVp$^{Gw92*ds>JD@R5_v7_-^jDo|ic1AGAj%C&u`W9R2xpuR`4;${4U((cBy zigIb@u=^D8U0!u6;HEp6O)x`EtDm(LVyog~T0k=e6%tov#Qkka>KNb^pCJu8&upNQ zJ22oH3|eSX7}c|-yh$5TuQTuIl(Jh4_MHpRg)$|6D;NqiGk!x#Hph6ZmAbKbG~9{J z0Jr@u7qC7=-@8SWzPM?XYPq;6%W8iK61X-#auy#WB|_1AOjmKyS&#MXjE=OoXoIj2M3#^xl&YlvUjNL^Z!H z#WmaY5&ON_4gNlH?yZM$^9v*gzdz35POH%&Erz>2|7SqOpS3$^LAiP;OU?7nLCA+3 zFq4kB%)^tu51>G=^>PYG>0@$Z4FsS_nIj^3K!;>^N20eU`!XO< zuf(^)sz)Rcgf~c5ZNUlLJdcdF53_?!;$Zs5En|PYu^cDi5((nLdW-%X6!@*X5j#o% zvlS~$=Y1N<5U-dWQYEPv+D71Y_=neJ|FxwasB2NIb87Vy5<(>G6&wHe|P%bG?Hg^lfV1dUiCta?#J<% zB~X{RLsFw2dKXopnnRQbw`G+fVL}?g)TpQ+=8KjZf9t>e-eN8v28;yRH>dLb5KpO2 z!!xJYQHI>f$8g^Jcw*LOO1&vSf7TzGTRmM$Z{KuudXkQl%G}ght{N%eot_G9)1W?5 zdUX=}gu(C;i@ohZzp}|l=TnT9i!*F)E!r~)$c|s z0~?Fu>I=-ZH%50f;Mb{&Oue)vLezNamDLX)+Jj1RYdzw+(nijwM4l?g=VN z!wXo8claG&oQeay_n60z&#DV=hs;Cs{`KE&RE=uW3zF}N?Mm(;bF`DNx|`t@wOP0U zC|4bO4H7{nM56>v3uQ2w;0ZGu=m{_6O}t~PCw^b8!Dn6L!w;y->;QG_Kw2&qZ>}*1~&>OqoqeNTqMh)Nvc*>q-FJ`W*U(=r2Q_qUIaN_%0m( z1o`~&ECAxvZIqIj>KRS3VJ+6b+)={Eb4 zCI<-Ya6F95waj`8>m9Z{X~@_AoGs!p$goXmKgnXt>Eh6m%8{nX;Q)jGUvvwFr!gN; znD}f9_15LxU!1oTC7RnwvP+mLT4{TIP zS1>2KbQbx$xRK{f=Lm4i?O%JDWQwMQnef_m_XnVqz9Un0dO}rk)}ep7osNf&YP`sD zs9jGdX6qE&A)c)+DJJpG-=iJ^ zkT1OTtd=p~>Cw$Nv4+Ryi@PTmuKXAk2y;!I@Xt$(zuag(+ua@UZkmV>_hSE;xu@lv z0AD`Um=OciAD|oKgV@V!Yh%b_q9Fo_`mhkqMk)XLPRa{0GOEe3><K} zU#t3Tr9XIr+78r@^UXA19T9AIGn)jFZjd|n@bJiK%Chfy)uE~Ah3`2%D_(S}WW@s= zYbAbyR$3u>BH1(l=di!Z-~+OMufP1BiM$n0jY^WhX~gLY+lzcZJk}JPC~bS|kDyy$ zO@;jfj=cPQ%v2tuS77khq-~vQ{@Wl-ehd8|opTJYAC6vxpBH2ek{(+vvMTYGZL7+^ ze*p+bdCL`k`hemSgM$3~9{`ejX?2KX_r2Lq9o~+Fd1vcFm2ABaVl*68$ zmAN(#P(eaS5am$JSmbFR2`FYEq(CFXX{l|DDu!O9Z-l_UND@?>5pQ@0DC-HM5HP-8 zodBbo5&0xLU#?@CYTPko-8^r|*}kd)0O%fGbQ4-^!|T7HecU7JBN@*R4nLtr*nN5( z`|pJh;Y+Usg3iR`K2NbTR4DRvn>_9S&zIR%A#poyi7(w9Sc`a#%6-U>_7aBp>=PTs z#Jb}#${sTpY-V?{#f6vZQfy~of`HSvd=mFhUCOX!7j@GFMMue)TX-5M5IAX`=f$dc z?Y0^m^1nF6V~(_KI>q>XG4kIZ4=ycW{%6Ca#!v^@h&H}qLw`g1;_295TY}|c&l_mk zFThRb?zHcKVB;$oHrH4;y0}6%l7H{z{w+~X`xV&XywGDU_SkCd7?Kzd6 z3{yM+#8wCD0uWN&N)v6(!X3<%WD4hL=Cq{`a|DaNt9nV}^y-ffkeBzk-+t9~F88s) zpA(*K9kRM{-<>9tVm>lBK)5T)x@cMJ>*%qopQVQa$bX5TEwq)XL(o6K;Tqhq zHb&~lATcEK?z>QA`5cKQ-n+KKd&m8V1FJ^=kFFMZFYJraoxB~B(V|oAxfb}(VmI$6 zqVxD{uraFD@G!5lx#I8S%34qM!47(^&Uluai}TgHDB(!A(%DhWD~t?&8eU(cCW^10 zV;dvupMDB>h^=-4b$BC9x@4F(lb(J_y6JY&{T;BuHe*9GWt@3vRjNr)l1|gtWyfE; z6~BxP*HWMcTzOew*%f&%%u}4dfWyeA#PG(lB8%4<4-ae$O2iwWALzH3^NMO}c0Wrw zKf!)YHr8D6yZi{TouR7thHUV{E;V{P#AeX|3EF4N72w@T%_o)lSocYC&z|0>8IDyG z71);NNN@WG*J;t~XUBVctiZDd{jHsDX-ujWoz=6br9&il_=i4+V5xC`Twr3nGX3csmw(i)QJ{VxT=0b=U2g! zcYa$xl9;E;X?4+&z125A&=PSSJS)_O5#-O2QtVV1x+*0jGWG7bbCU zeg#hhC8wiJb?k9_hbrK=0du( z=A5e>GpI3T>BkCzxA85tQP_NR)e81`2m zgRbQ52YO|(Z8#>RvI_$U6(xwtFDhS&Rv>vh8MuJ?7tG#j2s9khQfndEf(6<(msU(dqI3_;a6`8L%LBy#M&| zm_Vba3bs#xFBXKk5ES$FXCQy%4LMs9LUC+&Trz2ct2^mh7_9nMZLhAc{lY zx3^2;*{oQD+#cvhUOJoE`O^Ohp{qmPyW75|T=W0nlbazrqtf5%uj#_p6B#!6oW|Tu z&+fI}M+DZlm)~=dq7h)B@|Gl9#C+!8Obik|8FJ@DzEfnkT;IErJl|Yq4)tTvT|OQ; z#3@43dIr#(e);I$Ez(L~IO9qA<%EGilRkFb zh1-pGOskq5FC)?J=&PkhA9*cz%~8MdJ-m&)@h%>fFGGx`8fm#<0O$4MQOk_)^L!iT zvebVwze%5>ymu?&Mh3lh>gL%kg$b`|#v=0dClsMFybwgK9xVw(c(G?Vl$9Cl`3sJu z|KV}0#70517#_|@3j|3U#6s_r zl%dsy__9+PDeAGwAbcROodU8#61ro5Dn=hJw}$wmkhXi&nNme!2qUKp3Xh|eUZb46 z*udebRNy027&RSF3*>@vG}AOfHa0$ytBqXJ3VdoQHNMmWAYxgcMUcKj5Q1p`*oFv0 z1Q@@sz7g}-%>2Lf-yq<;<+CV?Oeu>ds&Jik9eBmjgZ0W$0s$7RUy<@4C+pj3Fzmw< z%s}P!Y93@28yU!uzGE6G`Ckc%9q<1i!rc&yDGn_CCWkCtt6R6)zh0Zc&AKZ{#GNq8 z!fyIa4vSw5-I?r9clb<%pyeF>|*VA6&Qo<3+b zc7XtFP}%KNnU>cb>Qa^e3j#hH1v>uoEN5pXN77pW^xfvwHF(pkHGE4nEjdmOE58QP z@4uUGZms=yoo$%+IW;a(O*_PNC9`(|j628EmR45`0yQ4ZjjHDC9r+?=g>WdSsh=UQ zuk*CIXIpQsuXiJpqQ{C==>c24T=69-QOoLzWt2GneV{N3RnL)*xr7BUgT`9iZJSm! z3c)ru&!w+7$W^i>^-|Fre-dlGPRt66i_`N--W&P-GvzLdvL6fN=9;XOJg5K0iA#URD`?xbR*EETt5xN(|{ z*?8AikX`ZF*lQBg(~Uo**ciZUh|i~1*RA>Zg_P35)n5t;I$jMXG3yL^P<%`IEh8@7 zgY3ewSZFb%epsErm|YZ^OwzlNR82~b;y|kVsB08g1>C(kVr55aJSp+}I$rJfxdkdn zZnkCK=zkmO#V=GzlfW3vXE%-&Dd3I@Zf=qt*TVz`7LtEDtRJ?$6}sZ&@t zkd+Nd6=_%M;}H;a1EM3Npm-wW1o|!wX<4HO`CJ~x>7ka#f%QXGi;$(eFHIORDzLPa15ooTdG7t?8>#PIU5g30H&ht= zi%ld!cnoi)f^dChLb}69GJK?c&PP7knneyEXZHLrb1^g~yg&tjq5Q$N{F@$B8Ntbf z3KN~24cfKZ-bk+s;1?u1GtPOEY&{*Y0#AIBxCUe!)KT?61a46$A2idnQFrL8=YI;l z;I{u_p;bD9&)C`V?F_@fV#9Xw8a+kIsfE;28DexFNHR$ ztlyz*9Z-Nt=xA#%Yy!Rva6aE0sS7oGg4>xf=^tpvb>amDuC)8!R7uyDEXO1zO7H53 zK#YRNqPYzk@d8oYv_y0-;|IN1@j5zz$BOFxrt2yV`5;t-HmLr!{I38{Q6R&=vivPz z#P61Xr*Au+K_;sIB0~woJ6&_<$@1St?C+~&4*czMl>d0N(oTxK_}j5kzk#C81zI?Y zCU0Ud4);NKeTT?Al1TA0&GXS#k%D)=2H+ z%R3yWatOo6h+4-Qc=)U=pqSIJTV&#Y5;ZUJRR14mXF^P8{E&#Bw_Pr~bz76wsmq*5 z19B~Sgl)-L)F9Y#IT>Jg9>@oU>YnY+4lyw?#AGdM7LIlY7yRQUuhG2QANHyRtfW5b zbL?%tO9Es8{8F*0lu1-#GV`()K5b>W!3|-eX`vPBC^eM)c}EK9=3U!OMo}vmA$zv! zvvi1~4ZGl-weprcQh=_*O?09AX=K5C4pa0V7CBXEaig>Lif8dYyvTg?eABkWsj7}Ud<2!cF=RdcvIx5NkT_jq-3SW80gz&6Gd%uB{OOG zeb=%7`G{wpAmH*yO#jhLA`(~b^p;YSLu2kT)_!@*r5A#m42{49f1Dka zXpBx}JfQ@pYr$j+H3(!aMk%^v8#zUav6%687R5E5ggYrQDMKuq3B|W2=m##5QPQ9g z9zCv*DD?9GPwp>%yY z2@Qb}PM#OD)KswvOmE6U)8gil1=+~DU%XsIBw)9mV_YlF!6^hYdi8}Q#W>l`&k4T0 zGMS93JAk#!nY+g8@8!HApxi<1jRAU@#r_{0^8SX+*>&{=ux0{VH#=XzXD@kea&fX@ zl%x6VV70LGrlfMj^z8CKW36Aij=r}RC%Ri?ZVrn?t!Cx`U1xKY^ihB9TmJ#QcEG67 zY>qM(K8*lloZX15zS;v1ie=1qn?4|l!={2AstK3p#{)Bj*o0|Sim<0P5Jj@zfMYN` zU(fNSpuZEr1;~weXZV|EY_X+H`0uJ8%N zkYo^6T4T3Z3!3Cpq-csaHY)KOODuCa{7Q}J^S#G1mh1qCHQTOC9>gIE@A~t@4;&nx z)ub&@2H^GgQ)Zz0Ly(Qsqt@gPI5D{QP20Tw1VA$(E77*x-$Sh`3reNJ%vXYTsm~`w z=*AbIymozm<`_?n_q2&c@jL!CzE?Yt4%&&De&#%fv&y+z8zbFMXU zZN0V7pS^R`8BSJtdxR*lB^8%=rX!d?R_^sXe%HfM?VLgpsSlJ5B01{!9JM#r51j!K zPMssM8c&!6FDtB((PX2&rho`ETg-LsN8o|D+U-Hl{_~FU@+MLL(meQR((GwX2cE)8 z_KxzE8A|UG4oq_*kv->vm3R`hRv{X@2I%8qCfLaX$!4^wUU(_G;&;ZqzdG~s9(ldjezoigYnF;1 zqIw`qQl|45fw9PC2}CeIX!-~K{`nv;2bj!`u)H-0j!x!4t=K!`BBO!1?|ge9Y=CRo z2sH*sAOg$oX#@bt#aGCc*^cFKB6riJYgPB@fEPUaUcj;A|FM=WC&sn3Kd^;a_XR4n z1R#GVwR;`uN{8`>QP=VNEO$9>Y6qzB2m%rFX_ZrGRTcs>2il*&;x{#spR}dLmseJx z<}%{;-Wb+PQ})QkTEn`$v$4xQ#P&~uKH{H3{NSl|CremdPwZ2ZwMr%nov>cX^P?%G zj-nxV$c7w%m|yGDPS^}Eh-3wre_Iku9(8|%Gc*5W2(lv#FOfcicPK0oIl4(Ht3qCW zdHkcQqu@b={`Y45mX;mC^brHz!p--xD2(6JepAS2S~E*jA37%)H&vSZDH1fVAbQbMV8FB9cU-hZv?1DMt^_sbmKxLv>Ni@RgUr z61C|4D$ki;M$0TMt_JuDF}@)g&;>W(y3q^x5EFJ7Oa+pUUsoOQn&e4h)F0e*hRuu! zq^Y3|#8EN{u2wDMyT_7YZPxd@5yRJYHLtqp-;ZcMT&CF$R;-_N+8UK_#ktNX%au_L zOaX6+a-72GfLe>(6_t<~T{a6IEaZQ#VgIiaXTRym?^cryBB#WG;)-+FSznJ#xP7pV zs|YJMBTx(f6>M6(s=C2050qQ5gHWj7g7{_%)cZ#z10tK1G}!-CLs2K{9xzC$hJK?|s%>k$Z*djU4T>f#PMe>{L z7t8$lWGk_HovJea;I=uS0h-&bYeTGGOHsXFIqn_mczgXSI8>8X{c(*xjDA41i~R97 z`Z(k-7dQHM{u<5a**idR#+ChT)Hv4jrU+pMc>dzMXLf28PaBWO9)f73_B}x?X~fD+ zM`RHrVVYnj_Ik0(l&kr!YfxbABrIMfEUVv&VB7q>24;#VK5E{%r%=Iz5EIlU`ux$* zOyS$&?uq*qjf8jGKzE4cvp8z%_C*p9-$CW_w_T9%x~WCo?D07BMZZjh`_WIMp2Zm+ zxsLvvZ-X9?+DE7yezvQqtCZjZxnoald%q1o zo{Q~xZX8%_c@v8|HaMmZX*^)3QlYb62*4D~F|LH?>A?TP)6>c3<(;CJAE6KVAw{uL z6(W$)UhK5%^KiQerUdR1i!#?23 z_T-8Dix)38s!a6s9{#qJPHu8gV*gYO6o4+L$jB!7NkODEE+YQdrxt%G#Ov+Di;3*F zQ!};AI9$>?&S60XUv@qQ$P{K>QwDxix?2;%cxoXsR{P<#>d5dK{_c_?@vHyQq52b` z*`&T{5DDh|5B^jOr*31bAQUX`;?q!NCHSRYzZfo9HyMyc+38= zQCd)f`@2|LWwp>se(!j-jN)b`{al@2RUXVcpEt5GKdH#E0ANdDaH7c_^_S!IV=SkW z^uUe!M^8$Ua|@4g-r_rg0_#Txd5p>VUJCrKQFt>?)Vd>|Eu3GC@J-?2Y|R^RwU%AG z%G=3F3NcSpbYjtRqro7eBmIh%#ujVABnP87OTMB4Fa`xEahI|1TreGbj=9eCAEOt&gaFJ+Puj@W2F`}{!5McI*!I7AMRoz z0!YIYa8{S9XU9v7ungPS=V-sQ{WED}&sA^55e2r@5XKN5dnr^D?&AQ=jtQ3vFW^ki z6!F4z?1lA3g>r$l>BO(mFDhgmM*Oq8o&K$6Jj9362jIpiJOcxTL z7~X!Md8Kk*@a>^rqm#6;{;7}%g!?=C%j9P9PJeZ{r|97+z)WE=B^Tkn?f=210*vT{ zYpr?Lw)32%Xe&LR7f7>+lR7TF3JxTV&dOl{Gv{-d?cZX*#KZgIwNAA+Rc4-2_!=cn zgnDWZDxDn5X_fv+uhU!-Tgr#o2vKJw%dXl^P?X!-`MO&Xqhv2>v(Y~(@Wcon2t-Bh ziZ20mc{m=PCt;Ng37s*5X=5)$3}6NfZ>Q0hZWI=x3otu~V^@A;hDa4gDP4dm>;-Ip zr#}H|m=Ok*L}Kg{eW4wfa!+C!y>NYoZ>B*YNMQNGWS|38pivdW$S>z3`Qy5lJ zMBCdgiIC3iI5;3}hIQo*0QYnsW55IFDB6-${4A*0p#np;J~`Z(ykHYM{FS!~z2J}U z4MS$n0a2<)LN~OI+sc0YkOzYwJb(V2f-GKqlpd*~o+V7KI3C9ZP|38#i)sR9Itv6& z+scnAsMbu(bryjaPV~r%!KJn!t_vqZYci5snjCsgFHDEnn@3lRaNkLQ7DWl8#0Q6l zidNiX)p7jTg*R zkd5mF6P#_mpu*tLmX^3rmHfET$v^isl5zPh!!E@ZorMm?+hK-9MEFxE%cKVvH3gU? zB4*=EczZf5GTux`Kqmo5GV{dJRMjk{zX_~cIr=fiXQ;eaa|K8w6&?lLok?-ZICQy9 zst%+{gAS1(!}K^m8J!rY_&*@NQF#KaD3R3fMqMnnH`pY96fHXr2MVpFruaSGi{KlE zGDk7my3!RQE3A5nGkJ7gB)!zi5n2QCTlv{|-TODSbF~`;1k-h9VVbU#1W!k%QeiXi zG&ESVf`KAgz|51?t&t4Uc|XzN4(g#a>BX(GBm23*&sJQ8h%Rl(x^?S=f(imlH>tQ1 zctAP5!t9w>3%aDm6zE8U2W;R8oNwHuLz_NY@(1j8dx(*#=i)yL%8nE_R-AVtEl z{%+bH^a4LY@$spPiM;f{a6YN`%QblLSO}3j^-zWpk0SfVU?zh`0ihDHAiaqQqat4& z>*R^i)Z{FPuxKPx&5A5W{JG1AE&SJ$$It3cDPbeQ@P~>ZjjT~}4-y)BxVQBm9b@?6 z+%S)(K>IUsZTvr+q|?`urk8=Wwb}PlD4>@gQLy)M?EgW!R<{Ngcnt&F5-LhdKRL1y zTY%BNa&h@tMXn(ets*_P|6^EX!<_5%i?QOhrLBa|@%K6b!GyTV0bC!(&5X)}olf(= zgLs!?K82wzrtmivai$kyK0bEKIN0xrcx-8->jX@`&;olyMS%$F`?&ReN0+GOO9#QY zZi3hMp^hoLkOyfxOL#iT|NU;0_w-l`4OZ1U4rRwF#B!unWmGuzwxh-;yH{R^TdUlR zK`iH{%@_v@bvk~(Ok@n3U3$5EbgB$HyHUu5hh*|Xx%!ex(xui~6gd)MCF|=ay-0-F zopifuhv!$YOz-wzR$#1-BtY?GB(}O&*`kPJfa}}oD+BBT=f?qr48QM;MJo^w&q}Fq zdh(g6vi6tS4X{Ci(cxh6Q;wm;&+y-)wPs`g2=)Gn_CxhG{}bjbF>S(@ZT3iB z?cKVUjwn4>87gZ3D;yt5(g-mvcCJAeVvIVffFK1`y70-nm&~p!nKsB~-AZ1o;Q`M= zJfGhg||BWWkdw1UN;Vx)eOa_{}43IzATP8C(mfc03$iCFR@88jNeJ zAa$r91JG+G%R)*s#ZWumL`sV1*T{j1@kQ3|oV(s;nhxX3swJik>OtKiR-n##e=H-H zg5qWJM23iC-`~P4ug&RH3{Z6&Qow`#pa-z=B1nG0joJQOZE;u7bla0(pPZmS<;o~x*Aj~&uIcsYjo0;`@v6#ENLe^=O37dPL#dIwf?bn z(Zr#>M0(FTpul|c@;;Z?k`kDIvhuH?u^$0BD_wt=TftOC1F>>hO3~MSVLg>wJAXP+ySWeppXV|4 zAZ|McbTYPvo&g0?T{bCb7~>jpyirX2O{^)s7>DZu(YZNcxlth#cdwy!EFm@>kT#F< z*Kfp2Ii2@c7^B2+-y6dSgiws<)^?O8k6wsG7JTkCf(Yj4Y;tKwJd11R7IG7#<}s`p zvSoU{x>4Iy>(~2S3;jrJVs>IHPsU?km;XA-m7~?~VaZRm#bovGqMbZP?`N!&jG!SK zynnqJz5+@431I`~nwU#@v@}i`j9u9~p(9QXATazE5}lNav=?9tU@o9x7Qkvo2U@ZJ zd-bLz|Mt}zaU4m(h>ZWt$8{V9){_jBrt#8mj(R(?=wDwnG>z9pZpcLV-ttRt;FsVe zr6hA-#KrcVoVziot2fbCj3X^?fR50F!|w&_l$2C0MJDfccbsG%_YfO@6?dmM8yQTy z+Hov!KG>_CL&7d=EjLwOT2Elp%LEV@+}%i58KEedQT8uqeq=@fkF$9kKYuN*fY8J4 zF$mCF!`WD;S7B^aPJorlnZL9dqj{)IUT80-6?X7S8roUhLsSeOYQSJ=x-DK7`(DJm z4Y1S|LPLM&N5vdgSu2QB=j`scf^7B%{CI;r`uiq!Qoqxr)dDwsKJLl)B9b{ekCoBJ9j?<${(+n8m#6;HF_}gO@t0@T z@-gMV0jmQAw&kd2IAFU#F1WWR#zn0&!u%bK$zn?uTRfbx3Y;XRaQi1+ot!=p#+Gca zk~kKv1GWbWT;CN7jULFusNLC?_YiLJ+zle1pWm6v!@5PG4)PP$cX#iFP(sW|aYG*w zv^QJr=(&{D>S>$)H3gauaDQ)84jo7YeDMHIcK@QckBq$IWW%2>^88MI5u)I`&VWg5vW@Q!IxwL`aw&_u>wN zkA#g(DzgmyCl48hCvfewmUdDIPc%xH^PEBuw`!G+ zTeU{c&>rt}5pDR8GX;jXmH`*00R2qqW^fy=qc)1){JL#sT~xxMF9XpG7t~515n%Ra zm0hsBRv5;0GL=33TnzqPYIObO{mrEYuoL#ftr`jA;pEPu-gMPtSYGlMKu?BlG$U{(wHvWiHRj3y|T zE``|xUsvFfS1I5pW)C=O64@&ANIs}6jD27`^R3HqGx4Ly(+{!?6+N^cEPPsPhk*WdI zCO;NtRqD?-&4D>duFaD;GdE1moYLsHw#pQaO7Q6Fg z4xck-W3`?&HAY$)Z^@fn7Y~v35v14Wv~`y{XE#3&074BK-&Ng-oxTEv+IbpQ;g;Y` zwJTHazkQPs-J5XDH^n|BBd$;PQux)o$zmX5>C+wDYZLVPRgJ}>up}ch$<9vs?$Zw0 zq#2CbdXYc8q?BZ&>Zrgz)d!%p`8q3SE;lU87zjRylny@xTSWG<6ZY@8k)Gp4OLP$C zqNBrC2if(d_b+Y92K^n&p@yv%?XB?!{^SwWNAZ6mvtg*<%8zwOBgZS7tAOlw z5&)QG{lA2Fw4+Et2J%z3Wt^Hk07h*P-4put3l@`{wL&z_`C>aL&;ayz_N+T3g5DXr z;%e$N#|d%@TY5{NcpQmgFSUi!PhUA z-EJv7M$gY%Wd2kj*H`R<)|h?QMZk^fvfhM`QrKB?B^3s_(6u6c?ejf|PRS{&1ws#E zNd)aanhPQ9m}%{OCVB6u*qE;yB}DxMZS=JpcaDzYsPgg#xHx2^#@-nT0;^rO_={1X zX>DDm7?Y#AesgoPF0T+e>7b`!%6e!EV**O2pe6bv*31IvAJ@s^J3M{wm9bQ~=%5IF zjm?`gh>6U`9@$FO?a$ljBpErK=nlGU4b5vT>Sl#B4pV$|Y=3LWQn zy*fXdT(oX6m;d!nU*Be7PT5%QOX1^Lvt@2~Jtlghr+E4L1-^s>jFKp+k8p*ofq{3? z5BUpBH4<9(}7yFtt z1>Y%yM{yq)^>qM`^g534 zu{J}OLgvHmV#va<&Ml~M3+0?HUd-AtwZeR?Cl)*vnZ$#&IuYgc7B1ii|qb>G>n$o_wpZ+|qa>|GR zf|36RKl820^LzRMjtiQZ;n|EpTR*JfJ>jFXiB#L;34m4wPwE%{iOcXN8*=7rID&<2 z8Xo?cw0pOpg5^|PEltgY#Qs;Y6B%d>aSfso;lq!B?e`}+JEtGvqzmv611&`$9NPVJ zZJFOBcV=^?4JQxbHT(Ruz9Kc=8~IH@hk}|)!fv(1)kVWlcYhLineEPA(B>B9KQA9* zkP^%VKT%<|+Qcw%aO7qFT9;XGVBP$Ujwhg73pZL)UyQVZ)A%{}aPLwA5Q{fVL#t#X z_*Kx@(Z7|*`KRs_U8i5lKm4&&4Q`#VT5LOi*p)gig?BI<65B=^$hsI+h*A+30ez^5 z@H|@L`q?)!1LKP%h$?Cj1<2udl8qh{zBP70+P(8xzC-EMVh4r+JE#Ogk3whDH}?RS z!uf2SP$!}HFw58ZsJ*gKDI^tYsE#HItoW~uRs-Y8J8^BKtMyA-8<*x{bUVr0w#$_c zDNucNxZm&$Al%*qJ-)`Q44o%n**2?A!A}F7-;^Sn%u#VFbk%ulDRs z6i^(*fiq~*kXD+*AhA75F)l#@9k^XvEwQ3)dt4nt4qHyNFCGH|tmSqIQ!8B5YkZ!b z?q(X6L=mMuOdul*@h?YV{h@jI&=xF3ruI&Wv`O(N=HG%Jx$!KZKBf=_&u(&00imtD zbDvh7wiZ)z_GpT8H;i43PuO`mbmSP<&nYkf3lU<+1pd0a{NMb0cNNff5(cvXxpM&j QcY@x4)#R&QeGK|P0C4>pfdBvi diff --git a/icons/obj/clothing/under/centcom.dmi b/icons/obj/clothing/under/centcom.dmi index 8ab99ba04f2bf1a35d80dd398ddd2d1ae49cf5fd..3fd5a370973ed9bcdf7623c1743acf96f58d2c54 100644 GIT binary patch literal 2948 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 N002ovPDHLkV1j(6miqtz diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 97bbe730fac8261064fe0971ac6d7f1961db4e29..06be7b370c0c83c9b5e20771afa590b2f1991182 100644 GIT binary patch delta 10390 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 P(4Vg69gUKIY(oAA*_R4N diff --git a/shiptest.dme b/shiptest.dme index 3737410df30f..d0d4bb4334a2 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1968,6 +1968,7 @@ #include "code\modules\clothing\suits\reactive_armour.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\wintercoats.dm" #include "code\modules\clothing\suits\wiz_robe.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\accessories.dm" From cef5c54f7b58d3ba79211b955e68896d6b6ce362 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 15:27:59 -0500 Subject: [PATCH 28/57] Automatic changelog generation for PR #2321 [ci skip] --- html/changelogs/AutoChangeLog-pr-2321.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2321.yml diff --git a/html/changelogs/AutoChangeLog-pr-2321.yml b/html/changelogs/AutoChangeLog-pr-2321.yml new file mode 100644 index 000000000000..e5c3c8b52412 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2321.yml @@ -0,0 +1,19 @@ +author: PositiveEntropy, tf-4 +delete-after: true +changes: + - rscadd: Adds the CentVend inside Central Command! You're now able to vend Central + Command clothing items for all your commanding needs! + - rscadd: "Nanotrasen has added a new outfit for Special Ops Officers to enjoy, + instead of a simple leather jacket: The CentCom Officer's Coat!" + - rscadd: Re-adds the CentCom Official's suit, making it the default clothing option + for CentCom Officials! The turtlenecks have instead been made to be the standard + ERT uniform. + - imageadd: Thanks to a collaboration between the frontier sector and the core sector, + the parade jackets now boast new and varied apperances for all to enjoy, with + a new parade jacket releasing for the Head of Security! + - imageadd: In no short effort than the finest of tailors, the captain's hat, the + centcom hat, the captain's jumpsuit and the captain's carapace now have finer + gold trims and the finest quality leather available, making them more vibrant + for all! + - imageadd: In no short effort of our best tailors, every Central Command outfit + have been either redesigned or reshaded! All of them! From af094b2794698fba15ae9a20debe7039aa587ef3 Mon Sep 17 00:00:00 2001 From: Bjarl <94164348+Bjarl@users.noreply.github.com> Date: Wed, 13 Sep 2023 14:08:16 -0400 Subject: [PATCH 29/57] Removes monkey mode and wishgranter (#2223) ## About The Pull Request 2014 wants its gamemodes back ## Why It's Good For The Game cruft ## Changelog :cl: del: monkey and wishgranter code /:cl: --- code/__DEFINES/role_preferences.dm | 1 - code/datums/diseases/transformation.dm | 61 ----- code/datums/saymode.dm | 22 -- .../dynamic/dynamic_rulesets_roundstart.dm | 63 ------ code/game/gamemodes/monkey/monkey.dm | 130 ----------- code/game/machinery/wishgranter.dm | 43 ---- code/modules/antagonists/monkey/monkey.dm | 213 ------------------ .../antagonists/wishgranter/wishgranter.dm | 29 --- .../awaymissions/mission_code/wildwest.dm | 126 ----------- .../mob/living/carbon/monkey/monkey.dm | 6 - code/modules/mob/mob_helpers.dm | 6 +- shiptest.dme | 4 - 12 files changed, 1 insertion(+), 703 deletions(-) delete mode 100644 code/game/gamemodes/monkey/monkey.dm delete mode 100644 code/game/machinery/wishgranter.dm delete mode 100644 code/modules/antagonists/monkey/monkey.dm delete mode 100644 code/modules/antagonists/wishgranter/wishgranter.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 6fe70f5419b4..49b56e6f19da 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -61,7 +61,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_NINJA, ROLE_OBSESSED, ROLE_SPACE_DRAGON, - ROLE_MONKEY = /datum/game_mode/monkey, ROLE_REVENANT, ROLE_ABDUCTOR, ROLE_DEVIL = /datum/game_mode/devil, diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index a3884dcf6d3c..6d3959753a9e 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -92,67 +92,6 @@ new_mob.ghostize(can_reenter_corpse = FALSE) new_mob.key = null -/datum/disease/transformation/jungle_fever - name = "Jungle Fever" - cure_text = "Death." - cures = list(/datum/reagent/medicine/adminordrazine) - spread_text = "Monkey Bites" - spread_flags = DISEASE_SPREAD_SPECIAL - viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human) - permeability_mod = 1 - cure_chance = 1 - disease_flags = CAN_CARRY|CAN_RESIST - desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." - severity = DISEASE_SEVERITY_BIOHAZARD - stage_prob = 4 - visibility_flags = 0 - agent = "Kongey Vibrion M-909" - new_form = /mob/living/carbon/monkey - bantype = ROLE_MONKEY - - - stage1 = list() - stage2 = list() - stage3 = list() - stage4 = list("Your back hurts.", "You breathe through your mouth.", - "You have a craving for bananas.", "Your mind feels clouded.") - stage5 = list("You feel like monkeying around.") - -/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob) - if(affected_mob.mind && !is_monkey(affected_mob.mind)) - add_monkey(affected_mob.mind) - if(ishuman(affected_mob)) - var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) - M.ventcrawler = VENTCRAWLER_ALWAYS - -/datum/disease/transformation/jungle_fever/stage_act() - ..() - switch(stage) - if(2) - if(prob(2)) - to_chat(affected_mob, "Your [pick("back", "arm", "leg", "elbow", "head")] itches.") - if(3) - if(prob(4)) - to_chat(affected_mob, "You feel a stabbing pain in your head.") - affected_mob.confused += 10 - if(4) - if(prob(3)) - affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever") - -/datum/disease/transformation/jungle_fever/cure() - remove_monkey(affected_mob.mind) - ..() - -/datum/disease/transformation/jungle_fever/monkeymode - visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC - disease_flags = CAN_CARRY //no vaccines! no cure! - -/datum/disease/transformation/jungle_fever/monkeymode/after_add() - if(affected_mob && !is_monkey_leader(affected_mob.mind)) - visibility_flags = NONE - - - /datum/disease/transformation/robot name = "Robotic Transformation" diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 1bcc94853456..848940d4e9d9 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -124,25 +124,3 @@ AI.holopad_talk(message, language) return FALSE return TRUE - -/datum/saymode/monkey - key = "k" - mode = MODE_MONKEY - -/datum/saymode/monkey/handle_message(mob/living/user, message, datum/language/language) - var/datum/mind = user.mind - if(!mind) - return TRUE - if(is_monkey_leader(mind) || (ismonkey(user) && is_monkey(mind))) - user.log_talk(message, LOG_SAY, tag="monkey") - if(prob(75) && ismonkey(user)) - user.visible_message("\The [user] chimpers.") - var/msg = "\[[is_monkey_leader(mind) ? "Monkey Leader" : "Monkey"]\] [user]: [message]" - for(var/_M in GLOB.mob_list) - var/mob/M = _M - if(M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [msg]") - if((is_monkey_leader(M.mind) || ismonkey(M)) && (M.mind in SSticker.mode.ape_infectees)) - to_chat(M, msg) - return FALSE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 1ca947178911..f3d11c3a399b 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -522,69 +522,6 @@ else objective.find_target() -////////////////////////////////////////////// -// // -// MONKEY // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/monkey - name = "Monkey" - antag_flag = ROLE_MONKEY - antag_datum = /datum/antagonist/monkey/leader - restricted_roles = list("Cyborg", "AI", "Prisoner") - required_candidates = 1 - weight = 3 - cost = 0 - requirements = list(101,101,101,101,101,101,101,101,101,101) - high_population_requirement = 101 - var/players_per_carrier = 30 - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - var/datum/team/monkey/monkey_team - -/datum/dynamic_ruleset/roundstart/monkey/pre_execute() - . = ..() - var/carriers_to_make = max(round(mode.roundstart_pop_ready / players_per_carrier, 1), 1) - mode.antags_rolled += carriers_to_make - - for(var/j = 0, j < carriers_to_make, j++) - if (!candidates.len) - break - var/mob/carrier = pick_n_take(candidates) - assigned += carrier.mind - carrier.mind.special_role = "Monkey Leader" - carrier.mind.restricted_roles = restricted_roles - log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier") - return TRUE - -/datum/dynamic_ruleset/roundstart/monkey/execute() - for(var/datum/mind/carrier in assigned) - var/datum/antagonist/monkey/M = add_monkey_leader(carrier) - if(M) - monkey_team = M.monkey_team - return TRUE - -/datum/dynamic_ruleset/roundstart/monkey/proc/check_monkey_victory() - if(SSshuttle.jump_mode != BS_JUMP_COMPLETED) - return FALSE - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D)) - if(M.onCentCom() || M.onSyndieBase()) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - else - return FALSE - -// This does not get called. Look into making it work. -/datum/dynamic_ruleset/roundstart/monkey/round_result() - if(check_monkey_victory()) - SSticker.mode_result = "win - monkey win" - else - SSticker.mode_result = "loss - staff stopped the monkeys" - ////////////////////////////////////////////// // // // METEOR // diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm deleted file mode 100644 index 639f0c5c87b2..000000000000 --- a/code/game/gamemodes/monkey/monkey.dm +++ /dev/null @@ -1,130 +0,0 @@ -/datum/game_mode - var/list/ape_infectees = list() - var/list/ape_leaders = list() - -/datum/game_mode/monkey - name = "monkey" - config_tag = "monkey" - report_type = "monkey" - antag_flag = ROLE_MONKEY - false_report_weight = 1 - - required_players = 20 - required_enemies = 1 - recommended_enemies = 1 - - restricted_jobs = list("Prisoner", "Cyborg", "AI") - - announce_span = "Monkey" - announce_text = "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!" - - var/carriers_to_make = 1 - var/list/carriers = list() - - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - - var/players_per_carrier = 30 - - var/datum/team/monkey/monkey_team - - - -/datum/game_mode/monkey/pre_setup() - carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) - - for(var/j = 0, j < carriers_to_make, j++) - if (!antag_candidates.len) - break - var/datum/mind/carrier = pick(antag_candidates) - carriers += carrier - carrier.special_role = "Monkey Leader" - carrier.restricted_roles = restricted_jobs - log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier") - antag_candidates -= carrier - - if(!carriers.len) - setup_error = "No monkey candidates" - return FALSE - return TRUE - -/datum/game_mode/monkey/post_setup() - for(var/datum/mind/carriermind in carriers) - var/datum/antagonist/monkey/M = add_monkey_leader(carriermind, monkey_team) - if(M) - monkey_team = M.monkey_team - return ..() - -/datum/game_mode/monkey/check_finished() - if(SSshuttle.jump_mode == BS_JUMP_COMPLETED) - return TRUE - - if(!round_converted) - for(var/datum/mind/monkey_mind in ape_infectees) - continuous_sanity_checked = TRUE - if(monkey_mind.current && monkey_mind.current.stat != DEAD) - return FALSE - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() //ugly but unfortunately needed - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H.mind && H.client && H.stat != DEAD) - if(H.HasDisease(D)) - return FALSE - - return ..() - -/datum/game_mode/monkey/proc/check_monkey_victory() - if(SSshuttle.jump_mode != BS_JUMP_COMPLETED) - return FALSE - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D)) - if(M.onCentCom() || M.onSyndieBase()) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - else - return FALSE - - -/datum/game_mode/monkey/set_round_result() - ..() - if(check_monkey_victory()) - SSticker.mode_result = "win - monkey win" - else - SSticker.mode_result = "loss - staff stopped the monkeys" - -/datum/game_mode/monkey/special_report() - if(check_monkey_victory()) - return "

" - else - return "
The staff managed to contain the monkey infestation!
" - -/datum/game_mode/monkey/generate_report() - return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Due to strain mutation, such infections are no longer curable by any known means. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom." - -/proc/add_monkey_leader(datum/mind/monkey_mind) - if(is_monkey_leader(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/leader/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey/leader) - return M - -/proc/add_monkey(datum/mind/monkey_mind) - if(is_monkey(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey) - return M - -/proc/remove_monkey(datum/mind/monkey_mind) - if(!is_monkey(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/M = monkey_mind.has_antag_datum(/datum/antagonist/monkey) - M.on_removal() - return TRUE - -/proc/is_monkey_leader(datum/mind/monkey_mind) - return monkey_mind && monkey_mind.has_antag_datum(/datum/antagonist/monkey/leader) - -/proc/is_monkey(datum/mind/monkey_mind) - return monkey_mind && (monkey_mind.has_antag_datum(/datum/antagonist/monkey) || is_monkey_leader(monkey_mind)) - diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm deleted file mode 100644 index 2cf51ada2f3e..000000000000 --- a/code/game/machinery/wishgranter.dm +++ /dev/null @@ -1,43 +0,0 @@ -/obj/machinery/wish_granter - name = "wish granter" - desc = "You're not so sure about this, anymore..." - icon = 'icons/obj/device.dmi' - icon_state = "syndbeacon" - - use_power = NO_POWER_USE - density = TRUE - - var/charges = 1 - var/insisting = 0 - -/obj/machinery/wish_granter/attack_hand(mob/living/carbon/user) - . = ..() - if(.) - return - if(charges <= 0) - to_chat(user, "The Wish Granter lies silent.") - return - - else if(!ishuman(user)) - to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return - - else if(is_special_character(user)) - to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") - - else if (!insisting) - to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") - insisting++ - - else - to_chat(user, "You speak. [pick("I want the sector to disappear","Humanity is corrupt, mankind must be destroyed","I want to be rich", "I want to rule the world","I want immortality.")]. The Wish Granter answers.") - to_chat(user, "Your head pounds for a moment, before your vision clears. You are the avatar of the Wish Granter, and your power is LIMITLESS! And it's all yours. You need to make sure no one can take it from you. No one can know, first.") - - charges-- - insisting = 0 - - user.mind.add_antag_datum(/datum/antagonist/wishgranter) - - to_chat(user, "You have a very bad feeling about this.") - - return diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm deleted file mode 100644 index ea83998abaac..000000000000 --- a/code/modules/antagonists/monkey/monkey.dm +++ /dev/null @@ -1,213 +0,0 @@ -#define MONKEYS_ESCAPED 1 -#define MONKEYS_LIVED 2 -#define MONKEYS_DIED 3 -#define DISEASE_LIVED 4 - -/datum/antagonist/monkey - name = "Monkey" - job_rank = ROLE_MONKEY - roundend_category = "monkeys" - antagpanel_category = "Monkey" - show_to_ghosts = TRUE - var/datum/team/monkey/monkey_team - var/monkey_only = TRUE - -/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner) - return ..() && (!monkey_only || ismonkey(new_owner.current)) - -/datum/antagonist/monkey/get_team() - return monkey_team - -/datum/antagonist/monkey/on_gain() - . = ..() - SSticker.mode.ape_infectees += owner - owner.special_role = "Infected Monkey" - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode - if(!owner.current.HasDisease(D)) - owner.current.ForceContractDisease(D) - else - QDEL_NULL(D) - -/datum/antagonist/monkey/greet() - to_chat(owner, "You are a monkey now!") - to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!") - to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!") - to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/antagonist/monkey/on_removal() - owner.special_role = null - SSticker.mode.ape_infectees -= owner - - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.diseases - if(D) - qdel(D) - - . = ..() - -/datum/antagonist/monkey/create_team(datum/team/monkey/new_team) - if(!new_team) - for(var/datum/antagonist/monkey/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.monkey_team) - monkey_team = H.monkey_team - return - monkey_team = new /datum/team/monkey - monkey_team.update_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - monkey_team = new_team - -/datum/antagonist/monkey/proc/forge_objectives() - objectives |= monkey_team.objectives - -/datum/antagonist/monkey/admin_remove(mob/admin) - var/mob/living/carbon/monkey/M = owner.current - if(istype(M)) - switch(alert(admin, "Humanize?", "Humanize", "Yes", "No")) - if("Yes") - if(admin == M) - admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG) - else - M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG) - if("No") - //nothing - else - return - . = ..() - -/datum/antagonist/monkey/leader - name = "Monkey Leader" - monkey_only = FALSE - -/datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) - var/mob/living/carbon/human/H = new_owner.current - if(istype(H)) - switch(alert(admin, "Monkeyize?", "Monkeyize", "Yes", "No")) - if("Yes") - if(admin == H) - admin = H.monkeyize() - else - H.monkeyize() - if("No") - //nothing - else - return - new_owner.add_antag_datum(src) - log_admin("[key_name(admin)] made [key_name(new_owner)] a monkey leader!") - message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] a monkey leader!") - -/datum/antagonist/monkey/leader/on_gain() - . = ..() - var/obj/item/organ/heart/freedom/F = new - F.Insert(owner.current, drop_if_replaced = FALSE) - SSticker.mode.ape_leaders += owner - owner.special_role = "Monkey Leader" - -/datum/antagonist/monkey/leader/on_removal() - SSticker.mode.ape_leaders -= owner - var/obj/item/organ/heart/H = new - H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart - - . = ..() - -/datum/antagonist/monkey/leader/greet() - to_chat(owner, "You are the Jungle Fever patient zero!!") - to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.") - to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") - to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") - to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/objective/monkey - explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" - martyr_compatible = TRUE - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - -/datum/objective/monkey/check_completion() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - return FALSE - -/datum/team/monkey - name = "Monkeys" - -/datum/team/monkey/proc/update_objectives() - objectives = list() - var/datum/objective/monkey/O = new() - O.team = src - objectives += O - -/datum/team/monkey/proc/infected_monkeys_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_monkeys_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/get_result() - if(infected_monkeys_escaped()) - return MONKEYS_ESCAPED - if(infected_monkeys_alive()) - return MONKEYS_LIVED - if(infected_humans_alive() || infected_humans_escaped()) - return DISEASE_LIVED - return MONKEYS_DIED - -/datum/team/monkey/roundend_report() - var/list/parts = list() - switch(get_result()) - if(MONKEYS_ESCAPED) - parts += "Monkey Major Victory!" - parts += "Central Command and [station_name()] were taken over by the monkeys! Ook ook!" - if(MONKEYS_LIVED) - parts += "Monkey Minor Victory!" - parts += "[station_name()] was taken over by the monkeys! Ook ook!" - if(DISEASE_LIVED) - parts += "Monkey Minor Defeat!" - parts += "All the monkeys died, but the disease lives on! The future is uncertain." - if(MONKEYS_DIED) - parts += "Monkey Major Defeat!" - parts += "All the monkeys died, and Jungle Fever was wiped out!" - var/list/leaders = get_antag_minds(/datum/antagonist/monkey/leader, TRUE) - var/list/monkeys = get_antag_minds(/datum/antagonist/monkey, TRUE) - - if(LAZYLEN(leaders)) - parts += "The monkey leaders were:" - parts += printplayerlist(SSticker.mode.ape_leaders) - if(LAZYLEN(monkeys)) - parts += "The monkeys were:" - parts += printplayerlist(SSticker.mode.ape_infectees) - return "
[parts.Join("
")]
" diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm deleted file mode 100644 index 67a6153f7bb2..000000000000 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/antagonist/wishgranter - name = "Wishgranter Avatar" - show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE - hijack_speed = 2 //You literally are here to do nothing else. Might as well be fast about it. - -/datum/antagonist/wishgranter/proc/forge_objectives() - var/datum/objective/hijack/hijack = new - hijack.owner = owner - objectives += hijack - -/datum/antagonist/wishgranter/on_gain() - owner.special_role = "Avatar of the Wish Granter" - forge_objectives() - . = ..() - give_powers() - -/datum/antagonist/wishgranter/greet() - to_chat(owner, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") - owner.announce_objectives() - -/datum/antagonist/wishgranter/proc/give_powers() - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - H.dna.add_mutation(HULK) - H.dna.add_mutation(XRAY) - H.dna.add_mutation(SPACEMUT) - H.dna.add_mutation(TK) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index e9f8df5c3499..35396ddded18 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -4,116 +4,6 @@ * Meat Grinder */ -//Areas - -/area/awaymission/wildwest/mines - name = "Wild West Mines" - icon_state = "away1" - requires_power = FALSE - -/area/awaymission/wildwest/gov - name = "Wild West Mansion" - icon_state = "away2" - requires_power = FALSE - -/area/awaymission/wildwest/refine - name = "Wild West Refinery" - icon_state = "away3" - requires_power = FALSE - -/area/awaymission/wildwest/vault - name = "Wild West Vault" - icon_state = "away3" - -/area/awaymission/wildwest/vaultdoors - name = "Wild West Vault Doors" // this is to keep the vault area being entirely lit because of requires_power - icon_state = "away2" - requires_power = FALSE - - -////////// wildwest papers - -/obj/item/paper/fluff/awaymissions/wildwest/grinder - default_raw_text = "meat grinder requires sacri" - - -/obj/item/paper/fluff/awaymissions/wildwest/journal/page1 - name = "Planer Saul's Journal: Page 1" - default_raw_text = "We've discovered something floating in space. We can't really tell how old it is, but it is scraped and bent to hell. There object is the size of about a room with double doors that we have yet to break into. It is a lot sturdier than we could have imagined. We have decided to call it 'The Vault' " - -/obj/item/paper/fluff/awaymissions/wildwest/journal/page4 - name = "Planer Saul's Journal: Page 4" - default_raw_text = " The miners in the town have become sick and almost all production has stopped. They, in a fit of delusion, tossed all of their mining equipment into the furnaces. They all claimed the same thing. A voice beckoning them to lay down their arms. Stupid miners." - -/obj/item/paper/fluff/awaymissions/wildwest/journal/page7 - name = "Planer Sauls' Journal: Page 7" - default_raw_text = "The Vault...it just keeps growing and growing. I went on my daily walk through the garden and now it's just right outside the mansion... a few days ago it was only barely visible. But whatever is inside...it's calling to me." - -/obj/item/paper/fluff/awaymissions/wildwest/journal/page8 - name = "Planer Saul's Journal: Page 8" - default_raw_text = "The syndicate have invaded. Their ships appeared out of nowhere and now they likely intend to kill us all and take everything. On the off-chance that the Vault may grant us sanctuary, many of us have decided to force our way inside and bolt the door, taking as many provisions with us as we can carry. In case you find this, send for help immediately and open the Vault. Find us inside." - - -/* - * Wish Granter - */ -/obj/machinery/wish_granter_dark - name = "Wish Granter" - desc = "You're not so sure about this, anymore..." - icon = 'icons/obj/device.dmi' - icon_state = "syndbeacon" - - density = TRUE - use_power = NO_POWER_USE - - var/chargesa = 1 - var/insistinga = 0 - -/obj/machinery/wish_granter_dark/interact(mob/living/carbon/human/user) - if(chargesa <= 0) - to_chat(user, "The Wish Granter lies silent.") - return - - else if(!ishuman(user)) - to_chat(user, "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's.") - return - - else if(is_special_character(user)) - to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.") - - else if (!insistinga) - to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?") - insistinga++ - - else - chargesa-- - insistinga = 0 - var/wish = input("You want...","Wish") as null|anything in sortList(list("Power","Wealth","Immortality","Peace")) - switch(wish) - if("Power") - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - user.dna.add_mutation(LASEREYES) - user.dna.add_mutation(SPACEMUT) - user.dna.add_mutation(XRAY) - user.set_species(/datum/species/shadow) - if("Wealth") - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - new /obj/structure/closet/syndicate/resources/everything(loc) - user.set_species(/datum/species/shadow) - if("Immortality") - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.") - add_verb(user, /mob/living/carbon/proc/immortality) - user.set_species(/datum/species/shadow) - if("Peace") - to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") - to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") - for(var/mob/living/simple_animal/hostile/faithless/F in GLOB.mob_living_list) - F.death() - - ///////////////Meatgrinder////////////// @@ -155,19 +45,3 @@ s.start() explosion(M, 1, 0, 0, 0) qdel(src) - -/////For the Wishgranter/////////// - -/mob/living/carbon/proc/immortality() //Mob proc so people cant just clone themselves to get rid of the shadowperson race. No hiding your wickedness. - set category = "Immortality" - set name = "Resurrection" - - var/mob/living/carbon/C = usr - if(!C.stat) - to_chat(C, "You're not dead yet!") - return - if(C.has_status_effect(STATUS_EFFECT_WISH_GRANTERS_GIFT)) - to_chat(C, "You're already resurrecting!") - return - C.apply_status_effect(STATUS_EFFECT_WISH_GRANTERS_GIFT) - return 1 diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 1c7f480e0121..6a66c0546f6e 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -115,12 +115,6 @@ internal = null return - -/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys can't use advanced tools - if(mind && is_monkey(mind)) - return TRUE - return FALSE - /mob/living/carbon/monkey/can_use_guns(obj/item/G) if(G.trigger_guard == TRIGGER_GUARD_NONE) to_chat(src, "You are unable to fire this!") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 58334a8833dc..69ec7e9ca5cd 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -348,11 +348,7 @@ if("apprentice") if(M.mind in SSticker.mode.apprentices) return 2 - if("monkey") - if(isliving(M)) - var/mob/living/L = M - if(L.diseases && (locate(/datum/disease/transformation/jungle_fever) in L.diseases)) - return 2 + return TRUE if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum! return TRUE diff --git a/shiptest.dme b/shiptest.dme index d0d4bb4334a2..017f8a1cdda8 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -815,7 +815,6 @@ #include "code\game\gamemodes\gang\gang_things.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\monkey\monkey.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\sandbox\airlock_maker.dm" @@ -888,7 +887,6 @@ #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transformer.dm" #include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" #include "code\game\machinery\camera\camera.dm" #include "code\game\machinery\camera\camera_assembly.dm" #include "code\game\machinery\camera\motion.dm" @@ -1664,7 +1662,6 @@ #include "code\modules\antagonists\gang\outfits.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\magic_servant\servant.dm" -#include "code\modules\antagonists\monkey\monkey.dm" #include "code\modules\antagonists\morph\morph.dm" #include "code\modules\antagonists\morph\morph_antag.dm" #include "code\modules\antagonists\nightmare\nightmare.dm" @@ -1700,7 +1697,6 @@ #include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" #include "code\modules\antagonists\valentines\heartbreaker.dm" #include "code\modules\antagonists\valentines\valentine.dm" -#include "code\modules\antagonists\wishgranter\wishgranter.dm" #include "code\modules\antagonists\wizard\wizard.dm" #include "code\modules\antagonists\wizard\equipment\artefact.dm" #include "code\modules\antagonists\wizard\equipment\soulstone.dm" From 6b9c30428b98584a14b34bc33f18b7cc4497ab89 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 15:46:24 -0500 Subject: [PATCH 30/57] Automatic changelog generation for PR #2223 [ci skip] --- html/changelogs/AutoChangeLog-pr-2223.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2223.yml diff --git a/html/changelogs/AutoChangeLog-pr-2223.yml b/html/changelogs/AutoChangeLog-pr-2223.yml new file mode 100644 index 000000000000..c81bb6987185 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2223.yml @@ -0,0 +1,4 @@ +author: Bjarl +delete-after: true +changes: + - rscdel: monkey and wishgranter code From 48616ec800fcdc2db8d22c62b71c76c8367e7abe Mon Sep 17 00:00:00 2001 From: Mark Suckerberg Date: Wed, 13 Sep 2023 13:43:52 -0500 Subject: [PATCH 31/57] SSlag_switch from /tg/ (#2133) ## About The Pull Request Ports: - tgstation/tgstation#62999 - tgstation/tgstation#59717 and adds a few shiptest-specific toggles as well to better take advantage of the system. ## Why It's Good For The Game Recently lag has become a bit more of an issue here, and I think I would rather we be able to play than force ourselves to suffer while we slowly work on perf improvements. ## Changelog :cl: admin: Adds lag switch toggles from /tg/, ONLY use them when the lag becomes unbearable! /:cl: --------- Co-authored-by: Wayland-Smithy <64715958+Wayland-Smithy@users.noreply.github.com> Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> --- check_regex.yaml | 2 +- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/lag_switch.dm | 24 +++ code/__DEFINES/traits.dm | 2 + code/__HELPERS/icons.dm | 4 + code/_globalvars/lists/mobs.dm | 1 + code/_globalvars/traits.dm | 1 + code/_onclick/hud/parallax.dm | 4 + .../configuration/entries/general.dm | 4 + code/controllers/subsystem/input.dm | 6 +- code/controllers/subsystem/lag_switch.dm | 156 ++++++++++++++++++ code/datums/chatmessage.dm | 2 + code/datums/components/footstep.dm | 10 +- code/datums/world_topic.dm | 3 +- code/game/world.dm | 5 +- code/modules/admin/admin.dm | 47 +++++- code/modules/admin/admin_verbs.dm | 1 + code/modules/admin/topic.dm | 52 ++++++ .../nukeop/equipment/nuclearbomb.dm | 2 +- code/modules/client/client_defines.dm | 2 + code/modules/client/client_procs.dm | 1 + .../modules/mob/dead/new_player/new_player.dm | 14 +- code/modules/mob/dead/observer/observer.dm | 14 ++ code/modules/mob/living/death.dm | 3 + code/modules/mob/living/living_say.dm | 8 +- code/modules/mob/mob_lists.dm | 5 + code/modules/mob/mob_say.dm | 6 + code/modules/overmap/objects/dynamic_datum.dm | 6 +- config/config.txt | 3 + shiptest.dme | 2 + 30 files changed, 362 insertions(+), 30 deletions(-) create mode 100644 code/__DEFINES/lag_switch.dm create mode 100644 code/controllers/subsystem/lag_switch.dm diff --git a/check_regex.yaml b/check_regex.yaml index c28639172af2..7e5269c30a78 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -38,7 +38,7 @@ standards: - exactly: [ - 297, + 298, "non-bitwise << uses", '(? mob GLOBAL_LIST_EMPTY(alive_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index b08504daae29..3239cb53b8d0 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -84,6 +84,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION, "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 334dabd9198e..36d278adac0d 100644 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -46,6 +46,10 @@ /datum/hud/proc/apply_parallax_pref(mob/viewmob) var/mob/screenmob = viewmob || mymob + + if (SSlag_switch.measures[DISABLE_PARALLAX] && !HAS_TRAIT(viewmob, TRAIT_BYPASS_MEASURES)) + return FALSE + var/client/C = screenmob.client if(C.prefs) var/pref = C.prefs.parallax diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index bf9b8d24a05c..41a470aac610 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -325,6 +325,10 @@ /datum/config_entry/flag/maprotation +/datum/config_entry/number/auto_lag_switch_pop //Number of clients at which drastic lag mitigation measures kick in + config_entry_value = null + min_val = 0 + /datum/config_entry/number/soft_popcap config_entry_value = null min_val = 0 diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 07de18a43c2c..8bdc53089e12 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -93,7 +93,5 @@ SUBSYSTEM_DEF(input) user.set_macros() /datum/controller/subsystem/input/fire() - var/list/clients = GLOB.clients // Let's sing the list cache song - for(var/i in 1 to clients.len) - var/client/C = clients[i] - C.keyLoop() + for(var/mob/user as anything in GLOB.keyloop_list) + user.focus?.keyLoop(user.client) diff --git a/code/controllers/subsystem/lag_switch.dm b/code/controllers/subsystem/lag_switch.dm new file mode 100644 index 000000000000..eadf8d219324 --- /dev/null +++ b/code/controllers/subsystem/lag_switch.dm @@ -0,0 +1,156 @@ +/// The subsystem for controlling drastic performance enhancements aimed at reducing server load for a smoother albeit slightly duller gaming experience +SUBSYSTEM_DEF(lag_switch) + name = "Lag Switch" + flags = SS_NO_FIRE + + /// If the lag switch measures should attempt to trigger automatically, TRUE if a config value exists + var/auto_switch = FALSE + /// Amount of connected clients at which the Lag Switch should engage, set via config or admin panel + var/trigger_pop = INFINITY - 1337 + /// List of bools corresponding to code/__DEFINES/lag_switch.dm + var/static/list/measures[MEASURES_AMOUNT] + /// List of measures that toggle automatically + var/list/auto_measures = list(DISABLE_GHOST_ZOOM_TRAY, DISABLE_RUNECHAT, DISABLE_USR_ICON2HTML, DISABLE_PARALLAX, DISABLE_FOOTSTEPS, DISABLE_PLANETDEL) + /// Timer ID for the automatic veto period + var/veto_timer_id + /// Cooldown between say verb uses when slowmode is enabled + var/slowmode_cooldown = 3 SECONDS + +/datum/controller/subsystem/lag_switch/Initialize(start_timeofday) + for(var/i = 1, i <= measures.len, i++) + measures[i] = FALSE + var/auto_switch_pop = CONFIG_GET(number/auto_lag_switch_pop) + if(auto_switch_pop) + auto_switch = TRUE + trigger_pop = auto_switch_pop + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT, .proc/client_connected) + return ..() + +/datum/controller/subsystem/lag_switch/proc/client_connected(datum/source, client/connected) + SIGNAL_HANDLER + if(TGS_CLIENT_COUNT < trigger_pop) + return + + auto_switch = FALSE + UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT) + veto_timer_id = addtimer(CALLBACK(src, .proc/set_all_measures, TRUE, TRUE), 20 SECONDS, TIMER_STOPPABLE) + message_admins("Lag Switch population threshold reached. Automatic activation of lag mitigation measures occuring in 20 seconds. (
CANCEL)") + log_admin("Lag Switch population threshold reached. Automatic activation of lag mitigation measures occuring in 20 seconds.") + +/// (En/Dis)able automatic triggering of switches based on client count +/datum/controller/subsystem/lag_switch/proc/toggle_auto_enable() + auto_switch = !auto_switch + if(auto_switch) + RegisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT, .proc/client_connected) + else + UnregisterSignal(SSdcs, COMSIG_GLOB_CLIENT_CONNECT) + +/// Called from an admin chat link +/datum/controller/subsystem/lag_switch/proc/cancel_auto_enable_in_progress() + if(!veto_timer_id) + return FALSE + + deltimer(veto_timer_id) + veto_timer_id = null + return TRUE + +/// Update the slowmode timer length and clear existing ones if reduced +/datum/controller/subsystem/lag_switch/proc/change_slowmode_cooldown(length) + if(!length) + return FALSE + + var/length_secs = length SECONDS + if(length_secs <= 0) + length_secs = 1 // one tick because cooldowns do not like 0 + + if(length_secs < slowmode_cooldown) + for(var/client/C as anything in GLOB.clients) + COOLDOWN_RESET(C, say_slowmode) + + slowmode_cooldown = length_secs + if(measures[SLOWMODE_SAY]) + to_chat(world, span_boldannounce("Slowmode timer has been changed to [length] seconds by an admin.")) + return TRUE + +/// Handle the state change for individual measures +/datum/controller/subsystem/lag_switch/proc/set_measure(measure_key, state) + if(isnull(measure_key) || isnull(state)) + stack_trace("SSlag_switch.set_measure() was called with a null arg") + return FALSE + if(isnull(LAZYACCESS(measures, measure_key))) + stack_trace("SSlag_switch.set_measure() was called with a measure_key not in the list of measures") + return FALSE + if(measures[measure_key] == state) + return TRUE + + measures[measure_key] = state + + switch(measure_key) + if(DISABLE_DEAD_KEYLOOP) + if(state) + for(var/mob/user as anything in GLOB.player_list) + if(user.stat == DEAD && !user.client?.holder) + GLOB.keyloop_list -= user + deadchat_broadcast(span_big("To increase performance Observer freelook is now disabled. Please use Orbit, Teleport, and Jump to look around."), message_type = DEADCHAT_ANNOUNCEMENT) + else + GLOB.keyloop_list |= GLOB.player_list + deadchat_broadcast("Observer freelook has been re-enabled. Enjoy your wooshing.", message_type = DEADCHAT_ANNOUNCEMENT) + if(DISABLE_GHOST_ZOOM_TRAY) + if(state) // if enabling make sure current ghosts are updated + for(var/mob/dead/observer/ghost in GLOB.dead_mob_list) + if(!ghost.client) + continue + if(!ghost.client.holder && ghost.client.view_size.getView() != ghost.client.view_size.default) + ghost.client.view_size.resetToDefault() + if(SLOWMODE_SAY) + if(state) + to_chat(world, span_boldannounce("Slowmode for IC/dead chat has been enabled with [slowmode_cooldown/10] seconds between messages.")) + else + for(var/client/C as anything in GLOB.clients) + COOLDOWN_RESET(C, say_slowmode) + to_chat(world, span_boldannounce("Slowmode for IC/dead chat has been disabled by an admin.")) + if(DISABLE_NON_OBSJOBS) + world.update_status() + if(DISABLE_PARALLAX) + if (state) + to_chat(world, span_boldannounce("Parallax has been disabled for performance concerns.")) + else + to_chat(world, span_boldannounce("Parallax has been re-enabled.")) + + for (var/mob/mob as anything in GLOB.mob_list) + mob.hud_used?.update_parallax_pref() + if(DISABLE_FOOTSTEPS) + if (state) + to_chat(world, span_boldannounce("Footstep sounds have been disabled for performance concerns.")) + else + to_chat(world, span_boldannounce("Footstep sounds have been re-enabled.")) + if(DISABLE_PLANETDEL) + if (state) + to_chat(world, span_boldannounce("Planet deletion and regeneration has been disabled for performance concerns.")) + else + to_chat(world, span_boldannounce("Planet deletion has been re-enabled.")) + if(DISABLE_PLANETGEN) + if (state) + to_chat(world, span_boldannounce("Planet generation has been disabled for performance concerns. You can still dock at already-generated planets.")) + else + to_chat(world, span_boldannounce("Planet generation has been re-enabled.")) + + return TRUE + +/// Helper to loop over all measures for mass changes +/datum/controller/subsystem/lag_switch/proc/set_all_measures(state, automatic = FALSE) + if(isnull(state)) + stack_trace("SSlag_switch.set_all_measures() was called with a null state arg") + return FALSE + + if(automatic) + message_admins("Lag Switch enabling automatic measures now.") + log_admin("Lag Switch enabling automatic measures now.") + veto_timer_id = null + for(var/i = 1, i <= auto_measures.len, i++) + set_measure(auto_measures[i], state) + return TRUE + + for(var/i = 1, i <= measures.len, i++) + set_measure(i, state) + return TRUE diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 684ec401e290..0b4b33ce5942 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -212,6 +212,8 @@ * * spans - Additional classes to be added to the message */ /mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, runechat_flags = NONE) + if(SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(speaker, TRAIT_BYPASS_MEASURES)) + return // Ensure the list we are using, if present, is a copy so we don't modify the list provided to us spans = spans ? spans.Copy() : list() diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index d433e03b6934..95099164eec2 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -1,3 +1,5 @@ +#define SHOULD_DISABLE_FOOTSTEPS(source) ((SSlag_switch.measures[DISABLE_FOOTSTEPS] && !(HAS_TRAIT(source, TRAIT_BYPASS_MEASURES))) || HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS)) + ///Footstep component. Plays footsteps at parents location when it is appropriate. /datum/component/footstep ///How many steps the parent has taken since the last time a footstep was played. @@ -71,6 +73,9 @@ /datum/component/footstep/proc/play_simplestep() SIGNAL_HANDLER + if (SHOULD_DISABLE_FOOTSTEPS(parent)) + return + var/turf/open/T = prepare_step() if(!T) return @@ -94,8 +99,9 @@ /datum/component/footstep/proc/play_humanstep() SIGNAL_HANDLER - if(HAS_TRAIT(parent, TRAIT_SILENT_FOOTSTEPS)) + if (SHOULD_DISABLE_FOOTSTEPS(parent)) return + var/turf/open/T = prepare_step() if(!T) return @@ -115,3 +121,5 @@ GLOB.barefootstep[T.barefootstep][2] * volume, TRUE, GLOB.barefootstep[T.barefootstep][3] + e_range, falloff_distance = 1) + +#undef SHOULD_DISABLE_FOOTSTEPS diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index c4e77d9e2bc1..059caa18db18 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -152,8 +152,7 @@ .["version"] = GLOB.game_version .["mode"] = GLOB.master_mode .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE - .["enter"] = GLOB.enter_allowed - .["vote"] = CONFIG_GET(flag/allow_vote_mode) + .["enter"] = !LAZYACCESS(SSlag_switch.measures, DISABLE_NON_OBSJOBS) .["ai"] = CONFIG_GET(flag/allow_ai) .["host"] = world.host ? world.host : null .["round_id"] = GLOB.round_id diff --git a/code/game/world.dm b/code/game/world.dm index dcae8e237bd6..8377932887c9 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -289,10 +289,7 @@ GLOBAL_VAR(restart_counter) var/list/features = list() - if(GLOB.master_mode) - features += GLOB.master_mode - - if (!GLOB.enter_allowed) + if(LAZYACCESS(SSlag_switch.measures, DISABLE_NON_OBSJOBS)) features += "closed" var/s = "" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index b79f78b56008..df2bce8adeee 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -624,15 +624,12 @@ set category = "Server" set desc="People can't enter" set name="Toggle Entering" - GLOB.enter_allowed = !(GLOB.enter_allowed) - if (!(GLOB.enter_allowed)) - to_chat(world, "New players may no longer enter the game.", confidential = TRUE) - else - to_chat(world, "New players may now enter the game.", confidential = TRUE) - log_admin("[key_name(usr)] toggled new player game entering.") - message_admins("[key_name_admin(usr)] toggled new player game entering.") - world.update_status() - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[GLOB.enter_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(!SSlag_switch.initialized) + return + SSlag_switch.set_measure(DISABLE_NON_OBSJOBS, !SSlag_switch.measures[DISABLE_NON_OBSJOBS]) + log_admin("[key_name(usr)] toggled new player game entering. Lag Switch at index ([DISABLE_NON_OBSJOBS])") + message_admins("[key_name_admin(usr)] toggled new player game entering [SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "OFF" : "ON"].") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[!SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Server" @@ -984,3 +981,35 @@ "Admin login: [key_name(src)]") if(string) message_admins("[string]") + +/datum/admins/proc/show_lag_switch_panel() + set category = "Admin.Game" + set name = "Show Lag Switches" + set desc="Display the controls for drastic lag mitigation measures." + + if(!SSlag_switch.initialized) + to_chat(usr, span_notice("The Lag Switch subsystem has not yet been initialized.")) + return + if(!check_rights()) + return + + var/list/dat = list("Lag Switches

Lag (Reduction) Switches

") + dat += "Automatic Trigger: [SSlag_switch.auto_switch ? "On" : "Off"]
" + dat += "Population Threshold: [SSlag_switch.trigger_pop]
" + dat += "Slowmode Cooldown (toggle On/Off below): [SSlag_switch.slowmode_cooldown/10] seconds
" + dat += "
SET ALL MEASURES: ON | OFF
" + dat += "
Disable ghosts zoom and t-ray verbs (except staff): [SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] ? "On" : "Off"]
" + dat += "Disable planet deletion: [SSlag_switch.measures[DISABLE_PLANETDEL] ? "On" : "Off"]
" + dat += "Disable ALL planet GENERATION: [SSlag_switch.measures[DISABLE_PLANETGEN] ? "On" : "Off"]
" + dat += "Disable late joining: [SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "On" : "Off"]
" + dat += "
============! MAD GHOSTS ZONE !============
" + dat += "Disable deadmob keyLoop (except staff, informs dchat): [SSlag_switch.measures[DISABLE_DEAD_KEYLOOP] ? "On" : "Off"]
" + dat += "==========================================
" + dat += "
Measures below can be bypassed with a special trait
" + dat += "Slowmode say verb (informs world): [SSlag_switch.measures[SLOWMODE_SAY] ? "On" : "Off"]
" + dat += "Disable runechat: [SSlag_switch.measures[DISABLE_RUNECHAT] ? "On" : "Off"] - trait applies to speaker
" + dat += "Disable examine icons: [SSlag_switch.measures[DISABLE_USR_ICON2HTML] ? "On" : "Off"] - trait applies to examiner
" + dat += "Disable parallax: [SSlag_switch.measures[DISABLE_PARALLAX] ? "On" : "Off"] - trait applies to character
" + dat += "Disable footsteps: [SSlag_switch.measures[DISABLE_FOOTSTEPS] ? "On" : "Off"] - trait applies to character
" + dat += "" + usr << browse(dat.Join(), "window=lag_switch_panel;size=420x480") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ecaa96a572ec..6f1809098f9d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -36,6 +36,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/invisimin, /*allows our mob to go invisible/visible*/ // /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags)*/ + /datum/admins/proc/show_lag_switch_panel, /datum/verbs/menu/Admin/verb/playerpanel, /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ /client/proc/check_ai_laws, /*shows AI and borg laws*/ diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c7c5b204e9f7..329568458945 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1884,6 +1884,58 @@ SSticker.mode.station_goals += G modify_goals() + else if(href_list["change_lag_switch"]) + if(!check_rights(R_ADMIN)) + return + + switch(href_list["change_lag_switch"]) + if("ALL_ON") + SSlag_switch.set_all_measures(TRUE) + log_admin("[key_name(usr)] turned all Lag Switch measures ON.") + message_admins("[key_name_admin(usr)] turned all Lag Switch measures ON.") + if("ALL_OFF") + SSlag_switch.set_all_measures(FALSE) + log_admin("[key_name(usr)] turned all Lag Switch measures OFF.") + message_admins("[key_name_admin(usr)] turned all Lag Switch measures OFF.") + else + var/switch_index = text2num(href_list["change_lag_switch"]) + if(!SSlag_switch.set_measure(switch_index, !LAZYACCESS(SSlag_switch.measures, switch_index))) + to_chat(src, span_danger("Something went wrong when trying to toggle that Lag Switch. Check runtimes for more info."), confidential = TRUE) + else + log_admin("[key_name(usr)] turned a Lag Switch measure at index ([switch_index]) [LAZYACCESS(SSlag_switch.measures, switch_index) ? "ON" : "OFF"]") + message_admins("[key_name_admin(usr)] turned a Lag Switch measure [LAZYACCESS(SSlag_switch.measures, switch_index) ? "ON" : "OFF"]") + + src.show_lag_switch_panel() + + else if(href_list["change_lag_switch_option"]) + if(!check_rights(R_ADMIN)) + return + + switch(href_list["change_lag_switch_option"]) + if("CANCEL") + if(SSlag_switch.cancel_auto_enable_in_progress()) + log_admin("[key_name(usr)] canceled the automatic Lag Switch activation in progress.") + message_admins("[key_name_admin(usr)] canceled the automatic Lag Switch activation in progress.") + return // return here to avoid (re)rendering the panel for this case + if("TOGGLE_AUTO") + SSlag_switch.toggle_auto_enable() + log_admin("[key_name(usr)] toggled automatic Lag Switch activation [SSlag_switch.auto_switch ? "ON" : "OFF"].") + message_admins("[key_name_admin(usr)] toggled automatic Lag Switch activation [SSlag_switch.auto_switch ? "ON" : "OFF"].") + if("NUM") + var/new_num = input("Enter new threshold value:", "Num") as null|num + if(!isnull(new_num)) + SSlag_switch.trigger_pop = new_num + log_admin("[key_name(usr)] set the Lag Switch automatic trigger pop to [new_num].") + message_admins("[key_name_admin(usr)] set the Lag Switch automatic trigger pop to [new_num].") + if("SLOWCOOL") + var/new_num = input("Enter new cooldown in seconds:", "Num") as null|num + if(!isnull(new_num)) + SSlag_switch.change_slowmode_cooldown(new_num) + log_admin("[key_name(usr)] set the Lag Switch slowmode cooldown to [new_num] seconds.") + message_admins("[key_name_admin(usr)] set the Lag Switch slowmode cooldown to [new_num] seconds.") + + src.show_lag_switch_panel() + else if(href_list["viewruntime"]) var/datum/error_viewer/error_viewer = locate(href_list["viewruntime"]) if(!istype(error_viewer)) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index c3595010981f..9aaa8b989c0d 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -467,7 +467,7 @@ SSticker.roundend_check_paused = FALSE return - GLOB.enter_allowed = FALSE + SSlag_switch.set_measure(DISABLE_NON_OBSJOBS, TRUE) var/off_station = 0 var/turf/bomb_location = get_turf(src) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index f6c306a411af..de655ece5f1a 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -31,6 +31,8 @@ ///Internal counter for clients sending external (IRC/Discord) relay messages via ahelp to prevent spamming. Set to a number every time an admin reply is sent, decremented for every client send. var/externalreplyamount = 0 var/ircreplyamount = 0 + ///Tracks say() usage for ic/dchat while slowmode is enabled + COOLDOWN_DECLARE(say_slowmode) ///////// //OTHER// ///////// diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 5c5553df2755..44710b0fd6fc 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -469,6 +469,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( view_size.setZoomMode() fit_viewport() Master.UpdateTickRate() + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CLIENT_CONNECT, src) ////////////// //DISCONNECT// diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 79a5feac5966..a1062f6864d2 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -220,7 +220,10 @@ ready = PLAYER_NOT_READY return FALSE - var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will [CONFIG_GET(flag/norespawn) ? "not " : "" ]be able to respawn later.","Player Setup","Yes","No") + var/less_input_message + if(SSlag_switch.measures[DISABLE_DEAD_KEYLOOP]) + less_input_message = " - Notice: Observer freelook is currently disabled." + var/this_is_like_playing_right = tgui_alert(src, "Are you sure you wish to observe? You will [CONFIG_GET(flag/norespawn) ? "not " : "" ]be able to respawn later.[less_input_message]", "Player Setup", list("Yes","No")) if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY @@ -360,10 +363,11 @@ GLOB.ship_select_tgui.ui_interact(src) /mob/dead/new_player/proc/can_join_round(silent = FALSE) - if(!GLOB.enter_allowed) - if(!silent) - to_chat(usr, "There is an administrative lock on entering the game!") - return FALSE + if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) + if(silent) + return + to_chat(usr, span_notice("There is an administrative lock on entering the game!")) + return if(!SSticker?.IsRoundInProgress()) if(!silent) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 87b241dc8d53..dca421b8736d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -367,6 +367,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref))//Let's reset so people can't become allseeing gods SStgui.on_transfer(src, mind.current) // Transfer NanoUIs. + if(mind.current.stat == DEAD && SSlag_switch.measures[DISABLE_DEAD_KEYLOOP]) + to_chat(src, span_warning("To leave your body again use the Ghost verb.")) mind.current.key = key mind.current.client.init_verbs() return TRUE @@ -514,6 +516,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "View Range" set desc = "Change your view range." + if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) + to_chat(usr, span_notice("That verb is currently globally disabled.")) + return + var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT if(client.view_size.getView() == client.view_size.default) var/list/views = list() @@ -528,6 +534,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/verb/add_view_range(input as num) set name = "Add View Range" set hidden = TRUE + + if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) + to_chat(usr, span_notice("That verb is currently globally disabled.")) + return + var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT if(input) client.rescale_view(input, 0, ((max_view*2)+1) - 15) @@ -927,6 +938,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Toggles a view of sub-floor objects" var/static/t_ray_view = FALSE + if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder && !t_ray_view) + to_chat(usr, span_notice("That verb is currently globally disabled.")) + return t_ray_view = !t_ray_view var/list/t_ray_images = list() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f8233fad9d10..e334655b3848 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -59,6 +59,9 @@ I.on_mob_death(src, gibbed) if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf)) deadchat_broadcast(" has died at [get_area_name(T)].", "[mind.name]", follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) + if(SSlag_switch.measures[DISABLE_DEAD_KEYLOOP] && !client?.holder) + to_chat(src, span_deadsay(span_big("Observer freelook is disabled.\nPlease use Orbit, Teleport, and Jump to look around."))) + ghostize(TRUE) if(mind) mind.store_memory("Time of death: [tod]", 0) remove_from_alive_mob_list() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index ba8983691bdd..f092cef8cac9 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -128,6 +128,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list( say_dead(original_message) return + if(client && SSlag_switch.measures[SLOWMODE_SAY] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES) && !forced && src == usr) + if(!COOLDOWN_FINISHED(client, say_slowmode)) + to_chat(src, span_warning("Message not sent due to slowmode. Please wait [SSlag_switch.slowmode_cooldown/10] seconds between messages.\n\"[message]\"")) + return + COOLDOWN_START(client, say_slowmode, SSlag_switch.slowmode_cooldown) + if(!can_speak_basic(original_message, ignore_spam, forced)) return @@ -287,7 +293,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( //speech bubble var/list/speech_bubble_recipients = list() for(var/mob/M in listening) - if(M.client && !M.client.prefs.chat_on_map) + if(M.client && (!M.client.prefs.chat_on_map || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) speech_bubble_recipients.Add(M.client) var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA diff --git a/code/modules/mob/mob_lists.dm b/code/modules/mob/mob_lists.dm index bd47d511e1d4..861a87649ebf 100644 --- a/code/modules/mob/mob_lists.dm +++ b/code/modules/mob/mob_lists.dm @@ -42,6 +42,10 @@ /mob/proc/add_to_player_list() SHOULD_CALL_PARENT(TRUE) GLOB.player_list |= src + if(client.holder) + GLOB.keyloop_list |= src + else if(stat != DEAD || !SSlag_switch?.measures[DISABLE_DEAD_KEYLOOP]) + GLOB.keyloop_list |= src if(!SSticker?.mode) return if(stat == DEAD) @@ -53,6 +57,7 @@ /mob/proc/remove_from_player_list() SHOULD_CALL_PARENT(TRUE) GLOB.player_list -= src + GLOB.keyloop_list -= src if(!SSticker?.mode) return if(stat == DEAD) diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 178ff23d991e..7e70eb0ee159 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -69,6 +69,12 @@ to_chat(src, "You cannot talk in deadchat (muted).") return + if(SSlag_switch.measures[SLOWMODE_SAY] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES) && src == usr) + if(!COOLDOWN_FINISHED(client, say_slowmode)) + to_chat(src, span_warning("Message not sent due to slowmode. Please wait [SSlag_switch.slowmode_cooldown/10] seconds between messages.\n\"[message]\"")) + return + COOLDOWN_START(client, say_slowmode, SSlag_switch.slowmode_cooldown) + if(src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) return diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index 38f44e2d2fe0..4b62f777da73 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -93,8 +93,8 @@ if(preserve_level) return - if(length(mapzone?.get_mind_mobs())) - return //Dont fuck over stranded people? tbh this shouldn't be called on this condition, instead of bandaiding it inside + if(length(mapzone?.get_mind_mobs()) || SSlag_switch.measures[DISABLE_PLANETDEL]) + return //Dont fuck over stranded people log_shuttle("[src] [REF(src)] UNLOAD") var/list/results = SSovermap.get_unused_overmap_square() @@ -172,6 +172,8 @@ * * visiting shuttle - The docking port of the shuttle visiting the level. */ /datum/overmap/dynamic/proc/load_level() + if(SSlag_switch.measures[DISABLE_PLANETGEN] && !(HAS_TRAIT(usr, TRAIT_BYPASS_MEASURES))) + return FALSE if(mapzone) return TRUE log_shuttle("[src] [REF(src)] LEVEL_INIT") diff --git a/config/config.txt b/config/config.txt index 89dd495066eb..0cdece6b6a16 100644 --- a/config/config.txt +++ b/config/config.txt @@ -338,6 +338,9 @@ NOTE_FRESH_DAYS 91.31055 ## Notes older then this will be completely faded out. NOTE_STALE_DAYS 365.2422 +## Uncomment to allow drastic performence enhancemet measures to turn on automatically once there are equal or more clients than the configured amount (will also prompt admin for veto) +#AUTO_LAG_SWITCH_POP 75 + ##Note: all population caps can be used with each other if desired. ## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. diff --git a/shiptest.dme b/shiptest.dme index 017f8a1cdda8..44e82f5e85b4 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -72,6 +72,7 @@ #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" #include "code\__DEFINES\keybinding.dm" +#include "code\__DEFINES\lag_switch.dm" #include "code\__DEFINES\language.dm" #include "code\__DEFINES\layers.dm" #include "code\__DEFINES\lighting.dm" @@ -316,6 +317,7 @@ #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm" #include "code\controllers\subsystem\jukeboxes.dm" +#include "code\controllers\subsystem\lag_switch.dm" #include "code\controllers\subsystem\language.dm" #include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\machines.dm" From e1f3bf275c58a21709a6db341906b855f42ceac6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 16:05:27 -0500 Subject: [PATCH 32/57] Automatic changelog generation for PR #2133 [ci skip] --- html/changelogs/AutoChangeLog-pr-2133.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2133.yml diff --git a/html/changelogs/AutoChangeLog-pr-2133.yml b/html/changelogs/AutoChangeLog-pr-2133.yml new file mode 100644 index 000000000000..e9f53fdf7492 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2133.yml @@ -0,0 +1,4 @@ +author: MarkSuckerberg +delete-after: true +changes: + - admin: Adds lag switch toggles from /tg/, ONLY use them when the lag becomes unbearable! From 58b63d6965d1f7b70b901414824e24277ecabb4f Mon Sep 17 00:00:00 2001 From: thgvr <81882910+thgvr@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:19:41 -0700 Subject: [PATCH 33/57] Buildmode & Supply Pod Ports (#2272) ## About The Pull Request Ports admin improvements/qol for tools from tgstation ### Buildmode stuff - [x] https://github.com/tgstation/tgstation/pull/52249 - [x] https://github.com/tgstation/tgstation/pull/57457 - [x] https://github.com/tgstation/tgstation/pull/58715 - [x] https://github.com/tgstation/tgstation/pull/69428 - [x] https://github.com/tgstation/tgstation/pull/76095 ### Supply pod stuff - [x] https://github.com/BeeStation/BeeStation-Hornet/pull/3837 ## Why It's Good For The Game wa ## Changelog :cl: admin: Improved admin build mode menu and Drop pods from tgstation /:cl: --------- Co-authored-by: Mark Suckerberg --- _maps/map_files/generic/CentCom.dmm | 4 +- _maps/map_files/generic/blank.dmm | 2 +- code/__DEFINES/cargo.dm | 60 +- code/__DEFINES/combat.dm | 6 +- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/flags.dm | 1 - code/__DEFINES/is_helpers.dm | 4 + code/__DEFINES/obj_flags.dm | 4 + code/__HELPERS/datums.dm | 9 + code/datums/components/pellet_cloud.dm | 6 +- code/datums/skills/_skill.dm | 4 +- code/game/area/areas/centcom.dm | 19 +- code/game/atoms.dm | 16 + code/game/machinery/roulette_machine.dm | 2 +- code/game/objects/effects/misc.dm | 4 - code/game/objects/items/miscellaneous.dm | 2 +- .../structures/crates_lockers/closets.dm | 7 + code/modules/admin/admin.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 2 +- .../traitor/equipment/contractor.dm | 2 +- .../antagonists/traitor/syndicate_contract.dm | 6 +- code/modules/asset_cache/asset_list_items.dm | 34 + code/modules/buildmode/buildmode.dm | 38 +- code/modules/buildmode/buttons.dm | 5 + code/modules/buildmode/submodes/advanced.dm | 48 +- code/modules/buildmode/submodes/area_edit.dm | 46 +- code/modules/buildmode/submodes/basic.dm | 33 +- code/modules/buildmode/submodes/boom.dm | 27 +- code/modules/buildmode/submodes/copy.dm | 16 +- code/modules/buildmode/submodes/delete.dm | 61 + code/modules/buildmode/submodes/fill.dm | 46 +- code/modules/buildmode/submodes/map_export.dm | 20 +- code/modules/buildmode/submodes/outfit.dm | 44 + code/modules/buildmode/submodes/proccall.dm | 49 + code/modules/buildmode/submodes/throwing.dm | 18 +- code/modules/buildmode/submodes/tweakcomps.dm | 34 + .../buildmode/submodes/variable_edit.dm | 36 +- code/modules/cargo/centcom_podlauncher.dm | 727 ++++--- code/modules/cargo/expressconsole.dm | 2 +- code/modules/cargo/gondolapod.dm | 19 +- code/modules/cargo/supplypod.dm | 654 +++++-- code/modules/events/stray_cargo.dm | 2 +- code/modules/holodeck/area_copy.dm | 8 +- icons/effects/supplypod_pickturf.dmi | Bin 0 -> 336 bytes icons/effects/supplypod_pickturf_down.dmi | Bin 0 -> 322 bytes icons/misc/buildmode.dmi | Bin 1774 -> 3319 bytes icons/obj/supplypods.dmi | Bin 56060 -> 26572 bytes icons/obj/supplypods_32x32.dmi | Bin 0 -> 1640 bytes shiptest.dme | 5 + .../tgui/interfaces/CentcomPodLauncher.js | 1667 ++++++++++++----- 51 files changed, 2693 insertions(+), 1112 deletions(-) create mode 100644 code/__HELPERS/datums.dm create mode 100644 code/modules/buildmode/submodes/delete.dm create mode 100644 code/modules/buildmode/submodes/outfit.dm create mode 100644 code/modules/buildmode/submodes/proccall.dm create mode 100644 code/modules/buildmode/submodes/tweakcomps.dm create mode 100644 icons/effects/supplypod_pickturf.dmi create mode 100644 icons/effects/supplypod_pickturf_down.dmi create mode 100644 icons/obj/supplypods_32x32.dmi diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 722fdcb4f209..86538c6fc45d 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -680,7 +680,7 @@ "alS" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, -/area/centcom/supplypod/flyMeToTheMoon) +/area/centcom/supplypod/supplypod_temp_holding) "alW" = ( /obj/structure/chair{ dir = 8 @@ -4244,7 +4244,7 @@ /area/centcom/ferry) "aNE" = ( /turf/open/floor/plasteel, -/area/centcom/supplypod/podStorage) +/area/centcom/supplypod/pod_storage) "aNF" = ( /obj/machinery/computer/communications{ dir = 1 diff --git a/_maps/map_files/generic/blank.dmm b/_maps/map_files/generic/blank.dmm index b8744ca3eca5..b918e3fcaead 100644 --- a/_maps/map_files/generic/blank.dmm +++ b/_maps/map_files/generic/blank.dmm @@ -38,7 +38,7 @@ "N" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, -/area/centcom/supplypod/flyMeToTheMoon) +/area/centcom/supplypod/supplypod_temp_holding) "P" = ( /obj/structure/signpost/salvation{ icon = 'icons/obj/structures.dmi'; diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index d5341990774a..c6564616c01b 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -13,23 +13,45 @@ #define STYLE_GONDOLA 13 #define STYLE_SEETHROUGH 14 -#define POD_ICON_STATE 1 -#define POD_NAME 2 -#define POD_DESC 3 +#define POD_SHAPE 1 +#define POD_BASE 2 +#define POD_DOOR 3 +#define POD_DECAL 4 +#define POD_GLOW 5 +#define POD_RUBBLE_TYPE 6 +#define POD_NAME 7 +#define POD_DESC 8 -#define POD_STYLES list( \ - list("supplypod", "supply pod", "A Nanotrasen supply drop pod."), \ - list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."), \ - list("centcompod", "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."), \ - list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."), \ - list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."), \ - list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."), \ - list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."), \ - list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."), \ - list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."), \ - list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."), \ - list("fruitpod", "\improper Orange", "An angry orange."), \ - list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"), \ - list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency."), \ - list("", "", "") \ -) +#define RUBBLE_NONE 1 +#define RUBBLE_NORMAL 2 +#define RUBBLE_WIDE 3 +#define RUBBLE_THIN 4 + +#define POD_SHAPE_NORML 1 +#define POD_SHAPE_OTHER 2 + +#define POD_TRANSIT "1" +#define POD_FALLING "2" +#define POD_OPENING "3" +#define POD_LEAVING "4" + +#define SUPPLYPOD_X_OFFSET -16 + +GLOBAL_LIST_EMPTY(supplypod_loading_bays) + +GLOBAL_LIST_INIT(podstyles, list(\ + list(POD_SHAPE_NORML, "pod", TRUE, "default", "yellow", RUBBLE_NORMAL, "supply pod", "A Nanotrasen supply drop pod."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "bluespace", "blue", RUBBLE_NORMAL, "bluespace supply pod", "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "advpod", TRUE, "centcom", "blue", RUBBLE_NORMAL, "\improper CentCom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to CentCom after delivery."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "syndicate", "red", RUBBLE_NORMAL, "blood-red supply pod", "An intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list(POD_SHAPE_NORML, "darkpod", TRUE, "deathsquad", "blue", RUBBLE_NORMAL, "\improper Deathsquad drop pod", "A Nanotrasen drop pod. This one has been marked the markings of Nanotrasen's elite strike team."),\ + list(POD_SHAPE_NORML, "pod", TRUE, "cultist", "red", RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list(POD_SHAPE_NORML, "clownpod", TRUE, "clown", "green", RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ + list(POD_SHAPE_OTHER, "gondola", FALSE, FALSE, FALSE, RUBBLE_NONE, "gondola", "The silent walker. This one seems to be part of a delivery agency."),\ + list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, FALSE, FALSE, "rl_click", "give_po")\ +)) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 47189ae8b285..36da2cc3ae7d 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -111,12 +111,8 @@ #define SHOVE_SLOWDOWN_LENGTH 30 #define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier //Shove disarming item list -GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( - /obj/item/gun))) - - +GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun))) //Combat object defines - //Embedded objects #define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) #define EMBEDDED_ITEM_FALLOUT 5 //Chance for embedded object to fall out (causing pain but removing the object) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index e5290556d7dc..4328e6da90aa 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -534,6 +534,8 @@ #define COMSIG_TOOL_START_USE "tool_start_use" ///from base of [/obj/item/proc/tool_start_check]: (mob/living/user) #define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed" ///from [/obj/item/proc/disableEmbedding]: #define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]: +///from [/obj/structure/closet/supplypod/proc/endlaunch]: +#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" ///Called when an item is being offered, from [/obj/item/proc/on_offered(mob/living/carbon/offerer)] #define COMSIG_ITEM_OFFERING "item_offering" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 82bfd3d983f1..bb0510ea91ca 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -4,7 +4,6 @@ #define ALL (~0) //For convenience. #define NONE 0 - GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) /* Directions */ diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index deacb4000289..4dc29d360b82 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -168,6 +168,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define islandmine(A) (istype(A, /obj/effect/mine)) +#define issupplypod(A) (istype(A, /obj/structure/closet/supplypod)) + #define isammocasing(A) (istype(A, /obj/item/ammo_casing)) #define isidcard(I) (istype(I, /obj/item/card/id)) @@ -227,6 +229,8 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) +#define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) + #define isbook(O) (is_type_in_typecache(O, GLOB.book_types)) GLOBAL_LIST_INIT(book_types, typecacheof(list( diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index d9c57e5d3efa..dfecc6f8af6b 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -59,3 +59,7 @@ #define ORGAN_VITAL (1<<4) //Currently only the brain #define ORGAN_EDIBLE (1<<5) //is a snack? :D #define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time. + +/// Flags for the pod_flags var on /obj/structure/closet/supplypod + +#define FIRST_SOUNDS (1<<0) // If it shouldn't play sounds the first time it lands, used for reverse mode diff --git a/code/__HELPERS/datums.dm b/code/__HELPERS/datums.dm new file mode 100644 index 000000000000..7cf87c203b73 --- /dev/null +++ b/code/__HELPERS/datums.dm @@ -0,0 +1,9 @@ +///Check if a datum has not been deleted and is a valid source +/proc/is_valid_src(datum/source_datum) + if(istype(source_datum)) + return !QDELETED(source_datum) + return FALSE + +/proc/call_async(datum/source, proc_type, list/arguments) + set waitfor = FALSE + return call(source, proc_type)(arglist(arguments)) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index d0998c41e5b8..b726489ad2a9 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -47,7 +47,7 @@ var/mob/living/shooter /datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) - if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent)) + if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent) && !issupplypod(parent)) return COMPONENT_INCOMPATIBLE if(magnitude < 1) @@ -58,7 +58,7 @@ if(isammocasing(parent)) num_pellets = magnitude - else if(isgrenade(parent) || islandmine(parent)) + else if(isgrenade(parent) || islandmine(parent) || issupplypod(parent)) radius = magnitude /datum/component/pellet_cloud/Destroy(force, silent) @@ -77,6 +77,8 @@ RegisterSignal(parent, COMSIG_GRENADE_PRIME, .proc/create_blast_pellets) else if(islandmine(parent)) RegisterSignal(parent, COMSIG_MINE_TRIGGERED, .proc/create_blast_pellets) + else if(issupplypod(parent)) + RegisterSignal(parent, COMSIG_SUPPLYPOD_LANDED, .proc/create_blast_pellets) /datum/component/pellet_cloud/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_PARENT_PREQDELETED, COMSIG_PELLET_CLOUD_INIT, COMSIG_GRENADE_PRIME, COMSIG_GRENADE_ARMED, COMSIG_MOVABLE_MOVED, COMSIG_MINE_TRIGGERED, COMSIG_ITEM_DROPPED)) diff --git a/code/datums/skills/_skill.dm b/code/datums/skills/_skill.dm index 46c3a1d2bc4d..368a1991a015 100644 --- a/code/datums/skills/_skill.dm +++ b/code/datums/skills/_skill.dm @@ -73,9 +73,9 @@ GLOBAL_LIST_INIT(skill_types, subtypesof(/datum/skill)) to_chat(mind.current, "It seems the Professional [title] Association won't send me another status symbol.") return var/obj/structure/closet/supplypod/bluespacepod/pod = new() - pod.landingDelay = 150 + pod.delays = list(POD_TRANSIT = 15, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) pod.explosionSize = list(0,0,0,0) to_chat(mind.current, "My legendary skill has attracted the attention of the Professional [title] Association. It seems they are sending me a status symbol to commemorate my abilities.") var/turf/T = get_turf(mind.current) - new /obj/effect/DPtarget(T, pod , new skill_cape_path(T)) + new /obj/effect/pod_landingzone(T, pod , new skill_cape_path(T)) LAZYADD(mind.skills_rewarded, src.type) diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index a41152d29044..8ca63ad47e4f 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -28,7 +28,7 @@ /area/centcom/holding name = "Holding Facility" -/area/centcom/supplypod/flyMeToTheMoon +/area/centcom/supplypod/supplypod_temp_holding name = "Supplypod Shipping lane" icon_state = "supplypod_flight" @@ -37,28 +37,43 @@ icon_state = "supplypod" dynamic_lighting = DYNAMIC_LIGHTING_DISABLED -/area/centcom/supplypod/podStorage +/area/centcom/supplypod/pod_storage name = "Supplypod Storage" icon_state = "supplypod_holding" /area/centcom/supplypod/loading name = "Supplypod Loading Facility" icon_state = "supplypod_loading" + var/loading_id = "" + +/area/centcom/supplypod/loading/Initialize() + . = ..() + if(!loading_id) + CRASH("[type] created without a loading_id") + if(GLOB.supplypod_loading_bays[loading_id]) + CRASH("Duplicate loading bay area: [type] ([loading_id])") + GLOB.supplypod_loading_bays[loading_id] = src /area/centcom/supplypod/loading/one name = "Bay #1" + loading_id = "1" /area/centcom/supplypod/loading/two name = "Bay #2" + loading_id = "2" /area/centcom/supplypod/loading/three name = "Bay #3" + loading_id = "3" /area/centcom/supplypod/loading/four name = "Bay #4" + loading_id = "4" /area/centcom/supplypod/loading/ert name = "ERT Bay" + loading_id = "5" + //THUNDERDOME /area/tdome diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 38ee90a32674..60a61718bd8a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1651,3 +1651,19 @@ else //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this active_hud.screentip_text.maptext = "[name]" + +/* +* Used to set something as 'open' if it's being used as a supplypod +* +* Override this if you want an atom to be usable as a supplypod. +*/ +/atom/proc/setOpened() + return + +/* +* Used to set something as 'closed' if it's being used as a supplypod +* +* Override this if you want an atom to be usable as a supplypod. +*/ +/atom/proc/setClosed() + return diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 2cc1dd2dafb3..93cc18456bc1 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -415,7 +415,7 @@ new /obj/machinery/roulette(toLaunch) - new /obj/effect/DPtarget(drop_location(), toLaunch) + new /obj/effect/pod_landingzone(drop_location(), toLaunch) qdel(src) #undef ROULETTE_SINGLES_PAYOUT diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index f9f7d19d161f..cc7cf2eb3d0b 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -40,10 +40,6 @@ density = TRUE layer = FLY_LAYER -/obj/effect/supplypod_selector - icon_state = "supplypod_selector" - layer = FLY_LAYER - //Makes a tile fully lit no matter what /obj/effect/fullbright icon = 'icons/effects/alphacolors.dmi' diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 8ae9a34e2dee..487d5d2c96ca 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -61,7 +61,7 @@ msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: Item request received. Your package is inbound, please stand back from the landing site. Message ends.\"" to_chat(M, msg) - new /obj/effect/DPtarget(get_turf(src), pod) + new /obj/effect/pod_landingzone(get_turf(src), pod) /obj/item/choice_beacon/hero name = "heroic beacon" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 137af446fa15..25ad21d25d20 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -71,6 +71,8 @@ /obj/structure/closet/update_icon() . = ..() + if (istype(src, /obj/structure/closet/supplypod)) + return layer = opened ? BELOW_OBJ_LAYER : OBJ_LAYER @@ -340,6 +342,11 @@ var/mob/living/L = O if(!issilicon(L)) L.Paralyze(40) + if(istype(src, /obj/structure/closet/supplypod/extractionpod)) + O.forceMove(src) + else + O.forceMove(T) + close() O.forceMove(T) close() else diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index df2bce8adeee..3ba6a5374cd6 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -742,7 +742,7 @@ var/obj/structure/closet/supplypod/centcompod/pod = new() var/atom/A = new chosen(pod) A.flags_1 |= ADMIN_SPAWNED_1 - new /obj/effect/DPtarget(T, pod) + new /obj/effect/pod_landingzone(T, pod) log_admin("[key_name(usr)] pod-spawned [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 329568458945..b5ef01db7c76 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1573,7 +1573,7 @@ R.activate_module(I) if(pod) - new /obj/effect/DPtarget(target, pod) + new /obj/effect/pod_landingzone(target, pod) if (number == 1) log_admin("[key_name(usr)] created a [english_list(paths)]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 00c248dcf354..6aac0dc8912e 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -935,7 +935,7 @@ alert("ERROR: Incorrect / improper path given.") return new delivery(pod) - new /obj/effect/DPtarget(get_turf(target), pod) + new /obj/effect/pod_landingzone(get_turf(target), pod) if(ADMIN_PUNISHMENT_SUPPLYPOD) var/datum/centcom_podlauncher/plaunch = new(usr) if(!holder) diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 121430252ef0..b1d68a719070 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -229,7 +229,7 @@ to_chat(partner_mind.current, "\n[user.real_name] is your superior. Follow any, and all orders given by them. You're here to support their mission only.") to_chat(partner_mind.current, "Should they perish, or be otherwise unavailable, you're to assist other active agents in this mission area to the best of your ability.\n\n") - new /obj/effect/DPtarget(free_location, arrival_pod) + new /obj/effect/pod_landingzone(free_location, arrival_pod) /datum/contractor_item/blackout name = "Blackout" diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index 977cab2987dc..17e841acb5e3 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -68,7 +68,7 @@ empty_pod.explosionSize = list(0,0,0,1) empty_pod.leavingSound = 'sound/effects/podwoosh.ogg' - new /obj/effect/DPtarget(empty_pod_turf, empty_pod) + new /obj/effect/pod_landingzone(empty_pod_turf, empty_pod) /datum/syndicate_contract/proc/enter_check(datum/source, sent_mob) if (istype(source, /obj/structure/closet/supplypod/extractionpod)) @@ -111,7 +111,7 @@ var/obj/structure/closet/supplypod/extractionpod/pod = source // Handle the pod returning - pod.send_up(pod) + pod.startExitSequence(pod) if (ishuman(M)) var/mob/living/carbon/human/target = M @@ -226,7 +226,7 @@ M.Dizzy(35) M.confused += 20 - new /obj/effect/DPtarget(possible_drop_loc[pod_rand_loc], return_pod) + new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) else to_chat(M, "A million voices echo in your head... \"Seems where you got sent here from won't \ be able to handle our pod... You will die here instead.\"") diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 505c84db67fd..feb2fd160992 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -438,3 +438,37 @@ "fishing_background_default" = 'icons/ui_icons/fishing/default.png', "fishing_background_lavaland" = 'icons/ui_icons/fishing/lavaland.png' ) + +/datum/asset/spritesheet/supplypods + name = "supplypods" + +/datum/asset/spritesheet/supplypods/register() + for (var/style in 1 to length(GLOB.podstyles)) + var/icon_file = 'icons/obj/supplypods.dmi' + var/states = icon_states(icon_file) + if (style == STYLE_SEETHROUGH) + Insert("pod_asset[style]", icon(icon_file, "seethrough-icon", SOUTH)) + continue + var/base = GLOB.podstyles[style][POD_BASE] + if (!base) + Insert("pod_asset[style]", icon(icon_file, "invisible-icon", SOUTH)) + continue + var/icon/podIcon = icon(icon_file, base, SOUTH) + var/door = GLOB.podstyles[style][POD_DOOR] + if (door) + door = "[base]_door" + if(door in states) + podIcon.Blend(icon(icon_file, door, SOUTH), ICON_OVERLAY) + var/shape = GLOB.podstyles[style][POD_SHAPE] + if (shape == POD_SHAPE_NORML) + var/decal = GLOB.podstyles[style][POD_DECAL] + if (decal) + if(decal in states) + podIcon.Blend(icon(icon_file, decal, SOUTH), ICON_OVERLAY) + var/glow = GLOB.podstyles[style][POD_GLOW] + if (glow) + glow = "pod_glow_[glow]" + if(glow in states) + podIcon.Blend(icon(icon_file, glow, SOUTH), ICON_OVERLAY) + Insert("pod_asset[style]", podIcon) + return ..() diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 8ee15ad72e2c..19bb6631c708 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -15,13 +15,15 @@ // Switching management var/switch_state = BM_SWITCHSTATE_NONE - var/switch_width = 5 + var/switch_width = 4 // modeswitch UI var/atom/movable/screen/buildmode/mode/modebutton var/list/modeswitch_buttons = list() // dirswitch UI var/atom/movable/screen/buildmode/bdir/dirbutton var/list/dirswitch_buttons = list() + /// item preview for selected item + var/atom/movable/screen/buildmode/preview_item/preview /datum/buildmode/New(client/c) mode = new /datum/buildmode_mode/basic(src) @@ -44,6 +46,7 @@ /datum/buildmode/Destroy() close_switchstates() + close_preview() holder.player_details.post_login_callbacks -= li_cb holder = null QDEL_NULL(mode) @@ -72,7 +75,7 @@ buttons += new /atom/movable/screen/buildmode/quit(src) // build the lists of switching buttons build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /atom/movable/screen/buildmode/modeswitch) - build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) + build_options_grid(GLOB.alldirs, dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) // this creates a nice offset grid for choosing between buildmode options, // because going "click click click ah hell" sucks. @@ -124,10 +127,41 @@ switch_state = BM_SWITCHSTATE_NONE holder.screen -= dirswitch_buttons +/datum/buildmode/proc/preview_selected_item(atom/typepath) + close_preview() + preview = new /atom/movable/screen/buildmode/preview_item(src) + preview.name = initial(typepath.name) + + // Scale the preview if it's bigger than one tile + var/mutable_appearance/preview_overlay = new(typepath) + var/icon/size_check = icon(initial(typepath.icon), icon_state = initial(typepath.icon_state)) + var/scale = 1 + var/width = size_check.Width() + var/height = size_check.Height() + if(width > world.icon_size || height > world.icon_size) + if(width >= height) + scale = world.icon_size / width + else + scale = world.icon_size / height + preview_overlay.transform = preview_overlay.transform.Scale(scale) + preview_overlay.appearance_flags |= TILE_BOUND + preview_overlay.layer = FLOAT_LAYER + preview_overlay.plane = FLOAT_PLANE + preview.add_overlay(preview_overlay) + + holder.screen += preview + +/datum/buildmode/proc/close_preview() + if(isnull(preview)) + return + holder.screen -= preview + QDEL_NULL(preview) + /datum/buildmode/proc/change_mode(newmode) mode.exit_mode(src) QDEL_NULL(mode) close_switchstates() + close_preview() mode = new newmode(src) mode.enter_mode(src) modebutton.update_appearance() diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index a1893b4b6232..a40cbcfa7a6d 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -89,3 +89,8 @@ /atom/movable/screen/buildmode/quit/Click() bd.quit() return 1 + +/atom/movable/screen/buildmode/preview_item + name = "Selected Item" + icon_state = "template" + screen_loc = "NORTH,WEST+4" diff --git a/code/modules/buildmode/submodes/advanced.dm b/code/modules/buildmode/submodes/advanced.dm index de6e84f6a1eb..4fd6f30ca52b 100644 --- a/code/modules/buildmode/submodes/advanced.dm +++ b/code/modules/buildmode/submodes/advanced.dm @@ -1,23 +1,22 @@ /datum/buildmode_mode/advanced key = "advanced" - var/objholder = null + var/atom/objholder = null // FIXME: add logic which adds a button displaying the icon // of the currently selected path -/datum/buildmode_mode/advanced/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Right Mouse Button on buildmode button = Set object type") - to_chat(c, "Left Mouse Button + alt on turf/obj = Copy object type") - to_chat(c, "Left Mouse Button on turf/obj = Place objects") - to_chat(c, "Right Mouse Button = Delete objects") - to_chat(c, "
") - to_chat(c, "Use the button in the upper left corner to") - to_chat(c, "change the direction of built objects.") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/advanced/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Set object type")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Copy object type")] -> Left Mouse Button + Alt on turf/obj\n\ + [span_bold("Place objects")] -> Left Mouse Button on turf/obj\n\ + [span_bold("Delete objects")] -> Right Mouse Button\n\ + \n\ + Use the button in the upper left corner to change the direction of built objects.")) + ) -/datum/buildmode_mode/advanced/change_settings(client/c) - var/target_path = input(c, "Enter typepath:", "Typepath", "/obj/structure/closet") +/datum/buildmode_mode/advanced/change_settings(client/target_client) + var/target_path = input(target_client, "Enter typepath:", "Typepath", "/obj/structure/closet") objholder = text2path(target_path) if(!ispath(objholder)) objholder = pick_closest_path(target_path) @@ -28,8 +27,9 @@ objholder = null alert("That path is not allowed.") return + BM.preview_selected_item(objholder) -/datum/buildmode_mode/advanced/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/advanced/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) var/left_click = LAZYACCESS(modifiers, LEFT_CLICK) var/right_click = LAZYACCESS(modifiers, RIGHT_CLICK) @@ -38,21 +38,27 @@ if(left_click && alt_click) if (istype(object, /turf) || istype(object, /obj) || istype(object, /mob)) objholder = object.type - to_chat(c, "[initial(object.name)] ([object.type]) selected.") + to_chat(target_client, "[initial(object.name)] ([object.type]) selected.") + BM.preview_selected_item(objholder) else - to_chat(c, "[initial(object.name)] is not a turf, object, or mob! Please select again.") + to_chat(target_client, "[initial(object.name)] is not a turf, object, or mob! Please select again.") else if(left_click) if(ispath(objholder,/turf)) var/turf/T = get_turf(object) - log_admin("Build Mode: [key_name(c)] modified [T] in [AREACOORD(object)] to [objholder]") - T.ChangeTurf(objholder) + log_admin("Build Mode: [key_name(target_client)] modified [T] in [AREACOORD(object)] to [objholder]") + T = T.ChangeTurf(objholder) + T.setDir(BM.build_dir) + else if(ispath(objholder, /obj/effect/turf_decal)) + var/turf/T = get_turf(object) + T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, FALSE, initial(objholder.color), null, null, initial(objholder.alpha)) + log_admin("Build Mode: [key_name(target_client)] in [AREACOORD(object)] added a [initial(objholder.name)] decal with dir [BM.build_dir] to [T]") else if(!isnull(objholder)) var/obj/A = new objholder (get_turf(object)) A.setDir(BM.build_dir) - log_admin("Build Mode: [key_name(c)] modified [A]'s [COORD(A)] dir to [BM.build_dir]") + log_admin("Build Mode: [key_name(target_client)] modified [A]'s [COORD(A)] dir to [BM.build_dir]") else - to_chat(c, "Select object type first.") + to_chat(target_client, "Select object type first.") else if(right_click) if(isobj(object)) - log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]") + log_admin("Build Mode: [key_name(target_client)] deleted [object] at [AREACOORD(object)]") qdel(object) diff --git a/code/modules/buildmode/submodes/area_edit.dm b/code/modules/buildmode/submodes/area_edit.dm index 039f2897a888..b0d8925c0c85 100644 --- a/code/modules/buildmode/submodes/area_edit.dm +++ b/code/modules/buildmode/submodes/area_edit.dm @@ -1,5 +1,6 @@ /datum/buildmode_mode/area_edit key = "areaedit" + use_corner_selection = TRUE var/area/storedarea var/image/areaimage @@ -20,18 +21,19 @@ storedarea = null return ..() -/datum/buildmode_mode/area_edit/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button on obj/turf/mob = Paint area") - to_chat(c, "Right Mouse Button on obj/turf/mob = Select area to paint") - to_chat(c, "Right Mouse Button on buildmode button = Create new area") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/area_edit/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Paint area")] -> Left Mouse Button + Alt on turf/obj/mob\n\ + [span_bold("Select area to paint")] -> Right Mouse Button on obj/turf/mob\n\ + [span_bold("Create new area")] -> Right Mouse Button on buildmode button")) + ) -/datum/buildmode_mode/area_edit/change_settings(client/c) - var/target_path = input(c, "Enter typepath:", "Typepath", "/area") +/datum/buildmode_mode/area_edit/change_settings(client/target_client) + var/target_path = input(target_client, "Enter typepath:", "Typepath", "/area") var/areatype = text2path(target_path) if(ispath(areatype,/area)) - var/areaname = input(c, "Enter area name:", "Area name", "Area") + var/areaname = input(target_client, "Enter area name:", "Area name", "Area") if(!areaname || !length(areaname)) return storedarea = new areatype @@ -42,18 +44,32 @@ storedarea.name = areaname areaimage.loc = storedarea // color our area -/datum/buildmode_mode/area_edit/handle_click(client/c, params, object) +/datum/buildmode_mode/area_edit/handle_click(client/target_client, params, object) var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) if(!storedarea) - to_chat(c, "Configure or select the area you want to paint first!") + to_chat(target_client, "Configure or select the area you want to paint first!") return - var/turf/T = get_turf(object) - if(get_area(T) != storedarea) - log_admin("Build Mode: [key_name(c)] added [AREACOORD(T)] to [storedarea]") - storedarea.contents.Add(T) + if(LAZYACCESS(modifiers, ALT_CLICK)) + var/turf/T = get_turf(object) + if(get_area(T) != storedarea) + log_admin("Build Mode: [key_name(target_client)] added [AREACOORD(T)] to [storedarea]") + storedarea.contents.Add(T) + return + return ..() else if(LAZYACCESS(modifiers, RIGHT_CLICK)) var/turf/T = get_turf(object) storedarea = get_area(T) areaimage.loc = storedarea // color our area + +/datum/buildmode_mode/area_edit/handle_selected_area(client/target_client, params) + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, LEFT_CLICK)) + var/choice = alert("Are you sure you want to fill area?", "Area Fill Confirmation", "Yes", "No") + if(choice != "Yes") + return + for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB))) + storedarea.contents.Add(T) + log_admin("Build Mode: [key_name(target_client)] set the area of the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)] to [storedarea].") diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index 302ffba04f9f..180331e94ba8 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -1,18 +1,17 @@ /datum/buildmode_mode/basic key = "basic" -/datum/buildmode_mode/basic/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button = Construct / Upgrade") - to_chat(c, "Right Mouse Button = Deconstruct / Delete / Downgrade") - to_chat(c, "Left Mouse Button + ctrl = R-Window") - to_chat(c, "Left Mouse Button + alt = Airlock") - to_chat(c, "
") - to_chat(c, "Use the button in the upper left corner to") - to_chat(c, "change the direction of built objects.") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/basic/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Construct / Upgrade")] -> Left Mouse Button\n\ + [span_bold("Deconstruct / Delete / Downgrade")] -> Right Mouse Button\n\ + [span_bold("R-Window")] -> Left Mouse Button + Ctrl\n\ + [span_bold("Airlock")] -> Left Mouse Button + Alt \n\ + \n\ + Use the button in the upper left corner to change the direction of built objects.")) + ) -/datum/buildmode_mode/basic/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/basic/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) var/left_click = LAZYACCESS(modifiers, LEFT_CLICK) @@ -30,10 +29,10 @@ T.PlaceOnTop(/turf/closed/wall) else if(iswallturf(object)) T.PlaceOnTop(/turf/closed/wall/r_wall) - log_admin("Build Mode: [key_name(c)] built [T] at [AREACOORD(T)]") + log_admin("Build Mode: [key_name(target_client)] built [T] at [AREACOORD(T)]") return else if(right_click) - log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]") + log_admin("Build Mode: [key_name(target_client)] deleted [object] at [AREACOORD(object)]") if(isturf(object)) var/turf/T = object T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) @@ -41,13 +40,13 @@ qdel(object) return else if(istype(object,/turf) && alt_click && left_click) - log_admin("Build Mode: [key_name(c)] built an airlock at [AREACOORD(object)]") + log_admin("Build Mode: [key_name(target_client)] built an airlock at [AREACOORD(object)]") new/obj/machinery/door/airlock(get_turf(object)) else if(istype(object,/turf) && ctrl_click && left_click) var/obj/structure/window/reinforced/window - if(BM.build_dir == NORTHWEST) + if(BM.build_dir in GLOB.diagonals) window = new /obj/structure/window/reinforced/fulltile(get_turf(object)) else window = new /obj/structure/window/reinforced(get_turf(object)) - window.setDir(BM.build_dir) - log_admin("Build Mode: [key_name(c)] built a window at [AREACOORD(object)]") + window.setDir(BM.build_dir) + log_admin("Build Mode: [key_name(target_client)] built a window at [AREACOORD(object)]") diff --git a/code/modules/buildmode/submodes/boom.dm b/code/modules/buildmode/submodes/boom.dm index a8460956a0cf..f0837735c641 100644 --- a/code/modules/buildmode/submodes/boom.dm +++ b/code/modules/buildmode/submodes/boom.dm @@ -7,32 +7,33 @@ var/flash = -1 var/flames = -1 -/datum/buildmode_mode/boom/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Mouse Button on obj = Kaboom") - to_chat(c, "NOTE: Using the \"Config/Launch Supplypod\" verb allows you to do this in an IC way (i.e., making a cruise missile come down from the sky and explode wherever you click!)") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/boom/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Set explosion destructiveness")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Kaboom")] -> Mouse Button on obj\n\n\ + [span_warning("NOTE:")] Using the \"Config/Launch Supplypod\" verb allows you to do this in an IC way (i.e., making a cruise missile come down from the sky and explode wherever you click!)")) + ) -/datum/buildmode_mode/boom/change_settings(client/c) - devastation = input(c, "Range of total devastation. -1 to none", text("Input")) as num|null +/datum/buildmode_mode/boom/change_settings(client/target_client) + devastation = input(target_client, "Range of total devastation. -1 to none", text("Input")) as num|null if(devastation == null) devastation = -1 - heavy = input(c, "Range of heavy impact. -1 to none", text("Input")) as num|null + heavy = input(target_client, "Range of heavy impact. -1 to none", text("Input")) as num|null if(heavy == null) heavy = -1 - light = input(c, "Range of light impact. -1 to none", text("Input")) as num|null + light = input(target_client, "Range of light impact. -1 to none", text("Input")) as num|null if(light == null) light = -1 - flash = input(c, "Range of flash. -1 to none", text("Input")) as num|null + flash = input(target_client, "Range of flash. -1 to none", text("Input")) as num|null if(flash == null) flash = -1 - flames = input(c, "Range of flames. -1 to none", text("Input")) as num|null + flames = input(target_client, "Range of flames. -1 to none", text("Input")) as num|null if(flames == null) flames = -1 -/datum/buildmode_mode/boom/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/boom/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) explosion(object, devastation, heavy, light, flash, FALSE, TRUE, flames) - log_admin("Build Mode: [key_name(c)] caused an explosion(dev=[devastation], hvy=[heavy], lgt=[light], flash=[flash], flames=[flames]) at [AREACOORD(object)]") + log_admin("Build Mode: [key_name(target_client)] caused an explosion(dev=[devastation], hvy=[heavy], lgt=[light], flash=[flash], flames=[flames]) at [AREACOORD(object)]") diff --git a/code/modules/buildmode/submodes/copy.dm b/code/modules/buildmode/submodes/copy.dm index 7f189923b145..4ac7f9ec4796 100644 --- a/code/modules/buildmode/submodes/copy.dm +++ b/code/modules/buildmode/submodes/copy.dm @@ -6,21 +6,21 @@ stored = null return ..() -/datum/buildmode_mode/copy/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target") - to_chat(c, "Right Mouse Button on obj/mob = Select target to copy") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/copy/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Spawn a copy of selected target")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Select target to copy")] -> Right Mouse Button on obj/mob")) + ) -/datum/buildmode_mode/copy/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/copy/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) var/turf/T = get_turf(object) if(stored) DuplicateObject(stored, perfectcopy=1, sameloc=0,newloc=T) - log_admin("Build Mode: [key_name(c)] copied [stored] to [AREACOORD(object)]") + log_admin("Build Mode: [key_name(target_client)] copied [stored] to [AREACOORD(object)]") else if(LAZYACCESS(modifiers, RIGHT_CLICK)) if(ismovable(object)) // No copying turfs for now. - to_chat(c, "[object] set as template.") + to_chat(target_client, "[object] set as template.") stored = object diff --git a/code/modules/buildmode/submodes/delete.dm b/code/modules/buildmode/submodes/delete.dm new file mode 100644 index 000000000000..4ef4fe37156c --- /dev/null +++ b/code/modules/buildmode/submodes/delete.dm @@ -0,0 +1,61 @@ +/datum/buildmode_mode/delete + key = "delete" + +/datum/buildmode_mode/delete/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Delete an object")] -> Left Mouse Button on obj/turf/mob\n\ + [span_bold("Delete all objects of a type")] -> Right Mouse Button on obj/turf/mob")) + ) +/datum/buildmode_mode/delete/handle_click(client/target_client, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + if(left_click) + if(isturf(object)) + var/turf/T = object + T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + else if(isatom(object)) + qdel(object) + + if(right_click) + if(check_rights(R_DEBUG|R_SERVER)) //Prevents buildmoded non-admins from breaking everything. + if(isturf(object)) + return + var/atom/deleting = object + var/action_type = alert("Strict type ([deleting.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert("Are you really sure you want to delete all instances of type [deleting.type]?",,"Yes","No") != "Yes") + return + + if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") + return + + var/O_type = deleting.type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/atom/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type [O_type] ([i] instances deleted) ") + if("Type and subtypes") + var/i = 0 + for(var/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No instances of this type exist") + return + log_admin("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") + message_admins("[key_name(usr)] deleted all instances of type or subtype of [O_type] ([i] instances deleted) ") diff --git a/code/modules/buildmode/submodes/fill.dm b/code/modules/buildmode/submodes/fill.dm index c02c51835653..75f4f2d221b7 100644 --- a/code/modules/buildmode/submodes/fill.dm +++ b/code/modules/buildmode/submodes/fill.dm @@ -1,18 +1,19 @@ +#define FILL_WARNING_MIN 150 + /datum/buildmode_mode/fill key = "fill" use_corner_selection = TRUE - var/objholder = null - -/datum/buildmode_mode/fill/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button on turf/obj/mob = Select corner") - to_chat(c, "Left Mouse Button + Alt on turf/obj/mob = Delete region") - to_chat(c, "Right Mouse Button on buildmode button = Select object type") - to_chat(c, "***********************************************************") + var/atom/objholder = null -/datum/buildmode_mode/fill/change_settings(client/c) - var/target_path = input(c, "Enter typepath:" ,"Typepath","/obj/structure/closet") +/datum/buildmode_mode/fill/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Select corner")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Delete region")] -> Left Mouse Button + Alt on turf/obj/mob\n\ + [span_bold("Select object type")] -> Right Mouse Button on buildmode button")) + ) +/datum/buildmode_mode/fill/change_settings(client/target_client) + var/target_path = input(target_client, "Enter typepath:" ,"Typepath","/obj/structure/closet") objholder = text2path(target_path) if(!ispath(objholder)) objholder = pick_closest_path(target_path) @@ -23,16 +24,17 @@ objholder = null alert("Area paths are not supported for this mode, use the area edit mode instead.") return + BM.preview_selected_item(objholder) deselect_region() -/datum/buildmode_mode/fill/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/fill/handle_click(client/target_client, params, obj/object) if(isnull(objholder)) - to_chat(c, "Select an object type first.") + to_chat(target_client, "Select an object type first.") deselect_region() return ..() -/datum/buildmode_mode/fill/handle_selected_area(client/c, params) +/datum/buildmode_mode/fill/handle_selected_area(client/target_client, params) var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) //rectangular @@ -47,14 +49,26 @@ for(var/beep in deletion_area) var/turf/T = beep T.AfterChange() - log_admin("Build Mode: [key_name(c)] deleted turfs from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") + log_admin("Build Mode: [key_name(target_client)] deleted turfs from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") // if there's an analogous proc for this on tg lmk // empty_region(block(get_turf(cornerA),get_turf(cornerB))) else + var/selection_size = abs(cornerA.x - cornerB.x) * abs(cornerA.y - cornerB.y) + + if(selection_size > FILL_WARNING_MIN) // Confirm fill if the number of tiles in the selection is greater than FILL_WARNING_MIN + var/choice = alert("Your selected area is [selection_size] tiles! Continue?", "Large Fill Confirmation", "Yes", "No") + if(choice != "Yes") + return + for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB))) if(ispath(objholder,/turf)) - T.PlaceOnTop(objholder) + T = T.ChangeTurf(objholder) + T.setDir(BM.build_dir) + else if(ispath(objholder, /obj/effect/turf_decal)) + T.AddElement(/datum/element/decal, initial(objholder.icon), initial(objholder.icon_state), BM.build_dir, FALSE, initial(objholder.color), null, null, initial(objholder.alpha)) else var/obj/A = new objholder(T) A.setDir(BM.build_dir) - log_admin("Build Mode: [key_name(c)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") + log_admin("Build Mode: [key_name(target_client)] with path [objholder], filled the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") + +#undef FILL_WARNING_MIN diff --git a/code/modules/buildmode/submodes/map_export.dm b/code/modules/buildmode/submodes/map_export.dm index 983801154afa..3684aaca408c 100644 --- a/code/modules/buildmode/submodes/map_export.dm +++ b/code/modules/buildmode/submodes/map_export.dm @@ -7,24 +7,24 @@ var/save_flag = SAVE_ALL var/static/is_running = FALSE -/datum/buildmode_mode/export/change_settings(client/c) +/datum/buildmode_mode/export/change_settings(client/target_client) var/static/list/options = list("Object Saving" = SAVE_OBJECTS, "Mob Saving" = SAVE_MOBS, "Turf Saving" = SAVE_TURFS, "Area Saving" = SAVE_AREAS, "Space Turf Saving" = SAVE_SPACE, "Object Property Saving" = SAVE_OBJECT_PROPERTIES) - var/what_to_change = tgui_input_list(c, "What export setting would you like to toggle?", "Map Exporter", options) + var/what_to_change = tgui_input_list(target_client, "What export setting would you like to toggle?", "Map Exporter", options) save_flag ^= options[what_to_change] - to_chat(c, "[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"].") + to_chat(target_client, "[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"].") -/datum/buildmode_mode/export/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button on turf/obj/mob = Select corner") - to_chat(c, "Right Mouse Button on buildmode button = Set export options") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/export/show_help(client/target_client) + to_chat(target_client, "***********************************************************") + to_chat(target_client, "Left Mouse Button on turf/obj/mob = Select corner") + to_chat(target_client, "Right Mouse Button on buildmode button = Set export options") + to_chat(target_client, "***********************************************************") -/datum/buildmode_mode/export/handle_selected_area(client/c, params) +/datum/buildmode_mode/export/handle_selected_area(client/target_client, params) var/list/modifiers = params2list(params) //Ensure the selection is actually done @@ -53,7 +53,7 @@ to_chat(usr, "Saving, please wait...") is_running = TRUE - log_admin("Build Mode: [key_name(c)] is exporting the map area from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") //I put this before the actual saving of the map because it likely won't log if it crashes the fucking server + log_admin("Build Mode: [key_name(target_client)] is exporting the map area from [AREACOORD(cornerA)] through [AREACOORD(cornerB)]") //I put this before the actual saving of the map because it likely won't log if it crashes the fucking server //oversimplified for readability and understandibility diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm new file mode 100644 index 000000000000..56faf5d507cc --- /dev/null +++ b/code/modules/buildmode/submodes/outfit.dm @@ -0,0 +1,44 @@ +/datum/buildmode_mode/outfit + key = "outfit" + var/datum/outfit/dressuptime + +/datum/buildmode_mode/outfit/Destroy() + dressuptime = null + return ..() + +/datum/buildmode_mode/outfit/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Select outfit to equip")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Equip the selected outfit")] -> Left Mouse Button on mob/living/carbon/human\n\ + [span_bold("Strip and delete current outfit")] -> Right Mouse Button on mob/living/carbon/human")) + ) + +/datum/buildmode_mode/outfit/Reset() + . = ..() + dressuptime = null + +/datum/buildmode_mode/outfit/change_settings(client/target_client) + dressuptime = target_client.robust_dress_shop() + +/datum/buildmode_mode/outfit/handle_click(client/target_client, params, object) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") + var/right_click = pa.Find("right") + + if(!ishuman(object)) + return + var/mob/living/carbon/human/dollie = object + + if(left_click) + if(isnull(dressuptime)) + to_chat(target_client, "Pick an outfit first.") + return + + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) + if(dressuptime != "Naked") + dollie.equipOutfit(dressuptime) + + if(right_click) + for (var/item in dollie.get_equipped_items(TRUE)) + qdel(item) diff --git a/code/modules/buildmode/submodes/proccall.dm b/code/modules/buildmode/submodes/proccall.dm new file mode 100644 index 000000000000..47e7130aa386 --- /dev/null +++ b/code/modules/buildmode/submodes/proccall.dm @@ -0,0 +1,49 @@ +/datum/buildmode_mode/proccall + key = "proccall" + ///The procedure itself, which we will call in the future. For example "qdel" + var/proc_name = null + ///The list of arguments for the procedure. They may not be. They are selected in the same way in the game, and can be a datum, and other types. + var/list/proc_args = null + +/datum/buildmode_mode/proccall/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Choose procedure and arguments")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Apply procedure on object")] -> Left Mouse Button on machinery")) + ) + +/datum/buildmode_mode/proccall/change_settings(client/target_client) + if(!check_rights_for(target_client, R_DEBUG)) + return + + proc_name = input("Proc name, eg: fake_blood", "Proc:", null) as text|null + if(!proc_name) + return + + proc_args = target_client.get_callproc_args() + if(!proc_args) + return + +/datum/buildmode_mode/proccall/handle_click(client/target_client, params, datum/object as null|area|mob|obj|turf) + if(!proc_name || !proc_args) + tgui_alert(target_client, "Undefined ProcCall or arguments.") + return + + if(!hascall(object, proc_name)) + to_chat(target_client, span_warning("Error: callproc_datum(): type [object.type] has no proc named [proc_name]."), confidential = TRUE) + return + + if(!is_valid_src(object)) + to_chat(target_client, span_warning("Error: callproc_datum(): owner of proc no longer exists."), confidential = TRUE) + return + + + var/msg = "[key_name(target_client)] called [object]'s [proc_name]() with [proc_args.len ? "the arguments [list2params(proc_args)]":"no arguments"]." + log_admin(msg) + message_admins(msg) + admin_ticket_log(object, msg) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + var/returnval = WrapAdminProcCall(object, proc_name, proc_args) // Pass the lst as an argument list to the proc + . = target_client.get_callproc_returnval(returnval, proc_name) + if(.) + to_chat(target_client, ., confidential = TRUE) diff --git a/code/modules/buildmode/submodes/throwing.dm b/code/modules/buildmode/submodes/throwing.dm index c2e6a0029c50..0539d2ec4f9f 100644 --- a/code/modules/buildmode/submodes/throwing.dm +++ b/code/modules/buildmode/submodes/throwing.dm @@ -7,21 +7,21 @@ throw_atom = null return ..() -/datum/buildmode_mode/throwing/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Left Mouse Button on turf/obj/mob = Select") - to_chat(c, "Right Mouse Button on turf/obj/mob = Throw") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/throwing/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Select")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Throw")] -> Right Mouse Button on turf/obj/mob")) + ) -/datum/buildmode_mode/throwing/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/throwing/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) if(isturf(object)) return throw_atom = object - to_chat(c, "Selected object '[throw_atom]'") + to_chat(target_client, "Selected object '[throw_atom]'") if(LAZYACCESS(modifiers, RIGHT_CLICK)) if(throw_atom) - throw_atom.throw_at(object, 10, 1, c.mob) - log_admin("Build Mode: [key_name(c)] threw [throw_atom] at [object] ([AREACOORD(object)])") + throw_atom.throw_at(object, 10, 1, target_client.mob) + log_admin("Build Mode: [key_name(target_client)] threw [throw_atom] at [object] ([AREACOORD(object)])") diff --git a/code/modules/buildmode/submodes/tweakcomps.dm b/code/modules/buildmode/submodes/tweakcomps.dm new file mode 100644 index 000000000000..4072f8dd8f2f --- /dev/null +++ b/code/modules/buildmode/submodes/tweakcomps.dm @@ -0,0 +1,34 @@ +/datum/buildmode_mode/tweakcomps + key = "tweakcomps" + /// This variable is responsible for the rating of the components themselves. Literally tiers of components, where 1 is standard, 4 is bluespace. + var/rating = null + +/datum/buildmode_mode/tweakcomps/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Choose the rating of the components")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Sets the chosen rating of the components on the machinery")] -> Left Mouse Button on machinery")) + ) + +/datum/buildmode_mode/tweakcomps/change_settings(client/target_client) + var/rating_to_choose = input(target_client, "Enter number of rating", "Number", "1") + rating_to_choose = text2num(rating_to_choose) + if(!isnum(rating_to_choose)) + tgui_alert(target_client, "Input a number.") + return + + rating = rating_to_choose + +/datum/buildmode_mode/tweakcomps/handle_click(client/target_client, params, obj/machinery/object) + if(!ismachinery(object)) + to_chat(target_client, span_warning("This isn't machinery!")) + return + + if(!object.component_parts) + to_chat(target_client, span_warning("This machinery doesn't have components!")) + return + + for(var/obj/item/stock_parts/P in object.component_parts) + P.rating = rating + object.RefreshParts() + + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Machine Upgrade", "[rating]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/buildmode/submodes/variable_edit.dm b/code/modules/buildmode/submodes/variable_edit.dm index b03740e653bb..728c909860b5 100644 --- a/code/modules/buildmode/submodes/variable_edit.dm +++ b/code/modules/buildmode/submodes/variable_edit.dm @@ -9,52 +9,52 @@ valueholder = null return ..() -/datum/buildmode_mode/varedit/show_help(client/c) - to_chat(c, "***********************************************************") - to_chat(c, "Right Mouse Button on buildmode button = Select var(type) & value") - to_chat(c, "Left Mouse Button on turf/obj/mob = Set var(type) & value") - to_chat(c, "Right Mouse Button on turf/obj/mob = Reset var's value") - to_chat(c, "***********************************************************") +/datum/buildmode_mode/varedit/show_help(client/target_client) + to_chat(target_client, span_purple(examine_block( + "[span_bold("Select var(type) & value")] -> Right Mouse Button on buildmode button\n\ + [span_bold("Set var(type) & value")] -> Left Mouse Button on turf/obj/mob\n\ + [span_bold("Reset var's value")] -> Right Mouse Button on turf/obj/mob")) + ) /datum/buildmode_mode/varedit/Reset() . = ..() varholder = null valueholder = null -/datum/buildmode_mode/varedit/change_settings(client/c) - varholder = input(c, "Enter variable name:" ,"Name", "name") +/datum/buildmode_mode/varedit/change_settings(client/target_client) + varholder = input(target_client, "Enter variable name:" ,"Name", "name") if(!vv_varname_lockcheck(varholder)) return - var/temp_value = c.vv_get_value() + var/temp_value = target_client.vv_get_value() if(isnull(temp_value["class"])) Reset() - to_chat(c, "Variable unset.") + to_chat(target_client, "Variable unset.") return valueholder = temp_value["value"] -/datum/buildmode_mode/varedit/handle_click(client/c, params, obj/object) +/datum/buildmode_mode/varedit/handle_click(client/target_client, params, obj/object) var/list/modifiers = params2list(params) if(isnull(varholder)) - to_chat(c, "Choose a variable to modify first.") + to_chat(target_client, "Choose a variable to modify first.") return if(LAZYACCESS(modifiers, LEFT_CLICK)) if(object.vars.Find(varholder)) if(object.vv_edit_var(varholder, valueholder) == FALSE) - to_chat(c, "Your edit was rejected by the object.") + to_chat(target_client, "Your edit was rejected by the object.") return - log_admin("Build Mode: [key_name(c)] modified [object.name]'s [varholder] to [valueholder]") + log_admin("Build Mode: [key_name(target_client)] modified [object.name]'s [varholder] to [valueholder]") else - to_chat(c, "[initial(object.name)] does not have a var called '[varholder]'") + to_chat(target_client, "[initial(object.name)] does not have a var called '[varholder]'") if(LAZYACCESS(modifiers, RIGHT_CLICK)) if(object.vars.Find(varholder)) var/reset_value = initial(object.vars[varholder]) if(object.vv_edit_var(varholder, reset_value) == FALSE) - to_chat(c, "Your edit was rejected by the object.") + to_chat(target_client, "Your edit was rejected by the object.") return - log_admin("Build Mode: [key_name(c)] modified [object.name]'s [varholder] to [reset_value]") + log_admin("Build Mode: [key_name(target_client)] modified [object.name]'s [varholder] to [reset_value]") else - to_chat(c, "[initial(object.name)] does not have a var called '[varholder]'") + to_chat(target_client, "[initial(object.name)] does not have a var called '[varholder]'") diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 3e5938bbaa55..c0c316a1354a 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -1,3 +1,10 @@ +#define TAB_POD 0 //Used to check if the UIs built in camera is looking at the pod +#define TAB_BAY 1 //Used to check if the UIs built in camera is looking at the launch bay area + +#define LAUNCH_ALL 0 //Used to check if we're launching everything from the bay area at once +#define LAUNCH_ORDERED 1 //Used to check if we're launching everything from the bay area in order +#define LAUNCH_RANDOM 2 //Used to check if we're launching everything from the bay area randomly + //The Great and Mighty CentCom Pod Launcher - MrDoomBringer //This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more //features such as item removal, smiting, controllable delivery mobs, and more. @@ -13,19 +20,21 @@ set name = "Config/Launch Supplypod" set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" set category = "Admin.Events" - var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum - plaunch.ui_interact(usr)//datum has a tgui component, here we open the window + new /datum/centcom_podlauncher(usr)//create the datum //Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc //Some effect groups are choices, while other are booleans. This is because some effects can stack, while others dont (ex: you can stack explosion and quiet, but you cant stack ordered launch and random launch) /datum/centcom_podlauncher - var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/DPtarget, /obj/effect/supplypod_selector)) + var/static/list/ignored_atoms = typecacheof(list(null, /mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object, /obj/effect/particle_effect/sparks, /obj/effect/pod_landingzone, /obj/effect/hallucination/simple/supplypod_selector, /obj/effect/hallucination/simple/dropoff_location)) var/turf/oldTurf //Keeps track of where the user was at if they use the "teleport to centcom" button, so they can go back var/client/holder //client of whoever is using this datum - var/area/bay //What bay we're using to launch shit from. + var/area/centcom/supplypod/loading/bay //What bay we're using to launch shit from. + var/bayNumber //Quick reference to what bay we're in. Usually set to the loading_id variable for the related area type + var/customDropoff = FALSE + var/picking_dropoff_turf = FALSE var/launchClone = FALSE //If true, then we don't actually launch the thing in the bay. Instead we call duplicateObject() and send the result + var/launchChoice = LAUNCH_RANDOM //Determines if we launch all at once (0) , in order (1), or at random(2) var/launchRandomItem = FALSE //If true, lauches a single random item instead of everything on a turf. - var/launchChoice = 1 //Determines if we launch all at once (0) , in order (1), or at random(2) var/explosionChoice = 0 //Determines if there is no explosion (0), custom explosion (1), or just do a maxcap (2) var/damageChoice = 0 //Determines if we do no damage (0), custom amnt of damage (1), or gib + 5000dmg (2) var/launcherActivated = FALSE //check if we've entered "launch mode" (when we click a pod is launched). Used for updating mouse cursor @@ -37,57 +46,126 @@ var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1) var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs - var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/supplypod_selector/selector //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) + var/obj/effect/hallucination/simple/dropoff_location/indicator var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched -/datum/centcom_podlauncher/New(H)//H can either be a client or a mob due to byondcode(tm) - if (istype(H,/client)) - var/client/C = H - holder = C //if its a client, assign it to holder + // Stuff needed to render the map + var/map_name + var/atom/movable/screen/map_view/cam_screen + var/list/cam_plane_masters + var/atom/movable/screen/background/cam_background + var/tabIndex = 1 + var/renderLighting = FALSE + +/datum/centcom_podlauncher/New(user) //user can either be a client or a mob + if (user) //Prevents runtimes on datums being made without clients + setup(user) + +/datum/centcom_podlauncher/proc/setup(user) //H can either be a client or a mob + if (istype(user,/client)) + var/client/user_client = user + holder = user_client //if its a client, assign it to holder else - var/mob/M = H - holder = M.client //if its a mob, assign the mob's client to holder + var/mob/user_mob = user + holder = user_mob.client //if its a mob, assign the mob's client to holder bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map - temp_pod = new(locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) + bayNumber = bay.loading_id //Used as quick reference to what bay we're taking items from + var/area/pod_storage_area = locate(/area/centcom/supplypod/pod_storage) in GLOB.sortedAreas + temp_pod = new(pick(get_area_turfs(pod_storage_area))) //Create a new temp_pod in the podStorage area on centcom (so users are free to look at it and change other variables if needed) orderedArea = createOrderedArea(bay) //Order all the turfs in the selected bay (top left to bottom right) to a single list. Used for the "ordered" mode (launchChoice = 1) + selector = new(null, holder.mob) + indicator = new(null, holder.mob) + setDropoff(bay) + initMap() + refreshBay() + ui_interact(holder.mob) + +/datum/centcom_podlauncher/proc/initMap() + if(map_name) + holder.clear_map(map_name) + + map_name = "admin_supplypod_bay_[REF(src)]_map" + // Initialize map objects + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = TRUE + cam_screen.screen_loc = "[map_name]:1,1" + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() + if (!renderLighting && instance.plane == LIGHTING_PLANE) + instance.alpha = 100 + instance.assigned_map = map_name + instance.del_on_map_removal = TRUE + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters += instance + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = TRUE + refreshView() + holder.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + holder.register_map_obj(plane) + holder.register_map_obj(cam_background) /datum/centcom_podlauncher/ui_state(mob/user) + if (SSticker.current_state >= GAME_STATE_FINISHED) + return GLOB.always_state //Allow the UI to be given to players by admins after roundend return GLOB.admin_state +/datum/centcom_podlauncher/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/supplypods), + ) + /datum/centcom_podlauncher/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) + // Open UI ui = new(user, src, "CentcomPodLauncher") ui.open() + refreshView() + +/datum/centcom_podlauncher/ui_static_data(mob/user) + var/list/data = list() + data["mapRef"] = map_name + data["defaultSoundVolume"] = initial(temp_pod.soundVolume) //default volume for pods + return data /datum/centcom_podlauncher/ui_data(mob/user) //Sends info about the pod to the UI. var/list/data = list() //*****NOTE*****: Many of these comments are similarly described in supplypod.dm. If you change them here, please consider doing so in the supplypod code as well! - var/B = (istype(bay, /area/centcom/supplypod/loading/one)) ? 1 : (istype(bay, /area/centcom/supplypod/loading/two)) ? 2 : (istype(bay, /area/centcom/supplypod/loading/three)) ? 3 : (istype(bay, /area/centcom/supplypod/loading/four)) ? 4 : (istype(bay, /area/centcom/supplypod/loading/ert)) ? 5 : 0 //top ten THICCEST FUCKING TERNARY CONDITIONALS OF 2036 - data["bay"] = bay //Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. - data["bayNumber"] = B //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract + bayNumber = bay?.loading_id //Used as quick reference to what bay we're taking items from + data["bayNumber"] = bayNumber //Holds the bay as a number. Useful for comparisons in centcom_podlauncher.ract data["oldArea"] = (oldTurf ? get_area(oldTurf) : null) //Holds the name of the area that the user was in before using the teleportCentcom action + data["picking_dropoff_turf"] = picking_dropoff_turf //If we're picking or have picked a dropoff turf. Only works when pod is in reverse mode + data["customDropoff"] = customDropoff + data["renderLighting"] = renderLighting data["launchClone"] = launchClone //Do we launch the actual items in the bay or just launch clones of them? data["launchRandomItem"] = launchRandomItem //Do we launch a single random item instead of everything on the turf? data["launchChoice"] = launchChoice //Launch turfs all at once (0), ordered (1), or randomly(1) data["explosionChoice"] = explosionChoice //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) data["damageChoice"] = damageChoice //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) - data["fallDuration"] = temp_pod.fallDuration //How long the pod's falling animation lasts - data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching - data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing - data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) - data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["delays"] = temp_pod.delays + data["rev_delays"] = temp_pod.reverse_delays + data["custom_rev_delay"] = temp_pod.custom_rev_delay + data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands data["effectOrgans"] = temp_pod.effectOrgans //If true, yeets the organs out of any bodies caught under the pod when it lands data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing - data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isnt displayed on the turf where the pod will land + data["effectStealth"] = temp_pod.effectStealth //If true, a target icon isn't displayed on the turf where the pod will land data["effectQuiet"] = temp_pod.effectQuiet //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) data["effectMissile"] = temp_pod.effectMissile //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground data["effectCircle"] = temp_pod.effectCircle //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here data["effectBurst"] = effectBurst //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area data["effectReverse"] = temp_pod.reversing //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + data["reverseOptionList"] = temp_pod.reverseOptionList data["effectTarget"] = specificTarget //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites data["effectName"] = temp_pod.adminNamed //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + data["podName"] = temp_pod.name + data["podDesc"] = temp_pod.desc data["effectAnnounce"] = effectAnnounce data["giveLauncher"] = launcherActivated //If true, the user is in launch mode, and whenever they click a pod will be launched (either at their mouse position or at a specific target) data["numObjects"] = numTurfs //Counts the number of turfs that contain a launchable object in the centcom supplypod bay @@ -95,7 +173,7 @@ data["landingSound"] = temp_pod.landingSound //Admin sound to play when the pod lands data["openingSound"] = temp_pod.openingSound //Admin sound to play when the pod opens data["leavingSound"] = temp_pod.leavingSound //Admin sound to play when the pod leaves - data["soundVolume"] = temp_pod.soundVolume != initial(temp_pod.soundVolume) //Admin sound to play when the pod leaves + data["soundVolume"] = temp_pod.soundVolume //Admin sound to play when the pod leaves return data /datum/centcom_podlauncher/ui_act(action, params) @@ -104,49 +182,72 @@ return switch(action) ////////////////////////////UTILITIES////////////////// - if("bay1") - bay = locate(/area/centcom/supplypod/loading/one) in GLOB.sortedAreas //set the "bay" variable to the corresponding room in centcom - refreshBay() //calls refreshBay() which "recounts" the bay to see what items we can launch (among other things). - . = TRUE - if("bay2") - bay = locate(/area/centcom/supplypod/loading/two) in GLOB.sortedAreas + if("gamePanel") + holder.holder.Game() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + . = TRUE + if("buildMode") + var/mob/holder_mob = holder.mob + if (holder_mob) + togglebuildmode(holder_mob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Build Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + . = TRUE + if("loadDataFromPreset") + var/list/savedData = params["payload"] + loadData(savedData) + . = TRUE + if("switchBay") + bayNumber = params["bayNumber"] refreshBay() . = TRUE - if("bay3") - bay = locate(/area/centcom/supplypod/loading/three) in GLOB.sortedAreas - refreshBay() - . = TRUE - if("bay4") - bay = locate(/area/centcom/supplypod/loading/four) in GLOB.sortedAreas - refreshBay() + if("pickDropoffTurf") //Enters a mode that lets you pick the dropoff location for reverse pods + if (picking_dropoff_turf) + picking_dropoff_turf = FALSE + updateCursor() //Update the cursor of the user to a cool looking target icon + return + if (launcherActivated) + launcherActivated = FALSE //We don't want to have launch mode enabled while we're picking a turf + picking_dropoff_turf = TRUE + updateCursor() //Update the cursor of the user to a cool looking target icon . = TRUE - if("bay5") - bay = locate(/area/centcom/supplypod/loading/ert) in GLOB.sortedAreas - refreshBay() + if("clearDropoffTurf") + setDropoff(bay) + customDropoff = FALSE + picking_dropoff_turf = FALSE + updateCursor() . = TRUE - if("teleportCentcom") //Teleports the user to the centcom supply loading facility. + if("teleportDropoff") //Teleports the user to the dropoff point. var/mob/M = holder.mob //We teleport whatever mob the client is attached to at the point of clicking - oldTurf = get_turf(M) //Used for the "teleportBack" action - var/area/A = locate(bay) in GLOB.sortedAreas - var/list/turfs = list() - for(var/turf/T in A) - turfs.Add(T) //Fill a list with turfs in the area - if (!length(turfs)) //If the list is empty, error and cancel - to_chat(M, "Nowhere to jump to!") - return //Only teleport if the list isn't empty - var/turf/T = pick(turfs) - M.forceMove(T) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(A)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(A)]") + var/turf/current_location = get_turf(M) + var/list/coordinate_list = temp_pod.reverse_dropoff_coords + var/turf/dropoff_turf = locate(coordinate_list[1], coordinate_list[2], coordinate_list[3]) + if (current_location != dropoff_turf) + oldTurf = current_location + M.forceMove(dropoff_turf) //Perform the actual teleport + log_admin("[key_name(usr)] jumped to [AREACOORD(dropoff_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(dropoff_turf)]") . = TRUE - if("teleportBack") //After teleporting to centcom, this button allows the user to teleport to the last spot they were at. + if("teleportCentcom") //Teleports the user to the centcom supply loading facility. + var/mob/holder_mob = holder.mob //We teleport whatever mob the client is attached to at the point of clicking + var/turf/current_location = get_turf(holder_mob) + var/area/bay_area = bay + if (current_location.loc != bay_area) + oldTurf = current_location + var/turf/teleport_turf = pick(get_area_turfs(bay_area)) + holder_mob.forceMove(teleport_turf) //Perform the actual teleport + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(teleport_turf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(teleport_turf)]") + . = TRUE + if("teleportBack") //After teleporting to centcom/dropoff, this button allows the user to teleport to the last spot they were at. var/mob/M = holder.mob if (!oldTurf) //If theres no turf to go back to, error and cancel to_chat(M, "Nowhere to jump to!") return M.forceMove(oldTurf) //Perform the actual teleport - log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") - message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") + if (holder.holder) + log_admin("[key_name(usr)] jumped to [AREACOORD(oldTurf)]") + message_admins("[key_name_admin(usr)] jumped to [AREACOORD(oldTurf)]") . = TRUE ////////////////////////////LAUNCH STYLE CHANGES////////////////// @@ -154,22 +255,21 @@ launchClone = !launchClone . = TRUE if("launchRandomItem") //Pick random turfs from the supplypod bay at centcom to launch - launchRandomItem = !launchRandomItem + launchRandomItem = TRUE + . = TRUE + if("launchWholeTurf") //Pick random turfs from the supplypod bay at centcom to launch + launchRandomItem = FALSE + . = TRUE + if("launchAll") //Launch turfs (from the orderedArea list) all at once, from the supplypod bay at centcom + launchChoice = LAUNCH_ALL + updateSelector() . = TRUE if("launchOrdered") //Launch turfs (from the orderedArea list) one at a time in order, from the supplypod bay at centcom - if (launchChoice == 1) //launchChoice 1 represents ordered. If we push "ordered" and it already is, then we go to default value - launchChoice = 0 - updateSelector() //Move the selector effect to the next object that will be launched. See variable declarations for more info on the selector effect. - return - launchChoice = 1 + launchChoice = LAUNCH_ORDERED updateSelector() . = TRUE if("launchRandomTurf") //Pick random turfs from the supplypod bay at centcom to launch - if (launchChoice == 2) - launchChoice = 0 - updateSelector() - return - launchChoice = 2 + launchChoice = LAUNCH_RANDOM updateSelector() . = TRUE @@ -182,11 +282,11 @@ var/list/expNames = list("Devastation", "Heavy Damage", "Light Damage", "Flame") //Explosions have a range of different types of damage var/list/boomInput = list() for (var/i=1 to expNames.len) //Gather input from the user for the value of each type of damage - boomInput.Add(input("[expNames[i]] Range", "Enter the [expNames[i]] range of the explosion. WARNING: This ignores the bomb cap!", 0) as null|num) + boomInput.Add(input("Enter the [expNames[i]] range of the explosion. WARNING: This ignores the bomb cap!", "[expNames[i]] Range", 0) as null|num) if (isnull(boomInput[i])) return if (!isnum(boomInput[i])) //If the user doesn't input a number, set that specific explosion value to zero - alert(usr, "That wasnt a number! Value set to default (zero) instead.") + alert(usr, "That wasn't a number! Value set to default (zero) instead.") boomInput = 0 explosionChoice = 1 temp_pod.explosionSize = boomInput @@ -204,11 +304,11 @@ damageChoice = 0 temp_pod.damage = 0 return - var/damageInput = input("How much damage to deal", "Enter the amount of brute damage dealt by getting hit", 0) as null|num + var/damageInput = input("Enter the amount of brute damage dealt by getting hit","How much damage to deal", 0) as null|num if (isnull(damageInput)) return if (!isnum(damageInput)) //Sanitize the input for damage to deal.s - alert(usr, "That wasnt a number! Value set to default (zero) instead.") + alert(usr, "That wasn't a number! Value set to default (zero) instead.") damageInput = 0 damageChoice = 1 temp_pod.damage = damageInput @@ -228,10 +328,10 @@ temp_pod.adminNamed = FALSE temp_pod.setStyle(temp_pod.style) //This resets the name of the pod based on it's current style (see supplypod/setStyle() proc) return - var/nameInput= input("Custom name", "Enter a custom name", POD_STYLES[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc + var/nameInput= input("Custom name", "Enter a custom name", GLOB.podstyles[temp_pod.style][POD_NAME]) as null|text //Gather input for name and desc if (isnull(nameInput)) return - var/descInput = input("Custom description", "Enter a custom desc", POD_STYLES[temp_pod.style][POD_DESC]) as null|text //The POD_STYLES is used to get the name, desc, or icon state based on the pod's style + var/descInput = input("Custom description", "Enter a custom desc", GLOB.podstyles[temp_pod.style][POD_DESC]) as null|text //The GLOB.podstyles is used to get the name, desc, or icon state based on the pod's style if (isnull(descInput)) return temp_pod.name = nameInput @@ -270,6 +370,14 @@ . = TRUE if("effectReverse") //Toggle: Don't send any items. Instead, after landing, close (taking any objects inside) and go back to the centcom bay it came from temp_pod.reversing = !temp_pod.reversing + if (temp_pod.reversing) + indicator.alpha = 150 + else + indicator.alpha = 0 + . = TRUE + if("reverseOption") + var/reverseOption = params["reverseOption"] + temp_pod.reverseOptionList[reverseOption] = !temp_pod.reverseOptionList[reverseOption] . = TRUE if("effectTarget") //Toggle: Launch at a specific mob (instead of at whatever turf you click on). Used for the supplypod smite if (specificTarget) @@ -284,71 +392,50 @@ . = TRUE ////////////////////////////TIMER DELAYS////////////////// - if("fallDuration") //Change the time it takes the pod to land, after firing - if (temp_pod.fallDuration != initial(temp_pod.fallDuration)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.fallDuration = initial(temp_pod.fallDuration) - return - var/timeInput = input("Enter the duration of the pod's falling animation, in seconds", "Delay Time", initial(temp_pod.fallDuration) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallDuration)*0.1]) instead.") - timeInput = initial(temp_pod.fallDuration) - temp_pod.fallDuration = 10 * timeInput - . = TRUE - if("landingDelay") //Change the time it takes the pod to land, after firing - if (temp_pod.landingDelay != initial(temp_pod.landingDelay)) //If the landing delay has already been changed when we push the "change value" button, then set it to default - temp_pod.landingDelay = initial(temp_pod.landingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to land, in seconds", "Delay Time", initial(temp_pod.landingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input, if it doesnt check out, error and set to default - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.landingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.landingDelay) - temp_pod.landingDelay = 10 * timeInput - . = TRUE - if("openingDelay") //Change the time it takes the pod to open it's door (and release its contents) after landing - if (temp_pod.openingDelay != initial(temp_pod.openingDelay)) //If the opening delay has already been changed when we push the "change value" button, then set it to default - temp_pod.openingDelay = initial(temp_pod.openingDelay) - return - var/timeInput = input("Enter the time it takes for the pod to open after landing, in seconds", "Delay Time", initial(temp_pod.openingDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) //Sanitize input - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.openingDelay)*0.1]) instead.") - timeInput = initial(temp_pod.openingDelay) - temp_pod.openingDelay = 10 * timeInput - . = TRUE - if("departureDelay") //Change the time it takes the pod to leave (if bluespace = true it just deletes, if effectReverse = true it goes back to centcom) - if (temp_pod.departureDelay != initial(temp_pod.departureDelay)) //If the departure delay has already been changed when we push the "change value" button, then set it to default - temp_pod.departureDelay = initial(temp_pod.departureDelay) - return - var/timeInput = input("Enter the time it takes for the pod to leave after opening, in seconds", "Delay Time", initial(temp_pod.departureDelay) * 0.1) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.departureDelay)*0.1]) instead.") - timeInput = initial(temp_pod.departureDelay) - temp_pod.departureDelay = 10 * timeInput + if("editTiming") //Change the different timers relating to the pod + var/delay = params["timer"] + var/value = params["value"] + var/reverse = params["reverse"] + if (reverse) + temp_pod.reverse_delays[delay] = value * 10 + else + temp_pod.delays[delay] = value * 10 + . = TRUE + if("resetTiming") + temp_pod.delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + temp_pod.reverse_delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + . = TRUE + if("toggleRevDelays") + temp_pod.custom_rev_delay = !temp_pod.custom_rev_delay . = TRUE - ////////////////////////////ADMIN SOUNDS////////////////// if("fallingSound") //Admin sound from a local file that plays when the pod lands if ((temp_pod.fallingSound) != initial(temp_pod.fallingSound)) temp_pod.fallingSound = initial(temp_pod.fallingSound) temp_pod.fallingSoundLength = initial(temp_pod.fallingSoundLength) return - var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! NOTICE: Take a note of exactly how long the sound is.", "Pick a Sound File") as null|sound + var/soundInput = input(holder, "Please pick a sound file to play when the pod lands! Sound will start playing and try to end when the pod lands", "Pick a Sound File") as null|sound if (isnull(soundInput)) return - var/timeInput = input(holder, "What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num - if (isnull(timeInput)) - return - if (!isnum(timeInput)) - alert(usr, "That wasnt a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") + var/sound/tempSound = sound(soundInput) + playsound(holder.mob, tempSound, 1) + var/list/sounds_list = holder.SoundQuery() + var/soundLen = 0 + for (var/playing_sound in sounds_list) + if (isnull(playing_sound)) + stack_trace("client.SoundQuery() Returned a list containing a null sound! Somehow!") + continue + var/sound/found = playing_sound + if (found.file == tempSound.file) + soundLen = found.len + if (!soundLen) + soundLen = input(holder, "Couldn't auto-determine sound file length. What is the exact length of the sound file, in seconds. This number will be used to line the sound up so that it finishes right as the pod lands!", "Pick a Sound File", 0.3) as null|num + if (isnull(soundLen)) + return + if (!isnum(soundLen)) + alert(usr, "That wasn't a number! Value set to default ([initial(temp_pod.fallingSoundLength)*0.1]) instead.") temp_pod.fallingSound = soundInput - temp_pod.fallingSoundLength = 10 * timeInput + temp_pod.fallingSoundLength = 10 * soundLen . = TRUE if("landingSound") //Admin sound from a local file that plays when the pod lands if (!isnull(temp_pod.landingSound)) @@ -387,53 +474,32 @@ temp_pod.soundVolume = soundInput . = TRUE ////////////////////////////STYLE CHANGES////////////////// - //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) + //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the GLOB.podstyles list (in cargo.dm defines) //as a way to get the proper icon state, name, and description of the pod. - if("styleStandard") - temp_pod.setStyle(STYLE_STANDARD) - . = TRUE - if("styleBluespace") - temp_pod.setStyle(STYLE_BLUESPACE) - . = TRUE - if("styleSyndie") - temp_pod.setStyle(STYLE_SYNDICATE) - . = TRUE - if("styleBlue") - temp_pod.setStyle(STYLE_BLUE) - . = TRUE - if("styleCult") - temp_pod.setStyle(STYLE_CULT) - . = TRUE - if("styleMissile") - temp_pod.setStyle(STYLE_MISSILE) - . = TRUE - if("styleSMissile") - temp_pod.setStyle(STYLE_RED_MISSILE) - . = TRUE - if("styleBox") - temp_pod.setStyle(STYLE_BOX) + if("tabSwitch") + tabIndex = params["tabIndex"] + refreshView() . = TRUE - if("styleHONK") - temp_pod.setStyle(STYLE_HONK) + if("refreshView") + initMap() + refreshView() . = TRUE - if("styleFruit") - temp_pod.setStyle(STYLE_FRUIT) + if("renderLighting") + renderLighting = !renderLighting . = TRUE - if("styleInvisible") - temp_pod.setStyle(STYLE_INVISIBLE) - . = TRUE - if("styleGondola") - temp_pod.setStyle(STYLE_GONDOLA) - . = TRUE - if("styleSeeThrough") - temp_pod.setStyle(STYLE_SEETHROUGH) + if("setStyle") + var/chosenStyle = params["style"] + temp_pod.setStyle(chosenStyle+1) . = TRUE if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod refreshBay() . = TRUE if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) launcherActivated = !launcherActivated - updateCursor(launcherActivated) //Update the cursor of the user to a cool looking target icon + if (picking_dropoff_turf) + picking_dropoff_turf = FALSE //We don't want to have launch mode enabled while we're picking a turf + updateCursor() //Update the cursor of the user to a cool looking target icon + updateSelector() . = TRUE if("clearBay") //Delete all mobs and objs in the selected bay if(alert(usr, "This will delete all objs and mobs in [bay]. Are you sure?", "Confirmation", "Delete that shit", "No") == "Delete that shit") @@ -441,30 +507,59 @@ refreshBay() . = TRUE -/datum/centcom_podlauncher/ui_close() //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. +/datum/centcom_podlauncher/ui_close(mob/user) //Uses the destroy() proc. When the user closes the UI, we clean up the temp_pod and supplypod_selector variables. + QDEL_NULL(temp_pod) + user.client?.clear_map(map_name) + QDEL_NULL(cam_screen) + QDEL_LIST(cam_plane_masters) + QDEL_NULL(cam_background) qdel(src) -/datum/centcom_podlauncher/proc/updateCursor(launching) //Update the moues of the user - if (holder) //Check to see if we have a client - if (launching) //If the launching param is true, we give the user new mouse icons. +/datum/centcom_podlauncher/proc/setupViewPod() + setupView(RANGE_TURFS(2, temp_pod)) + +/datum/centcom_podlauncher/proc/setupViewBay() + var/list/visible_turfs = list() + for(var/turf/bay_turf in bay) + visible_turfs += bay_turf + setupView(visible_turfs) + +/datum/centcom_podlauncher/proc/setupViewDropoff() + var/list/coords_list = temp_pod.reverse_dropoff_coords + var/turf/drop = locate(coords_list[1], coords_list[2], coords_list[3]) + setupView(RANGE_TURFS(3, drop)) + +/datum/centcom_podlauncher/proc/setupView(list/visible_turfs) + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) + +/datum/centcom_podlauncher/proc/updateCursor(forceClear = FALSE) //Update the mouse of the user + if (!holder) //Can't update the mouse icon if the client doesnt exist! + return + if (!forceClear && (launcherActivated || picking_dropoff_turf)) //If the launching param is true, we give the user new mouse icons. + if(launcherActivated) holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_target.dmi' //Icon for when mouse is released holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_down_target.dmi' //Icon for when mouse is pressed - holder.mouse_override_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) - holder.mouse_pointer_icon = holder.mouse_override_icon - holder.click_intercept = src //Create a click_intercept so we know where the user is clicking - else - var/mob/M = holder.mob - holder.mouse_up_icon = null - holder.mouse_down_icon = null - holder.mouse_override_icon = null - holder.click_intercept = null - if (M) - M.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() + else if(picking_dropoff_turf) + holder.mouse_up_icon = 'icons/effects/supplypod_pickturf.dmi' //Icon for when mouse is released + holder.mouse_down_icon = 'icons/effects/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed + holder.mouse_pointer_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) + holder.click_intercept = src //Create a click_intercept so we know where the user is clicking + else + var/mob/holder_mob = holder.mob + holder.mouse_up_icon = null + holder.mouse_down_icon = null + holder.click_intercept = null + holder_mob?.update_mouse_pointer() //set the moues icons to null, then call update_moues_pointer() which resets them to the correct values based on what the mob is doing (in a mech, holding a spell, etc)() /datum/centcom_podlauncher/proc/InterceptClickOn(user,params,atom/target) //Click Intercept so we know where to send pods where the user clicks - var/list/modifiers = params2list(params) - - var/left_click = LAZYACCESS(modifiers, LEFT_CLICK) + var/list/pa = params2list(params) + var/left_click = pa.Find("left") if (launcherActivated) //Clicking on UI elements shouldn't launch a pod if(istype(target,/atom/movable/screen)) @@ -481,11 +576,12 @@ else return //if target is null and we don't have a specific target, cancel if (effectAnnounce) - deadchat_broadcast("A special package is being launched at the station!", turf_target = target, message_type=DEADCHAT_ANNOUNCEMENT) + deadchat_broadcast("A special package is being launched at the station!", turf_target = target) var/list/bouttaDie = list() - for (var/mob/living/M in target) - bouttaDie.Add(M) - supplypod_punish_log(bouttaDie, target) + for (var/mob/living/target_mob in target) + bouttaDie.Add(target_mob) + if (holder.holder) + supplypod_punish_log(bouttaDie) if (!effectBurst) //If we're not using burst mode, just launch normally. launch(target) else @@ -493,95 +589,153 @@ if (isnull(target)) break //if our target gets deleted during this, we stop the show preLaunch() //Same as above - var/LZ = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target - if (LZ) //just incase we're on the edge of the map or something that would cause target.x+1 to fail - launch(LZ) //launch the pod at the adjacent turf + var/landingzone = locate(target.x + rand(-1,1), target.y + rand(-1,1), target.z) //Pods are randomly adjacent to (or the same as) the target + if (landingzone) //just incase we're on the edge of the map or something that would cause target.x+1 to fail + launch(landingzone) //launch the pod at the adjacent turf else launch(target) //If we couldn't locate an adjacent turf, just launch at the normal target sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. + else if (picking_dropoff_turf) + //Clicking on UI elements shouldn't pick a dropoff turf + if(istype(target, /atom/movable/screen)) + return FALSE + + . = TRUE + if(left_click) //When we left click: + var/turf/target_turf = get_turf(target) + setDropoff(target_turf) + customDropoff = TRUE + to_chat(user, " You've selected [target_turf] at [COORD(target_turf)] as your dropoff location.") + +/datum/centcom_podlauncher/proc/refreshView() + switch(tabIndex) + if (TAB_POD) + setupViewPod() + if (TAB_BAY) + setupViewBay() + else + setupViewDropoff() /datum/centcom_podlauncher/proc/refreshBay() //Called whenever the bay is switched, as well as wheneber a pod is launched + bay = GLOB.supplypod_loading_bays[bayNumber] orderedArea = createOrderedArea(bay) //Create an ordered list full of turfs form the bay preLaunch() //Fill acceptable turfs from orderedArea, then fill launchList from acceptableTurfs (see proc for more info) + refreshView() -/datum/centcom_podlauncher/proc/createOrderedArea(area/A) //This assumes the area passed in is a continuous square - if (isnull(A)) //If theres no supplypod bay mapped into centcom, throw an error +/datum/centcom_podlauncher/proc/createOrderedArea(area/area_to_order) //This assumes the area passed in is a continuous square + if (isnull(area_to_order)) //If theres no supplypod bay mapped into centcom, throw an error to_chat(holder.mob, "No /area/centcom/supplypod/loading/one (or /two or /three or /four) in the world! You can make one yourself (then refresh) for now, but yell at a mapper to fix this, today!") CRASH("No /area/centcom/supplypod/loading/one (or /two or /three or /four) has been mapped into the centcom z-level!") orderedArea = list() - if (length(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values - var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) - var/endX = A.contents[1].x - var/startY = A.contents[1].y - var/endY = A.contents[1].y - for (var/turf/T in A) //For each turf in the area, go through and find: - if (T.x < startX) //The turf with the smallest x value. This is our startX - startX = T.x - else if (T.x > endX) //The turf with the largest x value. This is our endX - endX = T.x - else if (T.y > startY) //The turf with the largest Y value. This is our startY - startY = T.y - else if (T.y < endY) //The turf with the smallest Y value. This is our endY - endY = T.y - for (var/i in endY to startY) - for (var/j in startX to endX) - orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book + if (length(area_to_order.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values + var/startX = area_to_order.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) + var/endX = area_to_order.contents[1].x + var/startY = area_to_order.contents[1].y + var/endY = area_to_order.contents[1].y + for (var/turf/turf_in_area in area_to_order) //For each turf in the area, go through and find: + if (turf_in_area.x < startX) //The turf with the smallest x value. This is our startX + startX = turf_in_area.x + else if (turf_in_area.x > endX) //The turf with the largest x value. This is our endX + endX = turf_in_area.x + else if (turf_in_area.y > startY) //The turf with the largest Y value. This is our startY + startY = turf_in_area.y + else if (turf_in_area.y < endY) //The turf with the smallest Y value. This is our endY + endY = turf_in_area.y + for (var/vertical in endY to startY) + for (var/horizontal in startX to endX) + orderedArea.Add(locate(horizontal, startY - (vertical - endY), 1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book return orderedArea //Return the filled list /datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time) acceptableTurfs = list() - for (var/turf/T in orderedArea) //Go through the orderedArea list - if (typecache_filter_list_reverse(T.contents, ignored_atoms).len != 0) //if there is something in this turf that isnt in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list - acceptableTurfs.Add(T) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. + for (var/t in orderedArea) //Go through the orderedArea list + var/turf/unchecked_turf = t + if (iswallturf(unchecked_turf) || typecache_filter_list_reverse(unchecked_turf.contents, ignored_atoms).len != 0) //if there is something in this turf that isn't in the blacklist, we consider this turf "acceptable" and add it to the acceptableTurfs list + acceptableTurfs.Add(unchecked_turf) //Because orderedArea was an ordered linear list, acceptableTurfs will be as well. numTurfs ++ launchList = list() //Anything in launchList will go into the supplypod when it is launched if (length(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We dont fill the supplypod if acceptableTurfs is empty, if the pod is going in reverse (effectReverse=true), or if the pod is acitng like a missile (effectMissile=true) switch(launchChoice) - if(0) //If we are launching all the turfs at once - for (var/turf/T in acceptableTurfs) - launchList |= typecache_filter_list_reverse(T.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList - if(1) //If we are launching one at a time + if(LAUNCH_ALL) //If we are launching all the turfs at once + for (var/t in acceptableTurfs) + var/turf/accepted_turf = t + launchList |= typecache_filter_list_reverse(accepted_turf.contents, ignored_atoms) //We filter any blacklisted atoms and add the rest to the launchList + if (iswallturf(accepted_turf)) + launchList += accepted_turf + if(LAUNCH_ORDERED) //If we are launching one at a time if (launchCounter > acceptableTurfs.len) //Check if the launchCounter, which acts as an index, is too high. If it is, reset it to 1 launchCounter = 1 //Note that the launchCounter index is incremented in the launch() proc - for (var/atom/movable/O in acceptableTurfs[launchCounter].contents) //Go through the acceptableTurfs list based on the launchCounter index - launchList |= typecache_filter_list_reverse(acceptableTurfs[launchCounter].contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList - if(2) //If we are launching randomly - launchList |= typecache_filter_list_reverse(pick_n_take(acceptableTurfs).contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + var/turf/next_turf_in_line = acceptableTurfs[launchCounter] + launchList |= typecache_filter_list_reverse(next_turf_in_line.contents, ignored_atoms) //Filter the specicic turf chosen from acceptableTurfs, and add it to the launchList + if (iswallturf(next_turf_in_line)) + launchList += next_turf_in_line + if(LAUNCH_RANDOM) //If we are launching randomly + var/turf/acceptable_turf = pick_n_take(acceptableTurfs) + launchList |= typecache_filter_list_reverse(acceptable_turf.contents, ignored_atoms) //filter a random turf from the acceptableTurfs list and add it to the launchList + if (iswallturf(acceptable_turf)) + launchList += acceptable_turf updateSelector() //Call updateSelector(), which, if we are launching one at a time (launchChoice==2), will move to the next turf that will be launched //UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed -/datum/centcom_podlauncher/proc/launch(turf/A) //Game time started - if (isnull(A)) +/datum/centcom_podlauncher/proc/launch(turf/target_turf) //Game time started + if (isnull(target_turf)) return var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result - toLaunch.bay = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject toLaunch.update_appearance()//we update_appearance() here so that the door doesnt "flicker on" right after it lands - var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/flyMeToTheMoon] + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] toLaunch.forceMove(shippingLane) if (launchClone) //We arent launching the actual items from the bay, rather we are creating clones and launching those if(launchRandomItem) - var/atom/movable/O = pick_n_take(launchList) - DuplicateObject(O).forceMove(toLaunch) //Duplicate a single atom/movable from launchList and forceMove it into the supplypod + var/launch_candidate = pick_n_take(launchList) + if(!isnull(launch_candidate)) + if (iswallturf(launch_candidate)) + var/atom/atom_to_launch = launch_candidate + toLaunch.turfs_in_cargo += atom_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate a single atom/movable from launchList and forceMove it into the supplypod else - for (var/atom/movable/O in launchList) - DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod + for (var/launch_candidate in launchList) + if (isnull(launch_candidate)) + continue + if (iswallturf(launch_candidate)) + var/turf/turf_to_launch = launch_candidate + toLaunch.turfs_in_cargo += turf_to_launch.type + else + var/atom/movable/movable_to_launch = launch_candidate + DuplicateObject(movable_to_launch).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod else if(launchRandomItem) - var/atom/movable/O = pick_n_take(launchList) - O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + var/atom/random_item = pick_n_take(launchList) + if(!isnull(random_item)) + if (iswallturf(random_item)) + var/turf/wall = random_item + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/random_item_movable = random_item + random_item_movable.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod else - for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList - O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod - new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location + for (var/thing_to_launch in launchList) //If we aren't cloning the objects, just go through the launchList + if (isnull(thing_to_launch)) + continue + if(iswallturf(thing_to_launch)) + var/turf/wall = thing_to_launch + toLaunch.turfs_in_cargo += wall.type + wall.ScrapeAway() + else + var/atom/movable/movable_to_launch = thing_to_launch + movable_to_launch.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod + new /obj/effect/pod_landingzone(target_turf, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location if (launchClone) launchCounter++ //We only need to increment launchCounter if we are cloning objects. //If we aren't cloning objects, taking and removing the first item each time from the acceptableTurfs list will inherently iterate through the list in order /datum/centcom_podlauncher/proc/updateSelector() //Ensures that the selector effect will showcase the next item if needed - if (launchChoice == 1 && length(acceptableTurfs) && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay - var/index = launchCounter + 1 //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list + if (launchChoice == LAUNCH_ORDERED && length(acceptableTurfs) > 1 && !temp_pod.reversing && !temp_pod.effectMissile) //We only show the selector if we are taking items from the bay + var/index = (launchCounter == 1 ? launchCounter : launchCounter + 1) //launchCounter acts as an index to the ordered acceptableTurfs list, so adding one will show the next item in the list. We don't want to do this for the very first item tho if (index > acceptableTurfs.len) //out of bounds check index = 1 selector.forceMove(acceptableTurfs[index]) //forceMove the selector to the next turf in the ordered acceptableTurfs list @@ -593,31 +747,102 @@ qdel(O) for (var/mob/M in bay.GetAllContents()) qdel(M) + for (var/bayturf in bay) + var/turf/turf_to_clear = bayturf + turf_to_clear.ChangeTurf(/turf/open/floor/plasteel) /datum/centcom_podlauncher/Destroy() //The Destroy() proc. This is called by ui_close proc, or whenever the user leaves the game - updateCursor(FALSE) //Make sure our moues cursor resets to default. False means we are not in launch mode - qdel(temp_pod) //Delete the temp_pod - qdel(selector) //Delete the selector effect + updateCursor(TRUE) //Make sure our mouse cursor resets to default. False means we are not in launch mode + QDEL_NULL(temp_pod) //Delete the temp_pod + QDEL_NULL(selector) //Delete the selector effect + QDEL_NULL(indicator) . = ..() -/datum/centcom_podlauncher/proc/supplypod_punish_log(list/whoDyin, atom/target) +/datum/centcom_podlauncher/proc/supplypod_punish_log(list/whoDyin) var/podString = effectBurst ? "5 pods" : "a pod" var/whomString = "" if (LAZYLEN(whoDyin)) for (var/mob/living/M in whoDyin) - whomString += "[key_name(M) || "nobody"], " - - var/delayString = temp_pod.landingDelay == initial(temp_pod.landingDelay) ? "" : " Delay=[temp_pod.landingDelay*0.1]s" - var/damageString = temp_pod.damage == 0 ? "" : " Dmg=[temp_pod.damage]" - var/explosionString = "" - var/explosion_sum = temp_pod.explosionSize[1] + temp_pod.explosionSize[2] + temp_pod.explosionSize[3] + temp_pod.explosionSize[4] - if (explosion_sum != 0) - explosionString = " Boom=|" - for (var/X in temp_pod.explosionSize) - explosionString += "[X]|" - - var/msg = "launched [podString] towards [whomString] [delayString][damageString][explosionString]" - message_admins("[key_name_admin(usr)] [msg] in [ADMIN_VERBOSEJMP(specificTarget || target)].") + whomString += "[key_name(M)], " + + var/msg = "launched [podString] towards [whomString]" + message_admins("[key_name_admin(usr)] [msg] in [ADMIN_VERBOSEJMP(specificTarget)].") if (length(whoDyin)) for (var/mob/living/M in whoDyin) admin_ticket_log(M, "[key_name_admin(usr)] [msg]") + +/datum/centcom_podlauncher/proc/loadData(list/dataToLoad) + bayNumber = dataToLoad["bayNumber"] + customDropoff = dataToLoad["customDropoff"] + renderLighting = dataToLoad["renderLighting"] + launchClone = dataToLoad["launchClone"] //Do we launch the actual items in the bay or just launch clones of them? + launchRandomItem = dataToLoad["launchRandomItem"] //Do we launch a single random item instead of everything on the turf? + launchChoice = dataToLoad["launchChoice"] //Launch turfs all at once (0), ordered (1), or randomly(1) + explosionChoice = dataToLoad["explosionChoice"] //An explosion that occurs when landing. Can be no explosion (0), custom explosion (1), or maxcap (2) + damageChoice = dataToLoad["damageChoice"] //Damage that occurs to any mob under the pod when it lands. Can be no damage (0), custom damage (1), or gib+5000dmg (2) + temp_pod.delays = dataToLoad["delays"] + temp_pod.reverse_delays = dataToLoad["rev_delays"] + temp_pod.custom_rev_delay = dataToLoad["custom_rev_delay"] + temp_pod.setStyle(dataToLoad["styleChoice"]) //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. + temp_pod.effectStun = dataToLoad["effectStun"]//If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! + temp_pod.effectLimb = dataToLoad["effectLimb"]//If true, pops off a limb (if applicable) from anyone caught under the pod when it lands + temp_pod.effectOrgans = dataToLoad["effectOrgans"]//If true, yeets the organs out of any bodies caught under the pod when it lands + temp_pod.bluespace = dataToLoad["effectBluespace"] //If true, the pod deletes (in a shower of sparks) after landing + temp_pod.effectStealth = dataToLoad["effectStealth"]//If true, a target icon isn't displayed on the turf where the pod will land + temp_pod.effectQuiet = dataToLoad["effectQuiet"] //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) + temp_pod.effectMissile = dataToLoad["effectMissile"] //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground + temp_pod.effectCircle = dataToLoad["effectCircle"] //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here + effectBurst = dataToLoad["effectBurst"] //IOf true, launches five pods at once (with a very small delay between for added coolness), in a 3x3 area centered around the area + temp_pod.reversing = dataToLoad["effectReverse"] //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom + temp_pod.reverseOptionList = dataToLoad["reverseOptionList"] + specificTarget = dataToLoad["effectTarget"] //Launches the pod at the turf of a specific mob target, rather than wherever the user clicked. Useful for smites + temp_pod.adminNamed = dataToLoad["effectName"] //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) + temp_pod.name = dataToLoad["podName"] + temp_pod.desc = dataToLoad["podDesc"] + effectAnnounce = dataToLoad["effectAnnounce"] + numTurfs = dataToLoad["numObjects"] //Counts the number of turfs that contain a launchable object in the centcom supplypod bay + temp_pod.fallingSound = dataToLoad["fallingSound"]//Admin sound to play as the pod falls + temp_pod.landingSound = dataToLoad["landingSound"]//Admin sound to play when the pod lands + temp_pod.openingSound = dataToLoad["openingSound"]//Admin sound to play when the pod opens + temp_pod.leavingSound = dataToLoad["leavingSound"]//Admin sound to play when the pod leaves + temp_pod.soundVolume = dataToLoad["soundVolume"] //Admin sound to play when the pod leaves + picking_dropoff_turf = FALSE + launcherActivated = FALSE + updateCursor() + refreshView() + +GLOBAL_DATUM_INIT(podlauncher, /datum/centcom_podlauncher, new) +//Proc for admins to enable others to use podlauncher after roundend +/datum/centcom_podlauncher/proc/give_podlauncher(mob/living/user, override) + if (SSticker.current_state < GAME_STATE_FINISHED) + return + if (!istype(user)) + user = override + if (user) + setup(user)//setup the datum + +//Set the dropoff location and indicator to either a specific turf or somewhere in an area +/datum/centcom_podlauncher/proc/setDropoff(target) + var/turf/target_turf + if (isturf(target)) + target_turf = target + else if (isarea(target)) + target_turf = pick(get_area_turfs(target)) + else + CRASH("Improper type passed to setDropoff! Should be /turf or /area") + temp_pod.reverse_dropoff_coords = list(target_turf.x, target_turf.y, target_turf.z) + indicator.forceMove(target_turf) + +/obj/effect/hallucination/simple/supplypod_selector + name = "Supply Selector (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "selector" + image_layer = FLY_LAYER + alpha = 150 + +/obj/effect/hallucination/simple/dropoff_location + name = "Dropoff Location (Only you can see this)" + image_icon = 'icons/obj/supplypods_32x32.dmi' + image_state = "dropoff_indicator" + image_layer = FLY_LAYER + alpha = 0 diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index 9074a87d7bbe..9f615a5ba3ee 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -244,7 +244,7 @@ name = usr.real_name rank = "Silicon" var/datum/supply_order/SO = new(pack, name, rank, usr.ckey, "") - new /obj/effect/DPtarget(landing_turf, podType, SO) + new /obj/effect/pod_landingzone(landing_turf, podType, SO) update_appearance() // ?????????????????? return TRUE diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 72d4d409ccb6..69a9c7d286b4 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -10,9 +10,9 @@ response_harm_simple = "kick" faction = list("gondola") turns_per_move = 10 - icon = 'icons/mob/gondolapod.dmi' - icon_state = "gondolapod" - icon_living = "gondolapod" + icon = 'icons/obj/supplypods.dmi' + icon_state = "gondola" + icon_living = "gondola" pixel_x = -16//2x2 sprite base_pixel_x = -16 pixel_y = -5 @@ -34,11 +34,10 @@ name = linked_pod.name . = ..() -/mob/living/simple_animal/pet/gondola/gondolapod/update_icon_state() +/mob/living/simple_animal/pet/gondola/gondolapod/update_overlays() + . = ..() if(opened) - icon_state = "gondolapod_open" - else - icon_state = "gondolapod" + . += "[icon_state]_open" return ..() /mob/living/simple_animal/pet/gondola/gondolapod/verb/deliver() @@ -64,12 +63,12 @@ else to_chat(src, "A closer look inside yourself reveals... nothing.") -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setOpened() +/mob/living/simple_animal/pet/gondola/gondolapod/setOpened() opened = TRUE update_appearance() - addtimer(CALLBACK(src, .proc/setClosed), 50) + addtimer(CALLBACK(src, /atom/.proc/setClosed), 50) -/mob/living/simple_animal/pet/gondola/gondolapod/proc/setClosed() +/mob/living/simple_animal/pet/gondola/gondolapod/setClosed() opened = FALSE update_appearance() diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index f33ade28bfb8..314484a5a668 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -1,13 +1,12 @@ -//The "BDPtarget" temp visual is created by anything that "launches" a supplypod. It makes two things: a falling droppod animation, and the droppod itself. +//The "pod_landingzone" temp visual is created by anything that "launches" a supplypod. It makes two things: a falling droppod animation, and the droppod itself. //------------------------------------SUPPLY POD-------------------------------------// /obj/structure/closet/supplypod name = "supply pod" //Names and descriptions are normally created with the setStyle() proc during initialization, but we have these default values here as a failsafe desc = "A Nanotrasen supply drop pod." icon = 'icons/obj/supplypods.dmi' - icon_state = "supplypod" - pixel_x = -16 //2x2 sprite - pixel_y = -5 - layer = TABLE_LAYER //So that the crate inside doesn't appear underneath + icon_state = "pod" //This is a common base sprite shared by a number of pods + pixel_x = SUPPLYPOD_X_OFFSET //2x2 sprite + layer = BELOW_OBJ_LAYER //So that the crate inside doesn't appear underneath allow_objects = TRUE allow_dense = TRUE delivery_icon = null @@ -16,12 +15,16 @@ anchored = TRUE //So it cant slide around after landing anchorable = FALSE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + appearance_flags = KEEP_TOGETHER | PIXEL_SCALE + density = FALSE + ///List of bitflags for supply pods, see: code\__DEFINES\obj_flags.dm + var/pod_flags = NONE //*****NOTE*****: Many of these comments are similarly described in centcom_podlauncher.dm. If you change them here, please consider doing so in the centcom podlauncher code as well! var/adminNamed = FALSE //Determines whether or not the pod has been named by an admin. If true, the pod's name will not get overridden when the style of the pod changes (changing the style of the pod normally also changes the name+desc) var/bluespace = FALSE //If true, the pod deletes (in a shower of sparks) after landing - var/landingDelay = 30 //How long the pod takes to land after launching - var/openingDelay = 30 //How long the pod takes to open after landing - var/departureDelay = 30 //How long the pod takes to leave after opening. If bluespace = TRUE, it deletes. If reversing = TRUE, it flies back to centcom. + var/delays = list(POD_TRANSIT = 30, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + var/reverse_delays = list(POD_TRANSIT = 30, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) + var/custom_rev_delay = FALSE var/damage = 0 //Damage that occurs to any mob under the pod when it lands. var/effectStun = FALSE //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! var/effectLimb = FALSE //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands @@ -31,9 +34,9 @@ var/effectQuiet = FALSE //The female sniper. If true, the pod makes no noise (including related explosions, opening sounds, etc) var/effectMissile = FALSE //If true, the pod deletes the second it lands. If you give it an explosion, it will act like a missile exploding as it hits the ground var/effectCircle = FALSE //If true, allows the pod to come in at any angle. Bit of a weird feature but whatever its here - var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + var/style = STYLE_STANDARD //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the GLOB.podstyles list in cargo.dm defines to get the proper icon/name/desc for the pod. var/reversing = FALSE //If true, the pod will not send any items. Instead, after opening, it will close again (picking up items/mobs) and fly back to centcom - var/fallDuration = 4 + var/list/reverse_dropoff_coords //Turf that the reverse pod will drop off it's newly-acquired cargo to var/fallingSoundLength = 11 var/fallingSound = 'sound/weapons/mortar_long_whistle.ogg'//Admin sound to play before the pod lands var/landingSound //Admin sound to play when the pod lands @@ -43,13 +46,21 @@ var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. var/list/explosionSize = list(0,0,2,3) var/stay_after_drop = FALSE - var/specialised = TRUE // It's not a general use pod for cargo/admin use + var/specialised = FALSE // It's not a general use pod for cargo/admin use + var/rubble_type //Rubble effect associated with this supplypod + var/decal = "default" //What kind of extra decals we add to the pod to make it look nice + var/door = "pod_door" + var/fin_mask = "topfin" + var/obj/effect/supplypod_rubble/rubble + var/obj/effect/engineglow/glow_effect + var/list/reverseOptionList = list("Mobs"=FALSE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE) + var/list/turfs_in_cargo = list() /obj/structure/closet/supplypod/bluespacepod style = STYLE_BLUESPACE bluespace = TRUE explosionSize = list(0,0,1,2) - landingDelay = 15 //Slightly quicker than the supplypod + delays = list(POD_TRANSIT = 15, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) /obj/structure/closet/supplypod/extractionpod name = "Syndicate Extraction Pod" @@ -58,47 +69,109 @@ style = STYLE_SYNDICATE bluespace = TRUE explosionSize = list(0,0,1,2) - landingDelay = 25 //Longer than others + delays = list(POD_TRANSIT = 25, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) /obj/structure/closet/supplypod/centcompod style = STYLE_CENTCOM bluespace = TRUE explosionSize = list(0,0,0,0) - landingDelay = 20 //Very speedy! + delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF +/obj/structure/closet/supplypod/Initialize(mapload, customStyle = FALSE) + . = ..() + if (!loc) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] //temporary holder for supplypods mid-transit + forceMove(shippingLane) + if (customStyle) + style = customStyle + setStyle(style) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly + +/obj/structure/closet/supplypod/extractionpod/Initialize() + . = ..() + var/turf/picked_turf = pick(GLOB.holdingfacility) + reverse_dropoff_coords = list(picked_turf.x, picked_turf.y, picked_turf.z) -/obj/structure/closet/supplypod/proc/specialisedPod() - return 1 +/obj/structure/closet/supplypod/proc/setStyle(chosenStyle) //Used to give the sprite an icon state, name, and description. + style = chosenStyle + var/base = GLOB.podstyles[chosenStyle][POD_BASE] //GLOB.podstyles is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. + icon_state = base + decal = GLOB.podstyles[chosenStyle][POD_DECAL] + rubble_type = GLOB.podstyles[chosenStyle][POD_RUBBLE_TYPE] + if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum + name = GLOB.podstyles[chosenStyle][POD_NAME] + desc = GLOB.podstyles[chosenStyle][POD_DESC] + if (GLOB.podstyles[chosenStyle][POD_DOOR]) + door = "[base]_door" + else + door = FALSE + update_appearance() -/obj/structure/closet/supplypod/extractionpod/specialisedPod(atom/movable/holder) - holder.forceMove(pick(GLOB.holdingfacility)) // land in ninja jail - open_pod(holder, forced = TRUE) +/obj/structure/closet/supplypod/proc/SetReverseIcon() + fin_mask = "bottomfin" + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + "_reverse" + pixel_x = initial(pixel_x) + transform = matrix() + update_appearance() -/obj/structure/closet/supplypod/Initialize() - . = ..() - setStyle(style, TRUE) //Upon initialization, give the supplypod an iconstate, name, and description based on the "style" variable. This system is important for the centcom_podlauncher to function correctly +/obj/structure/closet/supplypod/proc/backToNonReverseIcon() + fin_mask = initial(fin_mask) + if (GLOB.podstyles[style][POD_SHAPE] == POD_SHAPE_NORML) + icon_state = GLOB.podstyles[style][POD_BASE] + pixel_x = initial(pixel_x) + transform = matrix() + update_appearance() /obj/structure/closet/supplypod/update_overlays() . = ..() - if (style == STYLE_SEETHROUGH || style == STYLE_INVISIBLE) //If we're invisible, we dont bother adding any overlays + if (style == STYLE_INVISIBLE) + return + if (rubble) + . += rubble.getForeground(src) + if (style == STYLE_SEETHROUGH) + for (var/atom/A in contents) + var/mutable_appearance/itemIcon = new(A) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon + for (var/t in turfs_in_cargo)//T is just a turf's type + var/turf/turf_type = t + var/mutable_appearance/itemIcon = mutable_appearance(initial(turf_type.icon), initial(turf_type.icon_state)) + itemIcon.transform = matrix().Translate(-1 * SUPPLYPOD_X_OFFSET, 0) + . += itemIcon return - else - if (opened) - . += "[icon_state]_open" - else - . += "[icon_state]_door" -/obj/structure/closet/supplypod/proc/setStyle(chosenStyle, duringInit = FALSE) //Used to give the sprite an icon state, name, and description - if (!duringInit && style == chosenStyle) //Check if the input style is already the same as the pod's style. This happens in centcom_podlauncher, and as such we set the style to STYLE_CENTCOM. - setStyle(STYLE_CENTCOM) //We make sure to not check this during initialize() so the standard supplypod works correctly. + if (opened) //We're opened means all we have to worry about is masking a decal if we have one + if (!decal) //We don't have a decal to mask + return + if (!door) //We have a decal but no door, so let's just add the decal + . += decal + return + var/icon/masked_decal = new(icon, decal) //The decal we want to apply + var/icon/door_masker = new(icon, door) //The door shape we want to 'cut out' of the decal + door_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + door_masker.SwapColor("#ffffffff", null) + door_masker.Blend("#000000", ICON_SUBTRACT) + masked_decal.Blend(door_masker, ICON_ADD) + . += masked_decal return - style = chosenStyle - icon_state = POD_STYLES[chosenStyle][POD_ICON_STATE] //POD_STYLES is a 2D array we treat as a dictionary. The style represents the verticle index, with the icon state, name, and desc being stored in the horizontal indexes of the 2D array. - if (!adminNamed && !specialised) //We dont want to name it ourselves if it has been specifically named by an admin using the centcom_podlauncher datum - name = POD_STYLES[chosenStyle][POD_NAME] - desc = POD_STYLES[chosenStyle][POD_DESC] - update_appearance() + //If we're closed + if(!door) //We have no door, lets see if we have a decal. If not, theres nothing we need to do + if(decal) + . += decal + return + else if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) //If we're not a normal pod shape (aka, if we don't have fins), just add the door without masking + . += door + else + var/icon/masked_door = new(icon, door) //The door we want to apply + var/icon/fin_masker = new(icon, "mask_[fin_mask]") //The fin shape we want to 'cut out' of the door + fin_masker.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 1,1,1,0, 0,0,0,1) + fin_masker.SwapColor("#ffffffff", null) + fin_masker.Blend("#000000", ICON_SUBTRACT) + masked_door.Blend(fin_masker, ICON_ADD) + . += masked_door + if(decal) + . += decal /obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. @@ -115,86 +188,87 @@ /obj/structure/closet/supplypod/toggle(mob/living/user) return -/obj/structure/closet/supplypod/open(mob/living/user, force = TRUE) //Supplypods shouldn't be able to be manually opened under any circumstances +/obj/structure/closet/supplypod/open(mob/living/user, force = TRUE) return -/obj/structure/closet/supplypod/proc/handleReturningClose(atom/movable/holder, returntobay) - opened = FALSE - INVOKE_ASYNC(holder, .proc/setClosed) //Use the INVOKE_ASYNC proc to call setClosed() on whatever the holder may be, without giving the atom/movable base class a setClosed() proc definition - for (var/atom/movable/O in get_turf(holder)) - if ((ismob(O) && !isliving(O)) || (is_type_in_typecache(O, GLOB.blacklisted_cargo_types) && !isliving(O))) //We dont want to take ghosts with us, and we don't want blacklisted items going, but we allow mobs. - continue - O.forceMove(holder) //Put objects inside before we close - var/obj/effect/temp_visual/risingPod = new /obj/effect/DPfall(get_turf(holder), src) //Make a nice animation of flying back up - risingPod.pixel_z = 0 //The initial value of risingPod's pixel_z is 200 because it normally comes down from a high spot - animate(risingPod, pixel_z = 200, time = 10, easing = LINEAR_EASING) //Animate our rising pod - if (returntobay) - holder.forceMove(bay) //Move the pod back to centcom, where it belongs - QDEL_IN(risingPod, 10) - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - open_pod(holder, forced = TRUE) - else - reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open() ) - bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever - - QDEL_IN(risingPod, 10) - audible_message("The pod hisses, closing quickly and launching itself away from the launch point.", "The ground vibrates, the nearby pod off into the unknown.") - - stay_after_drop = FALSE - specialisedPod(holder) // Do special actions for specialised pods - this is likely if we were already doing manual launches - -/obj/structure/closet/supplypod/proc/preOpen() //Called before the open() proc. Handles anything that occurs right as the pod lands. - var/turf/T = get_turf(src) +/obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) + reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) + bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever + pod_flags &= ~FIRST_SOUNDS //Make it so we play sounds now + if (!effectQuiet && style != STYLE_SEETHROUGH) + audible_message("The pod hisses, closing and launching itself away from the station.", "The ground vibrates, and you hear the sound of engines firing.") + stay_after_drop = FALSE + holder.pixel_z = initial(holder.pixel_z) + holder.alpha = initial(holder.alpha) + var/shippingLane = GLOB.areas_by_type[/area/centcom/supplypod/supplypod_temp_holding] + forceMove(shippingLane) //Move to the centcom-z-level until the pod_landingzone says we can drop back down again + if (!reverse_dropoff_coords) //If we're centcom-launched, the reverse dropoff turf will be a centcom loading bay. If we're an extraction pod, it should be the ninja jail. Thus, this shouldn't ever really happen. + var/obj/error_landmark = locate(/obj/effect/landmark/error) in GLOB.landmarks_list + var/turf/error_landmark_turf = get_turf(error_landmark) + reverse_dropoff_coords = list(error_landmark_turf.x, error_landmark_turf.y, error_landmark_turf.z) + if (custom_rev_delay) + delays = reverse_delays + backToNonReverseIcon() + var/turf/return_turf = locate(reverse_dropoff_coords[1], reverse_dropoff_coords[2], reverse_dropoff_coords[3]) + new /obj/effect/pod_landingzone(return_turf, src) + +/obj/structure/closet/supplypod/proc/preOpen() //Called before the open_pod() proc. Handles anything that occurs right as the pod lands. + var/turf/turf_underneath = get_turf(src) var/list/B = explosionSize //Mostly because B is more readable than explosionSize :p - if (landingSound) - playsound(get_turf(src), landingSound, soundVolume, FALSE, FALSE) - for (var/mob/living/M in T) - if (effectLimb && iscarbon(M)) //If effectLimb is true (which means we pop limbs off when we hit people): - var/mob/living/carbon/CM = M - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! - break - if (effectOrgans && iscarbon(M)) //effectOrgans means remove every organ in our mob - var/mob/living/carbon/CM = M - for(var/X in CM.internal_organs) - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) //Pick a random direction to toss them in - var/obj/item/organ/O = X - O.Remove(CM) //Note that this isn't the same proc as for lists - O.forceMove(T) //Move the organ outta the body - O.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away - sleep(1) - for (var/obj/item/bodypart/bodypart in CM.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands - var/destination = get_edge_target_turf(T, pick(GLOB.alldirs)) - if (bodypart.dismemberable) - bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! - bodypart.throw_at(destination, 2, 3) + density = TRUE //Density is originally false so the pod doesn't block anything while it's still falling through the air + for (var/mob/living/target_living in turf_underneath) + if (iscarbon(target_living)) //If effectLimb is true (which means we pop limbs off when we hit people): + if (effectLimb) + var/mob/living/carbon/carbon_target_mob = target_living + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + if(bodypart.body_part != HEAD && bodypart.body_part != CHEST)//we dont want to kill him, just teach em a lesson! + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's limb in half! + break + if (effectOrgans) //effectOrgans means remove every organ in our mob + var/mob/living/carbon/carbon_target_mob = target_living + for(var/organ in carbon_target_mob.internal_organs) + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) //Pick a random direction to toss them in + var/obj/item/organ/organ_to_yeet = organ + organ_to_yeet.Remove(carbon_target_mob) //Note that this isn't the same proc as for lists + organ_to_yeet.forceMove(turf_underneath) //Move the organ outta the body + organ_to_yeet.throw_at(destination, 2, 3) //Thow the organ at a random tile 3 spots away sleep(1) + for (var/bp in carbon_target_mob.bodyparts) //Look at the bodyparts in our poor mob beneath our pod as it lands + var/obj/item/bodypart/bodypart = bp + var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) + if (bodypart.dismemberable) + bodypart.dismember() //Using the power of flextape i've sawed this man's bodypart in half! + bodypart.throw_at(destination, 2, 3) + sleep(1) if (effectGib) //effectGib is on, that means whatever's underneath us better be fucking oof'd on - M.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) - M.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs - M.adjustBruteLoss(damage) + target_living.adjustBruteLoss(5000) //THATS A LOT OF DAMAGE (called just in case gib() doesnt work on em) + if (!QDELETED(target_living)) + target_living.gib() //After adjusting the fuck outta that brute loss we finish the job with some satisfying gibs + else + target_living.adjustBruteLoss(damage) var/explosion_sum = B[1] + B[2] + B[3] + B[4] if (explosion_sum != 0) //If the explosion list isn't all zeroes, call an explosion - explosion(get_turf(src), B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing - else if (!effectQuiet) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) - playsound(src, "explosion", landingSound ? 15 : 80, TRUE) + explosion(turf_underneath, B[1], B[2], B[3], flame_range = B[4], silent = effectQuiet, ignorecap = istype(src, /obj/structure/closet/supplypod/centcompod)) //less advanced equipment than bluespace pod, so larger explosion when landing + else if (!effectQuiet && !(pod_flags & FIRST_SOUNDS)) //If our explosion list IS all zeroes, we still make a nice explosion sound (unless the effectQuiet var is true) + playsound(src, "explosion", landingSound ? soundVolume * 0.25 : soundVolume, TRUE) + if (landingSound) + playsound(turf_underneath, landingSound, soundVolume, FALSE, FALSE) if (effectMissile) //If we are acting like a missile, then right after we land and finish fucking shit up w explosions, we should delete opened = TRUE //We set opened to TRUE to avoid spending time trying to open (due to being deleted) during the Destroy() proc qdel(src) return if (style == STYLE_GONDOLA) //Checks if we are supposed to be a gondola pod. If so, create a gondolapod mob, and move this pod to nullspace. I'd like to give a shout out, to my man oranges - var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(get_turf(src), src) + var/mob/living/simple_animal/pet/gondola/gondolapod/benis = new(turf_underneath, src) benis.contents |= contents //Move the contents of this supplypod into the gondolapod mob. moveToNullspace() - addtimer(CALLBACK(src, .proc/open, benis), openingDelay) //After the openingDelay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob + addtimer(CALLBACK(src, .proc/open_pod, benis), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplyprod while referencing the contents of the "holder", in this case the gondolapod mob else if (style == STYLE_SEETHROUGH) open_pod(src) else - addtimer(CALLBACK(src, .proc/open_pod, src), openingDelay) //After the openingDelay passes, we use the open proc from this supplypod, while referencing this supplypod's contents + addtimer(CALLBACK(src, .proc/open_pod, src), delays[POD_OPENING]) //After the opening delay passes, we use the open proc from this supplypod, while referencing this supplypod's contents /obj/structure/closet/supplypod/proc/open_pod(atom/movable/holder, broken = FALSE, forced = FALSE) //The holder var represents an atom whose contents we will be working with if (!holder) @@ -202,109 +276,286 @@ if (opened) //This is to ensure we don't open something that has already been opened return opened = TRUE - var/turf/T = get_turf(holder) //Get the turf of whoever's contents we're talking about - var/mob/M + holder.setOpened() + var/turf/turf_underneath = get_turf(holder) //Get the turf of whoever's contents we're talking about if (istype(holder, /mob)) //Allows mobs to assume the role of the holder, meaning we look at the mob's contents rather than the supplypod's contents. Typically by this point the supplypod's contents have already been moved over to the mob's contents - M = holder - if (M.key && !forced && !broken) //If we are player controlled, then we shouldnt open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) + var/mob/holder_as_mob = holder + if (holder_as_mob.key && !forced && !broken) //If we are player controlled, then we shouldn't open unless the opening is manual, or if it is due to being destroyed (represented by the "broken" parameter) return if (openingSound) playsound(get_turf(holder), openingSound, soundVolume, FALSE, FALSE) //Special admin sound to play - INVOKE_ASYNC(holder, .proc/setOpened) //Use the INVOKE_ASYNC proc to call setOpened() on whatever the holder may be, without giving the atom/movable base class a setOpened() proc definition - if (style == STYLE_SEETHROUGH) - update_appearance() - for (var/atom/movable/O in holder.contents) //Go through the contents of the holder - O.forceMove(T) //move everything from the contents of the holder to the turf of the holder - if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH) //If we aren't being quiet, play the default pod open sound + for (var/turf_type in turfs_in_cargo) + turf_underneath.PlaceOnTop(turf_type) + for (var/cargo in contents) + var/atom/movable/movable_cargo = cargo + movable_cargo.forceMove(turf_underneath) + if (!effectQuiet && !openingSound && style != STYLE_SEETHROUGH && !(pod_flags & FIRST_SOUNDS)) //If we aren't being quiet, play the default pod open sound playsound(get_turf(holder), open_sound, 15, TRUE, -3) if (broken) //If the pod is opening because it's been destroyed, we end here return if (style == STYLE_SEETHROUGH) - depart(src) + startExitSequence(src) else + if (reversing) + addtimer(CALLBACK(src, .proc/SetReverseIcon), delays[POD_LEAVING]/2) //Finish up the pod's duties after a certain amount of time if(!stay_after_drop) // Departing should be handled manually - addtimer(CALLBACK(src, .proc/depart, holder), departureDelay) //Finish up the pod's duties after a certain amount of time + addtimer(CALLBACK(src, .proc/startExitSequence, holder), delays[POD_LEAVING]*(4/5)) //Finish up the pod's duties after a certain amount of time -/obj/structure/closet/supplypod/proc/depart(atom/movable/holder) +/obj/structure/closet/supplypod/proc/startExitSequence(atom/movable/holder) if (leavingSound) playsound(get_turf(holder), leavingSound, soundVolume, FALSE, FALSE) if (reversing) //If we're reversing, we call the close proc. This sends the pod back up to centcom close(holder) else if (bluespace) //If we're a bluespace pod, then delete ourselves (along with our holder, if a seperate holder exists) + deleteRubble() if (!effectQuiet && style != STYLE_INVISIBLE && style != STYLE_SEETHROUGH) do_sparks(5, TRUE, holder) //Create some sparks right before closing qdel(src) //Delete ourselves and the holder if (holder != src) qdel(holder) -/obj/structure/closet/supplypod/centcompod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true - handleReturningClose(holder, TRUE) +/obj/structure/closet/supplypod/close(atom/movable/holder) //Closes the supplypod and sends it back to centcom. Should only ever be called if the "reversing" variable is true + if (!holder) + return + take_contents(holder) + playsound(holder, close_sound, soundVolume*0.75, TRUE, -3) + holder.setClosed() + addtimer(CALLBACK(src, .proc/preReturn, holder), delays[POD_LEAVING] * 0.2) //Start to leave a bit after closing for cinematic effect + +/obj/structure/closet/supplypod/take_contents(atom/movable/holder) + var/turf/turf_underneath = holder.drop_location() + for(var/atom_to_check in turf_underneath) + if(atom_to_check != src && !insert(atom_to_check, holder)) // Can't insert that + continue + insert(turf_underneath, holder) + +/obj/structure/closet/supplypod/insert(atom/to_insert, atom/movable/holder) + if(insertion_allowed(to_insert)) + if(isturf(to_insert)) + var/turf/turf_to_insert = to_insert + turfs_in_cargo += turf_to_insert.type + turf_to_insert.ScrapeAway() + else + var/atom/movable/movable_to_insert = to_insert + movable_to_insert.forceMove(holder) + return TRUE + else + return FALSE -/obj/structure/closet/supplypod/extractionpod/close(atom/movable/holder) //handles closing, and returns pod - deletes itself when returned - . = ..() - return +/obj/structure/closet/supplypod/insertion_allowed(atom/to_insert) + if(to_insert.invisibility == INVISIBILITY_ABSTRACT) + return FALSE + if(ismob(to_insert)) + if(!reverseOptionList["Mobs"]) + return FALSE + if(!isliving(to_insert)) //let's not put ghosts or camera mobs inside + return FALSE + var/mob/living/mob_to_insert = to_insert + if(mob_to_insert.anchored || mob_to_insert.incorporeal_move) + return FALSE + mob_to_insert.stop_pulling() + + else if(isobj(to_insert)) + var/obj/obj_to_insert = to_insert + if(istype(obj_to_insert, /obj/structure/closet/supplypod)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_smoke)) + return FALSE + if(istype(obj_to_insert, /obj/effect/pod_landingzone)) + return FALSE + if(istype(obj_to_insert, /obj/effect/supplypod_rubble)) + return FALSE + /* + if((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && reverseOptionList["Underfloor"]) + return TRUE + else if ((obj_to_insert.comp_lookup && obj_to_insert.comp_lookup[COMSIG_OBJ_HIDE]) && !reverseOptionList["Underfloor"]) + return FALSE + */ + if(isProbablyWallMounted(obj_to_insert) && reverseOptionList["Wallmounted"]) + return TRUE + else if (isProbablyWallMounted(obj_to_insert) && !reverseOptionList["Wallmounted"]) + return FALSE + if(!obj_to_insert.anchored && reverseOptionList["Unanchored"]) + return TRUE + if(obj_to_insert.anchored && reverseOptionList["Anchored"]) + return TRUE + return FALSE -/obj/structure/closet/supplypod/extractionpod/proc/send_up(atom/movable/holder) - if (!holder) - holder = src + else if (isturf(to_insert)) + if(isfloorturf(to_insert) && reverseOptionList["Floors"]) + return TRUE + if(isfloorturf(to_insert) && !reverseOptionList["Floors"]) + return FALSE + if(isclosedturf(to_insert) && reverseOptionList["Walls"]) + return TRUE + if(isclosedturf(to_insert) && !reverseOptionList["Walls"]) + return FALSE + return FALSE + return TRUE - if (leavingSound) - playsound(get_turf(holder), leavingSound, soundVolume, FALSE, FALSE) +/obj/structure/closet/supplypod/proc/preReturn(atom/movable/holder) + deleteRubble() + animate(holder, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) + animate(holder, pixel_z = 400, time = 10, easing = QUAD_EASING|EASE_IN, flags = ANIMATION_PARALLEL) //Animate our rising pod - handleReturningClose(holder, FALSE) + addtimer(CALLBACK(src, .proc/handleReturnAfterDeparting, holder), 15) //Finish up the pod's duties after a certain amount of time -/obj/structure/closet/supplypod/proc/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open() proc for more details +/obj/structure/closet/supplypod/setOpened() //Proc exists here, as well as in any atom that can assume the role of a "holder" of a supplypod. Check the open_pod() proc for more details + opened = TRUE + density = FALSE + update_icon() + +/obj/structure/closet/supplypod/extractionpod/setOpened() + opened = TRUE + density = TRUE + update_icon() + +/obj/structure/closet/supplypod/setClosed() //Ditto + opened = FALSE + density = TRUE + update_icon() + +/obj/structure/closet/supplypod/proc/tryMakeRubble(turf/T) //Ditto + if (rubble_type == RUBBLE_NONE) + return + if (rubble) + return + if (effectMissile) + return + if (isspaceturf(T) || isclosedturf(T)) + return + rubble = new /obj/effect/supplypod_rubble(T) + rubble.setStyle(rubble_type, src) update_appearance() -/obj/structure/closet/supplypod/proc/setClosed() //Ditto +/obj/structure/closet/supplypod/Moved() + deleteRubble() + return ..() + +/obj/structure/closet/supplypod/proc/deleteRubble() + rubble?.fadeAway() + rubble = null update_appearance() +/obj/structure/closet/supplypod/proc/addGlow() + if (GLOB.podstyles[style][POD_SHAPE] != POD_SHAPE_NORML) + return + glow_effect = new(src) + glow_effect.icon_state = "pod_glow_" + GLOB.podstyles[style][POD_GLOW] + vis_contents += glow_effect + glow_effect.layer = GASFIRE_LAYER + +/obj/structure/closet/supplypod/proc/endGlow() + if(!glow_effect) + return + glow_effect.layer = LOW_ITEM_LAYER + glow_effect.fadeAway(delays[POD_OPENING]) + glow_effect = null + /obj/structure/closet/supplypod/Destroy() - open_pod(holder = src, broken = TRUE) //Lets dump our contents by opening up - . = ..() + open_pod(src, broken = TRUE) //Lets dump our contents by opening up + deleteRubble() + endGlow() + return ..() + +//------------------------------------TEMPORARY_VISUAL-------------------------------------// +/obj/effect/supplypod_smoke //Falling pod smoke + name = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "smoke" + desc = "" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 0 -//------------------------------------FALLING SUPPLY POD-------------------------------------// -/obj/effect/DPfall //Falling pod +/obj/effect/engineglow //Falling pod smoke name = "" icon = 'icons/obj/supplypods.dmi' - pixel_x = -16 - pixel_y = -5 - pixel_z = 200 - desc = "Get out of the way!" - layer = FLY_LAYER//that wasnt flying, that was falling with style! - icon_state = "" - -/obj/effect/DPfall/Initialize(dropLocation, obj/structure/closet/supplypod/pod) - if (pod.style == STYLE_SEETHROUGH) - pixel_x = -16 - pixel_y = 0 - for (var/atom/movable/O in pod.contents) - var/icon/I = getFlatIcon(O) //im so sorry - add_overlay(I) - else if (pod.style != STYLE_INVISIBLE) //Check to ensure the pod isn't invisible - icon_state = "[pod.icon_state]_falling" - name = pod.name + icon_state = "pod_engineglow" + desc = "" + layer = GASFIRE_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 255 + +/obj/effect/engineglow/proc/fadeAway(leaveTime) + var/duration = min(leaveTime, 25) + animate(src, alpha=0, time = duration) + QDEL_IN(src, duration + 5) + +/obj/effect/supplypod_smoke/proc/drawSelf(amount) + alpha = max(0, 255-(amount*20)) + +/obj/effect/supplypod_rubble //This is the object that forceMoves the supplypod to it's location + name = "Debris" + desc = "A small crater of rubble. Closer inspection reveals the debris to be made primarily of space-grade metal fragments. You're pretty sure that this will disperse before too long." + icon = 'icons/obj/supplypods.dmi' + layer = PROJECTILE_HIT_THRESHHOLD_LAYER // We want this to go right below the layer of supplypods and supplypod_rubble's forground. + icon_state = "rubble_bg" + anchored = TRUE + pixel_x = SUPPLYPOD_X_OFFSET + var/foreground = "rubble_fg" + var/verticle_offset = 0 + +/obj/effect/supplypod_rubble/proc/getForeground(obj/structure/closet/supplypod/pod) + var/mutable_appearance/rubble_overlay = mutable_appearance('icons/obj/supplypods.dmi', foreground) + rubble_overlay.appearance_flags = KEEP_APART|RESET_TRANSFORM + rubble_overlay.transform = matrix().Translate(SUPPLYPOD_X_OFFSET - pod.pixel_x, verticle_offset) + return rubble_overlay + +/obj/effect/supplypod_rubble/proc/fadeAway() + animate(src, alpha=0, time = 30) + QDEL_IN(src, 35) + +/obj/effect/supplypod_rubble/proc/setStyle(type, obj/structure/closet/supplypod/pod) + if (type == RUBBLE_WIDE) + icon_state += "_wide" + foreground += "_wide" + if (type == RUBBLE_THIN) + icon_state += "_thin" + foreground += "_thin" + if (pod.style == STYLE_BOX) + verticle_offset = -2 + else + verticle_offset = initial(verticle_offset) + pixel_y = verticle_offset + +/obj/effect/pod_landingzone_effect + name = "" + desc = "" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ_Slider" + layer = PROJECTILE_HIT_THRESHHOLD_LAYER + +/obj/effect/pod_landingzone_effect/Initialize(mapload, obj/structure/closet/supplypod/pod) . = ..() + transform = matrix() * 1.5 + animate(src, transform = matrix()*0.01, time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) -//------------------------------------TEMPORARY_VISUAL-------------------------------------// -/obj/effect/DPtarget //This is the object that forceMoves the supplypod to it's location +/obj/effect/pod_landingzone //This is the object that forceMoves the supplypod to it's location name = "Landing Zone Indicator" desc = "A holographic projection designating the landing zone of something. It's probably best to stand back." - icon = 'icons/mob/actions/actions_items.dmi' - icon_state = "sniper_zoom" + icon = 'icons/obj/supplypods_32x32.dmi' + icon_state = "LZ" layer = PROJECTILE_HIT_THRESHHOLD_LAYER light_range = 2 - var/obj/effect/temp_visual/fallingPod //Temporary "falling pod" that we animate - var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this target + anchored = TRUE + alpha = 0 + var/obj/structure/closet/supplypod/pod //The supplyPod that will be landing ontop of this pod_landingzone + var/obj/effect/pod_landingzone_effect/helper + var/list/smoke_effects = new /list(13) /obj/effect/ex_act() return -/obj/effect/DPtarget/Initialize(mapload, podParam, single_order = null) +/obj/effect/pod_landingzone/Initialize(mapload, podParam, single_order = null, clientman) . = ..() if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) podParam = new podParam() //If its just a path, instantiate it pod = podParam + if (!pod.effectStealth) + helper = new (drop_location(), pod) + alpha = 255 + animate(src, transform = matrix().Turn(90), time = pod.delays[POD_TRANSIT]+pod.delays[POD_FALLING]) if (single_order) if (istype(single_order, /datum/supply_order)) var/datum/supply_order/SO = single_order @@ -312,46 +563,73 @@ else if (istype(single_order, /atom/movable)) var/atom/movable/O = single_order O.forceMove(pod) - for (var/mob/living/M in pod) //If there are any mobs in the supplypod, we want to forceMove them into the target. This is so that they can see where they are about to land, AND so that they don't get sent to the nullspace error room (as the pod is currently in nullspace) - M.forceMove(src) - if(pod.effectStun) //If effectStun is true, stun any mobs caught on this target until the pod gets a chance to hit them - for (var/mob/living/M in get_turf(src)) - M.Stun(pod.landingDelay+10, ignore_canstun = TRUE)//you aint goin nowhere, kid. - if (pod.effectStealth) //If effectStealth is true we want to be invisible - icon_state = "" - if (pod.fallDuration == initial(pod.fallDuration) && pod.landingDelay + pod.fallDuration < pod.fallingSoundLength) + for (var/mob/living/mob_in_pod in pod) //If there are any mobs in the supplypod, we want to set their view to the pod_landingzone. This is so that they can see where they are about to land + mob_in_pod.reset_perspective(src) + if(pod.effectStun) //If effectStun is true, stun any mobs caught on this pod_landingzone until the pod gets a chance to hit them + for (var/mob/living/target_living in get_turf(src)) + target_living.Stun(pod.delays[POD_TRANSIT]+10, ignore_canstun = TRUE)//you ain't goin nowhere, kid. + if (pod.delays[POD_FALLING] == initial(pod.delays[POD_FALLING]) && pod.delays[POD_TRANSIT] + pod.delays[POD_FALLING] < pod.fallingSoundLength) pod.fallingSoundLength = 3 //The default falling sound is a little long, so if the landing time is shorter than the default falling sound, use a special, shorter default falling sound pod.fallingSound = 'sound/weapons/mortar_whistle.ogg' - var/soundStartTime = pod.landingDelay - pod.fallingSoundLength + pod.fallDuration + var/soundStartTime = pod.delays[POD_TRANSIT] - pod.fallingSoundLength + pod.delays[POD_FALLING] if (soundStartTime < 0) soundStartTime = 1 - if (!pod.effectQuiet) + if (!pod.effectQuiet && !(pod.pod_flags & FIRST_SOUNDS)) addtimer(CALLBACK(src, .proc/playFallingSound), soundStartTime) - addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.landingDelay) - -/obj/effect/DPtarget/proc/playFallingSound() - playsound(src, pod.fallingSound, pod.soundVolume, TRUE, 6) - -/obj/effect/DPtarget/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle - fallingPod = new /obj/effect/DPfall(drop_location(), pod) - var/matrix/M = matrix(fallingPod.transform) //Create a new matrix that we can rotate + addtimer(CALLBACK(src, .proc/beginLaunch, pod.effectCircle), pod.delays[POD_TRANSIT]) + +/obj/effect/pod_landingzone/proc/playFallingSound() + playsound(src, pod.fallingSound, pod.soundVolume, 1, 6) + +/obj/effect/pod_landingzone/proc/beginLaunch(effectCircle) //Begin the animation for the pod falling. The effectCircle param determines whether the pod gets to come in from any descent angle + pod.addGlow() + pod.update_icon() + if (pod.style != STYLE_INVISIBLE) + pod.add_filter("motionblur",1,list("type"="motion_blur", "x"=0, "y"=3)) + pod.forceMove(drop_location()) + for (var/mob/living/M in pod) //Remember earlier (initialization) when we moved mobs into the pod_landingzone so they wouldnt get lost in nullspace? Time to get them out + M.reset_perspective(null) var/angle = effectCircle ? rand(0,360) : rand(70,110) //The angle that we can come in from - fallingPod.pixel_x = cos(angle)*400 //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target - fallingPod.pixel_z = sin(angle)*400 - var/rotation = Get_Pixel_Angle(fallingPod.pixel_z, fallingPod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps - M.Turn(rotation) //Turn our matrix accordingly - fallingPod.transform = M //Transform the animated pod according to the matrix - M = matrix(pod.transform) //Make another matrix based on the pod - M.Turn(rotation) //Turn the matrix - pod.transform = M //Turn the actual pod (Won't be visible until endLaunch() proc tho) - animate(fallingPod, pixel_z = 0, pixel_x = -16, time = pod.fallDuration, , easing = LINEAR_EASING) //Make the pod fall! At an angle! - addtimer(CALLBACK(src, .proc/endLaunch), pod.fallDuration, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation - -/obj/effect/DPtarget/proc/endLaunch() - pod.update_appearance() - pod.forceMove(drop_location()) //The fallingPod animation is over, now's a good time to forceMove the actual pod into position - QDEL_NULL(fallingPod) //Delete the falling pod effect, because at this point its animation is over. We dont use temp_visual because we want to manually delete it as soon as the pod appears - for (var/mob/living/M in src) //Remember earlier (initialization) when we moved mobs into the DPTarget so they wouldnt get lost in nullspace? Time to get them out - M.forceMove(pod) + pod.pixel_x = cos(angle)*32*length(smoke_effects) //Use some ADVANCED MATHEMATICS to set the animated pod's position to somewhere on the edge of a circle with the center being the target + pod.pixel_z = sin(angle)*32*length(smoke_effects) + var/rotation = Get_Pixel_Angle(pod.pixel_z, pod.pixel_x) //CUSTOM HOMEBREWED proc that is just arctan with extra steps + setupSmoke(rotation) + pod.transform = matrix().Turn(rotation) + pod.layer = FLY_LAYER + if (pod.style != STYLE_INVISIBLE) + animate(pod.get_filter("motionblur"), y = 0, time = pod.delays[POD_FALLING], flags = ANIMATION_PARALLEL) + animate(pod, pixel_z = -1 * abs(sin(rotation))*4, pixel_x = SUPPLYPOD_X_OFFSET + (sin(rotation) * 20), time = pod.delays[POD_FALLING], easing = LINEAR_EASING, flags = ANIMATION_PARALLEL) //Make the pod fall! At an angle! + addtimer(CALLBACK(src, .proc/endLaunch), pod.delays[POD_FALLING], TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + +/obj/effect/pod_landingzone/proc/setupSmoke(rotation) + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for ( var/i in 1 to length(smoke_effects)) + var/obj/effect/supplypod_smoke/smoke_part = new (drop_location()) + if (i == 1) + smoke_part.layer = FLY_LAYER + smoke_part.icon_state = "smoke_start" + smoke_part.transform = matrix().Turn(rotation) + smoke_effects[i] = smoke_part + smoke_part.pixel_x = sin(rotation)*32 * i + smoke_part.pixel_y = abs(cos(rotation))*32 * i + smoke_part.filters += filter(type = "blur", size = 4) + var/time = (pod.delays[POD_FALLING] / length(smoke_effects))*(length(smoke_effects)-i) + addtimer(CALLBACK(smoke_part, /obj/effect/supplypod_smoke/.proc/drawSelf, i), time, TIMER_CLIENT_TIME) //Go onto the last step after a very short falling animation + QDEL_IN(smoke_part, pod.delays[POD_FALLING] + 35) + +/obj/effect/pod_landingzone/proc/drawSmoke() + if (pod.style == STYLE_INVISIBLE || pod.style == STYLE_SEETHROUGH) + return + for (var/obj/effect/supplypod_smoke/smoke_part in smoke_effects) + animate(smoke_part, alpha = 0, time = 20, flags = ANIMATION_PARALLEL) + animate(smoke_part.filters[1], size = 6, time = 15, easing = CUBIC_EASING|EASE_OUT, flags = ANIMATION_PARALLEL) + +/obj/effect/pod_landingzone/proc/endLaunch() + pod.tryMakeRubble(drop_location()) + pod.layer = initial(pod.layer) + pod.endGlow() + QDEL_NULL(helper) pod.preOpen() //Begin supplypod open procedures. Here effects like explosions, damage, and other dangerous (and potentially admin-caused, if the centcom_podlauncher datum was used) memes will take place + drawSmoke() qdel(src) //The target's purpose is complete. It can rest easy now diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 4c740ad924ae..182ea658a7a9 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -51,7 +51,7 @@ crate.locked = FALSE //Unlock secure crates crate.update_appearance() var/obj/structure/closet/supplypod/pod = make_pod() - new /obj/effect/DPtarget(LZ, pod, crate) + new /obj/effect/pod_landingzone(LZ, pod, crate) ///Handles the creation of the pod, in case it needs to be modified beforehand /datum/round_event/stray_cargo/proc/make_pod() diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 92687709e7d9..3ef68c2345d3 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(islist(original.vars[V])) var/list/L = original.vars[V] O.vars[V] = L.Copy() - else if(istype(original.vars[V], /datum)) + else if(istype(original.vars[V], /datum) || ismob(original.vars[V])) continue // this would reference the original's object, that will break when it is used or deleted. else O.vars[V] = original.vars[V] @@ -52,8 +52,12 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( contained_atom.flags_1 |= HOLOGRAM_1 if(M.circuit) M.circuit.flags_1 |= HOLOGRAM_1 - return O + if(ismob(O)) //Overlays are carried over despite disallowing them, if a fix is found remove this. + var/mob/M = O + M.cut_overlays() + M.regenerate_icons() + return O /area/proc/copy_contents_to(area/A , platingRequired = 0, nerf_weapons = 0) //Takes: Area. Optional: If it should copy to areas that don't have plating diff --git a/icons/effects/supplypod_pickturf.dmi b/icons/effects/supplypod_pickturf.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3ca1131e1a856218f4b565a6706f422110e54a86 GIT binary patch literal 336 zcmV-W0k8gvP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainG%uKjAGg33tGfE(w;*!LY zR3KAHiHkEOv#1!zH00t;D@x2wg|L+sT>V_YCISGQz!()WHs0v~004YRL_t(YiS3lp z4S+BRL|NfhUzKnySHQRJ=z0=>4=@UQ#HuB3*wJplYTHJOxOZ#z-v>Y*HK3 z%>x3(!S*&V8E~(GJ7y~hh{MB@1Zq{w5y46VC)Opf_NJ7b^%lTa!QUj`O@5+;p6V7a ii+|ls^!YE>MQQ*ku^!R&cE#WT0000L*^!tYI%}V;et{}+R z-d5A>n5DKYP?oVI$S;_|;n|HeASb0NB%;J6wK%ybv!En1KaYW-Voq>aK~d@VFTn*L zzdq6O*3~+9=6vvmP=kxc4<6~9_t8AbP;|y;hlO#F@nvH#g*lHV9hnrO5bW96ZLGR^ zg~SPyCy#uzz0UZyZkQ?>^Ec*z8WY2u0}`S}X7^qK?aT9YaSZY3d^_bJ?*RoK=Dkhf zC%7UHYH#?j#kw^lw_Y*ms?s~=P45`hm?CNfFP*vDBO|)(z}oj`9y_gmrn5q<%*By$ z%WWayZ=VC1RN@vbUYUj#%9bZrXoy)7aQSM?! Sq}+R;%?zHdelF{r5}E+-8i7;* literal 0 HcmV?d00001 diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi index 83ee2a87815aa8803499cde973d6c7ea345816c7..3a73559091b2edeccd687eaf7f23812f0173595a 100644 GIT binary patch literal 3319 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 literal 56060 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 DqkAci diff --git a/icons/obj/supplypods_32x32.dmi b/icons/obj/supplypods_32x32.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a7607f716f7ad0e981cedd29b08ec0a0e4b5090b GIT binary patch literal 1640 zcmV-u2ABDXP)V=-0C=2@%{>dkFcgL1Irmpw+Fkrwvq*{rY!^3|kdmtnO%2?{ivQjr;3n;M zUU=ZtcxukNL)B`SiIa~{lz7~1LA<@o14=yXK@8*{LoSiB&4dywe)WAI6KCRJKNSe) zIibWIh&$Vf%Kq`oZ3Qvc;2rUzEZ>VPO>rcXvgN$a{!=wJokG=W_yQm$R#W|7@{9lg z1&K*SK~#90?OQ=>+ejFFO18Tub=G$3H9ffsghHUWNpAWj!H}>UvJldoyj~xI(aD$| zO6e&HIXjCml)aX{`KC)qvnH@m6e?V3i`TU!)-Bl$MtcY|*pA{@wycrsc^BClX+G(_ znQt^R-zStxC2;hQhxuKrSNWUlQ^84n-wgLSY(dCy`qG2i>Bp9nYk@HrzzaOg?^;d- zZojsld&fqAep|a+y~2%p-ejK&x78!~eGC|sh+znH+Ukd?)7JvrMnpd(J0)`zody8tij_Oj*69?&ly=65YOTDF(u1D!q6 zR{{+3&F%Dhzquk`2{4K9-5B6Cymmj`ws{X=3@!j;_+l-ndj-+%znz=tH4`TH+*Y@n z?=c8?4`2*F2=hUBvf;S^=~Tv76Cu{{T!8JJE#z`}TM@jNrFPq3H9ID*j|z}ZWh_n8 zM*1L{rdftzz^EIeG&5G10)RrHU~TVgK~ai0K0Y3a2%4r@ic&=2+W?kU61J|$X=`-4 z7{_wJy$Mt4RL0Wv3KXRXScQaUiyo|t102lvVbc_vlEtZrK0du*$_2J!nOVc##tbAr^nr5Az zlws5j$Z}SA{^FUCPGziKt>5hy=||T?Ae2faq*ED-v`XTuMKKNlkR%DJszTQ*NG4Zt zuy=@Ge@WrGjaS1cs%gQyD8f7lu(c5S|MIxN=ixVPRpxGhgdPZ0In(!S&EYw_5W!!RZpV)8+1oUk!B% zx5LwYFF-ID+y{VYG>TfShG;ZO%YL|b4*>A@r%&`8xu#aD0RWoK<`X~L=gZNI!3AIp zE&yY20T_b|z!+Qr#^3@l1{Z)axB!g71z-#=0Ap|g7=sJI7+e6x-~uoP7l1JwZArGr z^0aTfZ|`j3VDFG#H;G%9gQBMZgm6Oe(n^As5%QN-5>Qo@mPwLCgSCh#T#%b#>w?m$ zj70*d!gFD$s!Bss2=U>$FeUx;q)g8r>>c7@@32FZLZLt-;dp*PC$0(5PSAt-2N1ki4Y`ki<~3p+l2wp@jIQ$SiSNC>@dup?y&p8UVyqFLJlFU(J&E-gy>P%D-gvv zB9RbG)1;fvrfDJ+3ejtcFx6@mu~>{6T3Sg!k|gl_fKFV?4_I7WgsxX8>4fl5=<2_& zS2}k7Tdhmf>ouI8pTjgwG#Vy!y@FUQhHAA6;3{g4#E$mL512&Q<_9E`t03Xz1oe6i zkw^%w)+GSYu#0xIT9=rbx;hf_tJNxux-nFKz#y(<9NZ7kM}EM|-(L=8V0LyEu~-aF z@&j%{Fc{qLCoacL@<$yPM8^OUKK|j|dyC`;7>0p=%+Db1$*3Ec4c+aiU~O#;M@L7P zp1y-t>k`w`cW8(@iIVRA93?H^sSwR(^GUPWgeZ#pcICRRk439*hp+Pk{D4vS0N>{a zu*S$;(E9rNHDY8rEA+|_`0MT4j{E>oj6>He9kb(cC*CXExD;VWTzh^%`;6EwKVW@* m6p#D$f#(M>249Y5jQ;_!pk6}%TTlZ40000 { +const pod_grey = { + color: 'grey', +}; + +const useCompact = (context) => { + const [compact, setCompact] = useLocalState(context, 'compact', false); + const toggleCompact = () => setCompact(!compact); + return [compact, toggleCompact]; +}; + +export const CentcomPodLauncher = (props, context) => { + const [compact] = useCompact(context); return ( - - - - + + ); }; -// This is more or less a direct port from old tgui, with some slight -// text cleanup. But yes, it actually worked like this. -export const CentcomPodLauncherContent = (props, context) => { +const CentcomPodLauncherContent = (props, context) => { + const [compact] = useCompact(context); + return ( + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ {!compact && ( + + + + )} + + + + + + + + + {!compact && ( + + + + )} + + + + + +
+
+
+
+ ); +}; + +const TABPAGES = [ + { + title: 'View Pod', + component: () => TabPod, + }, + { + title: 'View Bay', + component: () => TabBay, + }, + { + title: 'View Dropoff Location', + component: () => TabDrop, + }, +]; + +const REVERSE_OPTIONS = [ + { + title: 'Mobs', + icon: 'user', + }, + { + title: 'Unanchored\nObjects', + key: 'Unanchored', + icon: 'cube', + }, + { + title: 'Anchored\nObjects', + key: 'Anchored', + icon: 'anchor', + }, + { + title: 'Under-Floor', + key: 'Underfloor', + icon: 'eye-slash', + }, + { + title: 'Wall-Mounted', + key: 'Wallmounted', + icon: 'link', + }, + { + title: 'Floors', + icon: 'border-all', + }, + { + title: 'Walls', + icon: 'square', + }, + { + title: 'Mechs', + key: 'Mecha', + icon: 'truck', + }, +]; + +const DELAYS = [ + { + title: 'Pre', + tooltip: 'Time until pod gets to station', + }, + { + title: 'Fall', + tooltip: 'Duration of pods\nfalling animation', + }, + { + title: 'Open', + tooltip: 'Time it takes pod to open after landing', + }, + { + title: 'Exit', + tooltip: 'Time for pod to\nleave after opening', + }, +]; + +const REV_DELAYS = [ + { + title: 'Pre', + tooltip: 'Time until pod appears above dropoff point', + }, + { + title: 'Fall', + tooltip: 'Duration of pods\nfalling animation', + }, + { + title: 'Open', + tooltip: 'Time it takes pod to open after landing', + }, + { + title: 'Exit', + tooltip: 'Time for pod to\nleave after opening', + }, +]; + +const SOUNDS = [ + { + title: 'Fall', + act: 'fallingSound', + tooltip: 'Plays while pod falls, timed\nto end when pod lands', + }, + { + title: 'Land', + act: 'landingSound', + tooltip: 'Plays after pod lands', + }, + { + title: 'Open', + act: 'openingSound', + tooltip: 'Plays when pod opens', + }, + { + title: 'Exit', + act: 'leavingSound', + tooltip: 'Plays when pod leaves', + }, +]; + +const STYLES = [ + { title: 'Standard' }, + { title: 'Advanced' }, + { title: 'Nanotrasen' }, + { title: 'Syndicate' }, + { title: 'Deathsquad' }, + { title: 'Cultist' }, + { title: 'Missile' }, + { title: 'Syndie Missile' }, + { title: 'Supply Box' }, + { title: 'Clown Pod' }, + { title: 'Fruit' }, + { title: 'Invisible' }, + { title: 'Gondola' }, + { title: 'Seethrough' }, +]; + +const BAYS = [ + { title: '1' }, + { title: '2' }, + { title: '3' }, + { title: '4' }, + { title: 'ERT' }, +]; + +const EFFECTS_LOAD = [ + { + title: 'Launch All Turfs', + icon: 'globe', + choiceNumber: 0, + selected: 'launchChoice', + act: 'launchAll', + }, + { + title: 'Launch Turf Ordered', + icon: 'sort-amount-down-alt', + choiceNumber: 1, + selected: 'launchChoice', + act: 'launchOrdered', + }, + { + title: 'Pick Random Turf', + icon: 'dice', + choiceNumber: 2, + selected: 'launchChoice', + act: 'launchRandomTurf', + }, + { + divider: 1, + }, + { + title: 'Launch Whole Turf', + icon: 'expand', + choiceNumber: 0, + selected: 'launchRandomItem', + act: 'launchWholeTurf', + }, + { + title: 'Pick Random Item', + icon: 'dice', + choiceNumber: 1, + selected: 'launchRandomItem', + act: 'launchRandomItem', + }, + { + divider: 1, + }, + { + title: 'Clone', + icon: 'clone', + soloSelected: 'launchClone', + act: 'launchClone', + }, +]; + +const EFFECTS_NORMAL = [ + { + title: 'Specific Target', + icon: 'user-check', + soloSelected: 'effectTarget', + act: 'effectTarget', + }, + { + title: 'Pod Stays', + icon: 'hand-paper', + choiceNumber: 0, + selected: 'effectBluespace', + act: 'effectBluespace', + }, + { + title: 'Stealth', + icon: 'user-ninja', + soloSelected: 'effectStealth', + act: 'effectStealth', + }, + { + title: 'Quiet', + icon: 'volume-mute', + soloSelected: 'effectQuiet', + act: 'effectQuiet', + }, + { + title: 'Missile Mode', + icon: 'rocket', + soloSelected: 'effectMissile', + act: 'effectMissile', + }, + { + title: 'Burst Launch', + icon: 'certificate', + soloSelected: 'effectBurst', + act: 'effectBurst', + }, + { + title: 'Any Descent Angle', + icon: 'ruler-combined', + soloSelected: 'effectCircle', + act: 'effectCircle', + }, + { + title: 'No Ghost Alert\n(If you dont want to\nentertain bored ghosts)', + icon: 'ghost', + choiceNumber: 0, + selected: 'effectAnnounce', + act: 'effectAnnounce', + }, +]; + +const EFFECTS_HARM = [ + { + title: 'Explosion Custom', + icon: 'bomb', + choiceNumber: 1, + selected: 'explosionChoice', + act: 'explosionCustom', + }, + { + title: 'Adminbus Explosion\nWhat are they gonna do, ban you?', + icon: 'bomb', + choiceNumber: 2, + selected: 'explosionChoice', + act: 'explosionBus', + }, + { + divider: 1, + }, + { + title: 'Custom Damage', + icon: 'skull', + choiceNumber: 1, + selected: 'damageChoice', + act: 'damageCustom', + }, + { + title: 'Gib', + icon: 'skull-crossbones', + choiceNumber: 2, + selected: 'damageChoice', + act: 'damageGib', + }, + { + divider: 1, + }, + { + title: 'Projectile Cloud', + details: true, + icon: 'cloud-meatball', + soloSelected: 'effectShrapnel', + act: 'effectShrapnel', + }, + { + title: 'Stun', + icon: 'sun', + soloSelected: 'effectStun', + act: 'effectStun', + }, + { + title: 'Delimb', + icon: 'socks', + soloSelected: 'effectLimb', + act: 'effectLimb', + }, + { + title: 'Yeet Organs', + icon: 'book-dead', + soloSelected: 'effectOrgans', + act: 'effectOrgans', + }, +]; + +const EFFECTS_ALL = [ + { + list: EFFECTS_LOAD, + label: 'Load From', + alt_label: 'Load', + tooltipPosition: 'right', + }, + { + list: EFFECTS_NORMAL, + label: 'Normal Effects', + tooltipPosition: 'bottom', + }, + { + list: EFFECTS_HARM, + label: 'Harmful Effects', + tooltipPosition: 'bottom', + }, +]; + +const ViewTabHolder = (props, context) => { const { act, data } = useBackend(context); + const [tabPageIndex, setTabPageIndex] = useLocalState( + context, + 'tabPageIndex', + 1 + ); + const { mapRef } = data; + const TabPageComponent = TABPAGES[tabPageIndex].component(); return ( - - - To use this, simply spawn the atoms you want in one of the five Centcom - Supplypod Bays. Items in the bay will then be launched inside your - supplypod, one turf-full at a time! You can optionally use the following - buttons to configure how the supplypod acts. - -
- - -
+ ); +}; + +const TabPod = (props, context) => { + return ( + + Note: You can right click on this +
+ blueprint pod and edit vars directly +
+ ); +}; + +const TabBay = (props, context) => { + const { act, data } = useBackend(context); + return ( + <> + + ))} + + ); +}; + +const Bays = (props, context) => { + const { act, data } = useBackend(context); + const [compact] = useCompact(context); + return ( +
+
+ ); +}; + +const Timing = (props, context) => { + const { act, data } = useBackend(context); + return ( +
+
+ ); +}; + +const DelayHelper = (props, context) => { + const { act, data } = useBackend(context); + const { delay_list, reverse = false } = props; + return ( + + {delay_list.map((delay, i) => ( + + toFixed(value, 2)} + maxValue={10} + color={ + (reverse ? data.rev_delays[i + 1] : data.delays[i + 1]) / 10 > 10 + ? 'orange' + : 'default' } + onDrag={(e, value) => { + act('editTiming', { + timer: '' + (i + 1), + value: Math.max(value, 0), + reverse: reverse, + }); + }} /> - - -
+ + ))} + + ); +}; + +const Sounds = (props, context) => { + const { act, data } = useBackend(context); + return ( +
act('soundVolume')} + /> + } + > + {SOUNDS.map((sound, i) => ( +
); }; From 663deefa6dedcc41ca019f2d4f28e868da8787e5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 13 Sep 2023 17:33:49 -0500 Subject: [PATCH 34/57] Automatic changelog generation for PR #2272 [ci skip] --- html/changelogs/AutoChangeLog-pr-2272.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2272.yml diff --git a/html/changelogs/AutoChangeLog-pr-2272.yml b/html/changelogs/AutoChangeLog-pr-2272.yml new file mode 100644 index 000000000000..9ecc2d8a9bdd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2272.yml @@ -0,0 +1,4 @@ +author: thgvr +delete-after: true +changes: + - admin: Improved admin build mode menu and Drop pods from tgstation From 73d8c8b159457315ddf00fe3bc7375b45299f7c9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 14 Sep 2023 00:45:09 +0000 Subject: [PATCH 35/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2133.yml | 4 --- html/changelogs/AutoChangeLog-pr-2223.yml | 4 --- html/changelogs/AutoChangeLog-pr-2272.yml | 4 --- html/changelogs/AutoChangeLog-pr-2285.yml | 4 --- html/changelogs/AutoChangeLog-pr-2307.yml | 4 --- html/changelogs/AutoChangeLog-pr-2321.yml | 19 ------------ html/changelogs/AutoChangeLog-pr-2329.yml | 4 --- html/changelogs/AutoChangeLog-pr-2331.yml | 4 --- html/changelogs/AutoChangeLog-pr-2336.yml | 4 --- html/changelogs/AutoChangeLog-pr-2345.yml | 4 --- html/changelogs/AutoChangeLog-pr-2347.yml | 4 --- html/changelogs/AutoChangeLog-pr-2349.yml | 4 --- html/changelogs/archive/2023-09.yml | 37 +++++++++++++++++++++++ 13 files changed, 37 insertions(+), 63 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2133.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2223.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2272.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2285.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2307.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2321.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2329.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2331.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2336.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2345.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2347.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2349.yml diff --git a/html/changelogs/AutoChangeLog-pr-2133.yml b/html/changelogs/AutoChangeLog-pr-2133.yml deleted file mode 100644 index e9f53fdf7492..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2133.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MarkSuckerberg -delete-after: true -changes: - - admin: Adds lag switch toggles from /tg/, ONLY use them when the lag becomes unbearable! diff --git a/html/changelogs/AutoChangeLog-pr-2223.yml b/html/changelogs/AutoChangeLog-pr-2223.yml deleted file mode 100644 index c81bb6987185..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2223.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Bjarl -delete-after: true -changes: - - rscdel: monkey and wishgranter code diff --git a/html/changelogs/AutoChangeLog-pr-2272.yml b/html/changelogs/AutoChangeLog-pr-2272.yml deleted file mode 100644 index 9ecc2d8a9bdd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2272.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -delete-after: true -changes: - - admin: Improved admin build mode menu and Drop pods from tgstation diff --git a/html/changelogs/AutoChangeLog-pr-2285.yml b/html/changelogs/AutoChangeLog-pr-2285.yml deleted file mode 100644 index 865f6adf63ec..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2285.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: ritorizo -delete-after: true -changes: - - rscadd: Body bags in the autolathe. diff --git a/html/changelogs/AutoChangeLog-pr-2307.yml b/html/changelogs/AutoChangeLog-pr-2307.yml deleted file mode 100644 index 9f4bd5f996af..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2307.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: BarteG44 -delete-after: true -changes: - - rscadd: Added a voice log for the wideband diff --git a/html/changelogs/AutoChangeLog-pr-2321.yml b/html/changelogs/AutoChangeLog-pr-2321.yml deleted file mode 100644 index e5c3c8b52412..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2321.yml +++ /dev/null @@ -1,19 +0,0 @@ -author: PositiveEntropy, tf-4 -delete-after: true -changes: - - rscadd: Adds the CentVend inside Central Command! You're now able to vend Central - Command clothing items for all your commanding needs! - - rscadd: "Nanotrasen has added a new outfit for Special Ops Officers to enjoy, - instead of a simple leather jacket: The CentCom Officer's Coat!" - - rscadd: Re-adds the CentCom Official's suit, making it the default clothing option - for CentCom Officials! The turtlenecks have instead been made to be the standard - ERT uniform. - - imageadd: Thanks to a collaboration between the frontier sector and the core sector, - the parade jackets now boast new and varied apperances for all to enjoy, with - a new parade jacket releasing for the Head of Security! - - imageadd: In no short effort than the finest of tailors, the captain's hat, the - centcom hat, the captain's jumpsuit and the captain's carapace now have finer - gold trims and the finest quality leather available, making them more vibrant - for all! - - imageadd: In no short effort of our best tailors, every Central Command outfit - have been either redesigned or reshaded! All of them! diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml deleted file mode 100644 index 197aa431dbc3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2329.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Apogee-dev -delete-after: true -changes: - - rscdel: Removed guns and ammo from sec spawn outfits diff --git a/html/changelogs/AutoChangeLog-pr-2331.yml b/html/changelogs/AutoChangeLog-pr-2331.yml deleted file mode 100644 index 0d3e82109c2d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2331.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Apogee-dev -delete-after: true -changes: - - balance: nerfed some outlier rifle cartridges for consistency diff --git a/html/changelogs/AutoChangeLog-pr-2336.yml b/html/changelogs/AutoChangeLog-pr-2336.yml deleted file mode 100644 index 352948273c45..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2336.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Zevotech -delete-after: true -changes: - - rscadd: exosuit fabricatiors can now be connected to the RND server via multitool diff --git a/html/changelogs/AutoChangeLog-pr-2345.yml b/html/changelogs/AutoChangeLog-pr-2345.yml deleted file mode 100644 index 7b097aa9fc47..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2345.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -delete-after: true -changes: - - rscdel: ion storms are removed diff --git a/html/changelogs/AutoChangeLog-pr-2347.yml b/html/changelogs/AutoChangeLog-pr-2347.yml deleted file mode 100644 index 9c97f71efd96..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2347.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Skrem7 -delete-after: true -changes: - - spellcheck: typo moment in nt-svg rifle ammo type diff --git a/html/changelogs/AutoChangeLog-pr-2349.yml b/html/changelogs/AutoChangeLog-pr-2349.yml deleted file mode 100644 index 5017aab394e5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2349.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Skrem7 -delete-after: true -changes: - - spellcheck: Bodies that lack ownership are no longer described as "soulless" diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index 8eb857771e62..7dac49601dd5 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -44,3 +44,40 @@ Dethstorm: - rscadd: new stuff to wasteplanet_unhonorable - rscadd: new areas for wasteplanet_unhonorable +2023-09-14: + Apogee-dev: + - balance: nerfed some outlier rifle cartridges for consistency + - rscdel: Removed guns and ammo from sec spawn outfits + BarteG44: + - rscadd: Added a voice log for the wideband + Bjarl: + - rscdel: monkey and wishgranter code + MarkSuckerberg: + - admin: Adds lag switch toggles from /tg/, ONLY use them when the lag becomes unbearable! + PositiveEntropy, tf-4: + - rscadd: Adds the CentVend inside Central Command! You're now able to vend Central + Command clothing items for all your commanding needs! + - rscadd: 'Nanotrasen has added a new outfit for Special Ops Officers to enjoy, + instead of a simple leather jacket: The CentCom Officer''s Coat!' + - rscadd: Re-adds the CentCom Official's suit, making it the default clothing option + for CentCom Officials! The turtlenecks have instead been made to be the standard + ERT uniform. + - imageadd: Thanks to a collaboration between the frontier sector and the core sector, + the parade jackets now boast new and varied apperances for all to enjoy, with + a new parade jacket releasing for the Head of Security! + - imageadd: In no short effort than the finest of tailors, the captain's hat, the + centcom hat, the captain's jumpsuit and the captain's carapace now have finer + gold trims and the finest quality leather available, making them more vibrant + for all! + - imageadd: In no short effort of our best tailors, every Central Command outfit + have been either redesigned or reshaded! All of them! + Skrem7: + - spellcheck: Bodies that lack ownership are no longer described as "soulless" + - spellcheck: typo moment in nt-svg rifle ammo type + Zevotech: + - rscadd: exosuit fabricatiors can now be connected to the RND server via multitool + ritorizo: + - rscadd: Body bags in the autolathe. + thgvr: + - admin: Improved admin build mode menu and Drop pods from tgstation + - rscdel: ion storms are removed From 8f756f27e6d77de055b0901de6eb5126719e10ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 10:59:04 -0500 Subject: [PATCH 36/57] Bump gitpython from 3.1.34 to 3.1.35 in /tools (#2350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.34 to 3.1.35.
Release notes

Sourced from gitpython's releases.

3.1.35 - a fix for CVE-2023-41040

What's Changed

New Contributors

Full Changelog: https://github.com/gitpython-developers/GitPython/compare/3.1.34...3.1.35

Commits
  • c8e303f prepare next release
  • 09e1b3d Merge pull request #1650 from EliahKagan/envcase
  • 8017421 Merge pull request #1647 from CosmosAtlas/master
  • fafb4f6 updated docs to better describe testing procedure with new repo
  • 9da24d4 add test for submodule path not owned by submodule case
  • eebdb25 Eliminate duplication of git.util.cwd logic
  • c7fad20 Fix Windows env var upcasing regression
  • 7296e5c Make test helper script a file, for readability
  • d88372a Add test for Windows env var upcasing regression
  • 11839ab Merge pull request #1648 from EliahKagan/file-protocol
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=gitpython&package-manager=pip&previous-version=3.1.34&new-version=3.1.35)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/shiptest-ss13/Shiptest/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/requirements.txt b/tools/requirements.txt index 90d6435e470b..d7ead1a00123 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -5,7 +5,7 @@ Pillow==9.3.0 # check_regex.py colorama==0.4.4 PyYaml==6.0 -gitpython==3.1.34 +gitpython==3.1.35 unidiff==0.7.0 # changelogs From 5dc5ca10dd39411e266dac8a0f19d3dfe57f3d93 Mon Sep 17 00:00:00 2001 From: Mark Suckerberg Date: Thu, 14 Sep 2023 11:21:31 -0500 Subject: [PATCH 37/57] Removes SSJob (Brutally) (#2127) ## About The Pull Request SSJob is a vestigial part of the codebase, quickly bandaged to support our system. I've slowly stripped it away, but I left it in because it was rooted deeply in a few pieces of code. Today I finally just decided to rip that out too, since SSjob is continuing to break things to this day. Removes: - SSjob, replacing it with three global lists - Job datum slot counts - Gang gamemode (nonfunctional) - Revs gamemode (nonfunctional) - Families gamemode (could you ever call this functional) Adds: - Display order support for crew consoles, based on either job datum or order in the .json file - Returning someone from ajail returns them to their original ship ## Why It's Good For The Game SSJob breaks a lot, and just isn't used. This is another piece of global state that's being removed and replaced with something that better fits us. ## Changelog :cl: del: Gang and revs gamemode (the gear remains) admin: Removes SSjob, occupations are now stored in a global list /:cl: --- code/__DEFINES/jobs.dm | 84 +-- code/__DEFINES/role_preferences.dm | 2 - code/__HELPERS/game.dm | 1 - code/__HELPERS/global_lists.dm | 7 + code/_globalvars/lists/jobs.dm | 3 + code/_onclick/hud/families.dm | 29 - code/_onclick/hud/hud.dm | 5 - code/controllers/subsystem/job.dm | 204 ------- code/controllers/subsystem/mapping.dm | 3 +- code/controllers/subsystem/overmap.dm | 43 ++ code/controllers/subsystem/ticker.dm | 2 - code/datums/components/art.dm | 13 - code/datums/mind.dm | 23 +- code/datums/world_topic.dm | 2 +- code/game/atoms.dm | 5 + .../dynamic/dynamic_rulesets_latejoin.dm | 76 --- .../dynamic/dynamic_rulesets_roundstart.dm | 84 --- code/game/gamemodes/game_mode.dm | 3 - code/game/gamemodes/gang/gang.dm | 498 ---------------- code/game/gamemodes/gang/gang_things.dm | 57 -- code/game/gamemodes/revolution/revolution.dm | 232 -------- code/game/machinery/computer/card.dm | 141 ----- code/game/machinery/computer/crew.dm | 104 +--- code/game/machinery/cryopod.dm | 2 +- code/game/objects/items/crayons.dm | 74 +-- code/game/objects/items/devices/PDA/PDA.dm | 2 +- code/game/objects/items/devices/PDA/cart.dm | 2 +- .../items/implants/implant_mindshield.dm | 11 - .../objects/structures/beds_chairs/chair.dm | 9 +- code/game/objects/structures/statues.dm | 1 - code/modules/admin/admin.dm | 11 +- code/modules/admin/topic.dm | 7 - code/modules/admin/verbs/one_click_antag.dm | 29 - code/modules/admin/verbs/randomverbs.dm | 4 +- .../abductor/machinery/experiment.dm | 2 - code/modules/antagonists/cult/cult.dm | 11 - code/modules/antagonists/ert/ert.dm | 112 ---- .../antagonists/revolution/revolution.dm | 539 ------------------ code/modules/antagonists/wizard/wizard.dm | 3 - code/modules/assembly/flash.dm | 21 - code/modules/clothing/chameleon.dm | 2 +- code/modules/events/devil.dm | 4 +- code/modules/events/fake_virus.dm | 2 +- code/modules/events/heart_attack.dm | 2 +- code/modules/events/pirates.dm | 8 - code/modules/jobs/job_exp.dm | 4 +- code/modules/jobs/job_report.dm | 2 +- code/modules/jobs/job_types/_job.dm | 23 +- code/modules/jobs/job_types/ai.dm | 2 - code/modules/jobs/job_types/assistant.dm | 2 - .../jobs/job_types/atmospheric_technician.dm | 2 - code/modules/jobs/job_types/bartender.dm | 2 - code/modules/jobs/job_types/botanist.dm | 2 - code/modules/jobs/job_types/brig_physician.dm | 2 - code/modules/jobs/job_types/captain.dm | 2 - .../jobs/job_types/cargo_technician.dm | 2 - code/modules/jobs/job_types/chaplain.dm | 2 - code/modules/jobs/job_types/chemist.dm | 2 - code/modules/jobs/job_types/chief_engineer.dm | 2 - .../jobs/job_types/chief_medical_officer.dm | 2 - code/modules/jobs/job_types/clown.dm | 2 - code/modules/jobs/job_types/cook.dm | 2 - code/modules/jobs/job_types/curator.dm | 2 - code/modules/jobs/job_types/cyborg.dm | 2 - code/modules/jobs/job_types/detective.dm | 2 - code/modules/jobs/job_types/geneticist.dm | 4 +- .../jobs/job_types/head_of_personnel.dm | 2 - .../jobs/job_types/head_of_security.dm | 2 - code/modules/jobs/job_types/janitor.dm | 2 - code/modules/jobs/job_types/lawyer.dm | 2 - code/modules/jobs/job_types/medical_doctor.dm | 2 - code/modules/jobs/job_types/mime.dm | 2 - code/modules/jobs/job_types/paramedic.dm | 2 - code/modules/jobs/job_types/prisoner.dm | 2 - code/modules/jobs/job_types/psychologist.dm | 2 - code/modules/jobs/job_types/quartermaster.dm | 2 - .../jobs/job_types/research_director.dm | 2 - code/modules/jobs/job_types/roboticist.dm | 2 - code/modules/jobs/job_types/scientist.dm | 2 - .../jobs/job_types/security_officer.dm | 2 - code/modules/jobs/job_types/shaft_miner.dm | 2 - code/modules/jobs/job_types/solgov_rep.dm | 2 - .../jobs/job_types/station_engineer.dm | 2 - code/modules/jobs/job_types/virologist.dm | 2 - code/modules/jobs/job_types/warden.dm | 2 - code/modules/mob/dead/crew_manifest.dm | 2 +- .../modules/mob/dead/new_player/new_player.dm | 3 +- code/modules/mob/living/carbon/human/death.dm | 1 - .../mob/living/carbon/human/species.dm | 5 - code/modules/mob/living/silicon/login.dm | 3 - .../living/simple_animal/hostile/zombie.dm | 2 +- code/modules/mob/login.dm | 2 - code/modules/mob/mob_helpers.dm | 3 - .../computers/machinery/console_presets.dm | 1 - .../overmap/ships/controlled_ship_datum.dm | 1 + .../chemistry/reagents/alcohol_reagents.dm | 9 - .../nanites/nanite_programs/buffing.dm | 5 +- .../spell_types/pointed/mind_transfer.dm | 2 +- shiptest.dme | 9 +- 99 files changed, 196 insertions(+), 2436 deletions(-) create mode 100644 code/_globalvars/lists/jobs.dm delete mode 100644 code/_onclick/hud/families.dm delete mode 100644 code/controllers/subsystem/job.dm delete mode 100644 code/game/gamemodes/gang/gang.dm delete mode 100644 code/game/gamemodes/gang/gang_things.dm delete mode 100644 code/game/gamemodes/revolution/revolution.dm delete mode 100644 code/modules/antagonists/revolution/revolution.dm diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index c8848f000099..21eb9b40e066 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -8,42 +8,50 @@ #define DEFAULT_RELIGION "Christianity" #define DEFAULT_DEITY "Space Jesus" -#define JOB_DISPLAY_ORDER_DEFAULT 0 - -#define JOB_DISPLAY_ORDER_ASSISTANT 1 -#define JOB_DISPLAY_ORDER_CAPTAIN 2 -#define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 3 -#define JOB_DISPLAY_ORDER_SOLGOV 3.5 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 4 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 5 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 6 -#define JOB_DISPLAY_ORDER_BARTENDER 7 -#define JOB_DISPLAY_ORDER_COOK 8 -#define JOB_DISPLAY_ORDER_BOTANIST 9 -#define JOB_DISPLAY_ORDER_JANITOR 10 -#define JOB_DISPLAY_ORDER_CLOWN 11 -#define JOB_DISPLAY_ORDER_MIME 12 -#define JOB_DISPLAY_ORDER_CURATOR 13 -#define JOB_DISPLAY_ORDER_LAWYER 14 -#define JOB_DISPLAY_ORDER_CHAPLAIN 15 -#define JOB_DISPLAY_ORDER_AI 16 -#define JOB_DISPLAY_ORDER_CYBORG 17 -#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 18 -#define JOB_DISPLAY_ORDER_STATION_ENGINEER 19 -#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 20 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 21 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 22 +#define JOB_DISPLAY_ORDER_CAPTAIN 0 +#define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 1 +#define JOB_DISPLAY_ORDER_SOLGOV 2 + +#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 10 +#define JOB_DISPLAY_ORDER_WARDEN 11 +#define JOB_DISPLAY_ORDER_DETECTIVE 12 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 13 +#define JOB_DISPLAY_ORDER_BRIG_PHYS 14 + +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 20 +#define JOB_DISPLAY_ORDER_CHEMIST 21 +#define JOB_DISPLAY_ORDER_VIROLOGIST 22 #define JOB_DISPLAY_ORDER_PARAMEDIC 23 -#define JOB_DISPLAY_ORDER_CHEMIST 24 -#define JOB_DISPLAY_ORDER_VIROLOGIST 25 -#define JOB_DISPLAY_ORDER_PSYCHOLOGIST 26 -#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 27 -#define JOB_DISPLAY_ORDER_SCIENTIST 28 -#define JOB_DISPLAY_ORDER_ROBOTICIST 29 -#define JOB_DISPLAY_ORDER_GENETICIST 30 -#define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 31 -#define JOB_DISPLAY_ORDER_WARDEN 32 -#define JOB_DISPLAY_ORDER_DETECTIVE 33 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 34 -#define JOB_DISPLAY_ORDER_BRIG_PHYS 35 -#define JOB_DISPLAY_ORDER_PRISONER 36 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 24 +#define JOB_DISPLAY_ORDER_PSYCHOLOGIST 25 + +#define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 30 +#define JOB_DISPLAY_ORDER_SCIENTIST 31 +#define JOB_DISPLAY_ORDER_ROBOTICIST 32 +#define JOB_DISPLAY_ORDER_GENETICIST 33 + +#define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 40 +#define JOB_DISPLAY_ORDER_STATION_ENGINEER 41 +#define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 42 + +#define JOB_DISPLAY_ORDER_QUARTERMASTER 50 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 51 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 52 + +#define JOB_DISPLAY_ORDER_BARTENDER 60 +#define JOB_DISPLAY_ORDER_COOK 61 +#define JOB_DISPLAY_ORDER_BOTANIST 62 +#define JOB_DISPLAY_ORDER_JANITOR 63 +#define JOB_DISPLAY_ORDER_CLOWN 64 +#define JOB_DISPLAY_ORDER_MIME 65 +#define JOB_DISPLAY_ORDER_CURATOR 66 +#define JOB_DISPLAY_ORDER_LAWYER 67 +#define JOB_DISPLAY_ORDER_CHAPLAIN 68 +#define JOB_DISPLAY_ORDER_AI 69 +#define JOB_DISPLAY_ORDER_CYBORG 70 + +#define JOB_DISPLAY_ORDER_PRISONER 75 + +#define JOB_DISPLAY_ORDER_DEFAULT 80 + +#define JOB_DISPLAY_ORDER_ASSISTANT 999 diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 49b56e6f19da..361a24697a39 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -53,7 +53,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_CHANGELING = /datum/game_mode/changeling, ROLE_WIZARD = /datum/game_mode/wizard, ROLE_MALF, - ROLE_REV = /datum/game_mode/revolution, ROLE_ALIEN, ROLE_PAI, ROLE_CULTIST = /datum/game_mode/cult, @@ -66,7 +65,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_DEVIL = /datum/game_mode/devil, ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs, ROLE_SENTIENCE, - ROLE_FAMILIES = /datum/game_mode/gang, ROLE_BORER )) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 438bbdfda28f..1a3c6526150a 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -464,7 +464,6 @@ block( \ //First we spawn a dude. var/mob/living/carbon/human/new_character = new//The mob being spawned. - SSjob.SendToLateJoin(new_character) G_found.client.prefs.copy_to(new_character) new_character.dna.update_dna_identity() diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 9e7350a1d0aa..56f75905b7c4 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -76,6 +76,13 @@ GLOB.materials_list[D.id] = D sortList(GLOB.materials_list, /proc/cmp_typepaths_asc) + //Default Jobs + for(var/path in subtypesof(/datum/job)) + var/datum/job/new_job = new path() + GLOB.occupations += new_job + GLOB.name_occupations[new_job.name] = new_job + GLOB.type_occupations[path] = new_job + // Keybindings init_keybindings() diff --git a/code/_globalvars/lists/jobs.dm b/code/_globalvars/lists/jobs.dm new file mode 100644 index 000000000000..181a39727101 --- /dev/null +++ b/code/_globalvars/lists/jobs.dm @@ -0,0 +1,3 @@ +GLOBAL_LIST_EMPTY(occupations) +GLOBAL_LIST_EMPTY(name_occupations) +GLOBAL_LIST_EMPTY(type_occupations) diff --git a/code/_onclick/hud/families.dm b/code/_onclick/hud/families.dm deleted file mode 100644 index 7f2e11a6ad73..000000000000 --- a/code/_onclick/hud/families.dm +++ /dev/null @@ -1,29 +0,0 @@ -/atom/movable/screen/wanted - name = "Space Police Alertness" - desc = "Shows the current level of hostility the space police is planning to rain down on you. Better be careful." - icon = 'icons/obj/gang/wanted_160x32.dmi' - icon_state = "wanted_0" - base_icon_state = "wanted" - screen_loc = ui_wanted_lvl - ///Wanted level, affects the hud icon. - var/level - ///Boolean, have the cops arrived? If so, the icon stops changing and remains the same. - var/cops_arrived - -/atom/movable/screen/wanted/Initialize() - . = ..() - var/datum/game_mode/gang/F = SSticker.mode - level = F.wanted_level - cops_arrived = F.cops_arrived - update_appearance() - -/atom/movable/screen/wanted/MouseEntered(location,control,params) - . = ..() - openToolTip(usr,src,params,title = name,content = desc, theme = "alerttooltipstyle") - -/atom/movable/screen/wanted/MouseExited() - closeToolTip(usr) - -/atom/movable/screen/wanted/update_icon_state() - icon_state = "[base_icon_state]_[level][cops_arrived ? "_active" : null]" - return ..() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index b7224ced6185..27b220d7fdb7 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -62,10 +62,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/healths var/atom/movable/screen/healthdoll var/atom/movable/screen/internals - var/atom/movable/screen/wanted/wanted_lvl - /*WS begin - var/atom/movable/screen/spacesuit - WS End - Fuckin' spacesuits. */ // subtypes can override this to force a specific UI style var/ui_style @@ -113,7 +109,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null healthdoll = null - wanted_lvl = null internals = null lingchemdisplay = null devilsouldisplay = null diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm deleted file mode 100644 index e02621dd2b66..000000000000 --- a/code/controllers/subsystem/job.dm +++ /dev/null @@ -1,204 +0,0 @@ -SUBSYSTEM_DEF(job) - name = "Jobs" - init_order = INIT_ORDER_JOBS - flags = SS_NO_FIRE - - var/list/occupations = list() //List of all jobs - var/list/datum/job/name_occupations = list() //Dict of all jobs, keys are titles - var/list/type_occupations = list() //Dict of all jobs, keys are types - var/list/prioritized_jobs = list() - - var/overflow_role = "Assistant" - -/datum/controller/subsystem/job/Initialize(timeofday) - if(!occupations.len) - SetupOccupations() - return ..() - -/datum/controller/subsystem/job/proc/SetupOccupations() - occupations = list() - var/list/all_jobs = subtypesof(/datum/job) - if(!all_jobs.len) - to_chat(world, "Error setting up jobs, no job datums found") - return 0 - - for(var/J in all_jobs) - var/datum/job/job = new J() - if(!job) - continue - occupations += job - name_occupations[job.name] = job - type_occupations[J] = job - - return 1 - - -/datum/controller/subsystem/job/proc/GetJob(rank) - if(!occupations.len) - SetupOccupations() - if(istype(rank, /datum/job)) - return rank - return name_occupations[rank] - -/datum/controller/subsystem/job/proc/GetJobType(jobtype) - if(!occupations.len) - SetupOccupations() - return type_occupations[jobtype] - -/datum/controller/subsystem/job/proc/ResetOccupations() - JobDebug("Occupations reset.") - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/player = i - if((player) && (player.mind)) - player.mind.assigned_role = null - player.mind.special_role = null - SetupOccupations() - return - -/datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) - if(!C?.holder) - return TRUE - var/datum/job/job = GetJob(rank) - - var/timegate_expired = FALSE - // allow only forcing deadminning in the first X seconds of the round if auto_deadmin_timegate is set in config - var/timegate = CONFIG_GET(number/auto_deadmin_timegate) - if(timegate && (world.time - SSticker.round_start_time > timegate)) - timegate_expired = TRUE - - if(!job) - return - if((job.auto_deadmin_role_flags & DEADMIN_POSITION_HEAD) && ((CONFIG_GET(flag/auto_deadmin_heads) && !timegate_expired) || (C.prefs?.toggles & DEADMIN_POSITION_HEAD))) - return C.holder.auto_deadmin() - else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SECURITY) && ((CONFIG_GET(flag/auto_deadmin_security) && !timegate_expired) || (C.prefs?.toggles & DEADMIN_POSITION_SECURITY))) - return C.holder.auto_deadmin() - else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SILICON) && ((CONFIG_GET(flag/auto_deadmin_silicons) && !timegate_expired) || (C.prefs?.toggles & DEADMIN_POSITION_SILICON))) //in the event there's ever psuedo-silicon roles added, ie synths. - return C.holder.auto_deadmin() - -/datum/controller/subsystem/job/Recover() - set waitfor = FALSE - var/oldjobs = SSjob.occupations - sleep(20) - for (var/datum/job/J in oldjobs) - INVOKE_ASYNC(src, .proc/RecoverJob, J) - -/datum/controller/subsystem/job/proc/RecoverJob(datum/job/J) - var/datum/job/newjob = GetJob(J.name) - if (!istype(newjob)) - return - newjob.total_positions = J.total_positions - newjob.spawn_positions = J.spawn_positions - newjob.current_positions = J.current_positions - -/atom/proc/JoinPlayerHere(mob/M, buckle) - // By default, just place the mob on the same turf as the marker or whatever. - M.forceMove(get_turf(src)) - -/obj/structure/chair/JoinPlayerHere(mob/M, buckle) - // Placing a mob in a chair will attempt to buckle it, or else fall back to default. - if (buckle && isliving(M) && buckle_mob(M, FALSE, FALSE)) - return - ..() - -/datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE, atom/destination) - if(destination) - destination.JoinPlayerHere(M, buckle) - return TRUE - - if(M.mind && M.mind.assigned_role && length(GLOB.jobspawn_overrides[M.mind.assigned_role])) //We're doing something special today. - destination = pick(GLOB.jobspawn_overrides[M.mind.assigned_role]) - destination.JoinPlayerHere(M, FALSE) - return TRUE - - var/msg = "Unable to send mob [M] to late join!" - message_admins(msg) - CRASH(msg) - - -/////////////////////////////////// -//Keeps track of all living heads// -/////////////////////////////////// -/datum/controller/subsystem/job/proc/get_living_heads() - . = list() - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/player = i - if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.command_positions)) - . |= player.mind - - -//////////////////////////// -//Keeps track of all heads// -//////////////////////////// -/datum/controller/subsystem/job/proc/get_all_heads() - . = list() - for(var/i in GLOB.mob_list) - var/mob/player = i - if(player.mind && (player.mind.assigned_role in GLOB.command_positions)) - . |= player.mind - -////////////////////////////////////////////// -//Keeps track of all living security members// -////////////////////////////////////////////// -/datum/controller/subsystem/job/proc/get_living_sec() - . = list() - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/player = i - if(player.stat != DEAD && player.mind && (player.mind.assigned_role in GLOB.security_positions)) - . |= player.mind - -//////////////////////////////////////// -//Keeps track of all security members// -//////////////////////////////////////// -/datum/controller/subsystem/job/proc/get_all_sec() - . = list() - for(var/i in GLOB.human_list) - var/mob/living/carbon/human/player = i - if(player.mind && (player.mind.assigned_role in GLOB.security_positions)) - . |= player.mind - -/datum/controller/subsystem/job/proc/JobDebug(message) - log_job_debug(message) - -/datum/controller/subsystem/job/proc/get_manifest() - var/list/manifest_out = list() - for(var/datum/overmap/ship/controlled/ship as anything in SSovermap.controlled_ships) - if(!length(ship.manifest)) - continue - manifest_out["[ship.name] ([ship.source_template.short_name])"] = list() - for(var/crewmember in ship.manifest) - var/datum/job/crewmember_job = ship.manifest[crewmember] - manifest_out["[ship.name] ([ship.source_template.short_name])"] += list(list( - "name" = crewmember, - "rank" = crewmember_job.name, - "officer" = crewmember_job.officer - )) - - return manifest_out - -/datum/controller/subsystem/job/proc/get_manifest_html(monochrome = FALSE) - var/list/manifest = get_manifest() - var/dat = {" - - - - "} - for(var/department in manifest) - var/list/entries = manifest[department] - dat += "" - //JUST - var/even = FALSE - for(var/entry in entries) - var/list/entry_list = entry - dat += "" - even = !even - - dat += "
NameRank
[department]
[entry_list["name"]][entry_list["rank"]]
" - dat = replacetext(dat, "\n", "") - dat = replacetext(dat, "\t", "") - return dat diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 0b297fd9de88..05b07967e58d 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -223,7 +223,7 @@ SUBSYSTEM_DEF(mapping) var/value = job_slot_list[job] var/slots if(isnum(value)) - job_slot = SSjob.GetJob(job) + job_slot = GLOB.name_occupations[job] slots = value else if(islist(value)) var/datum/outfit/job_outfit = text2path(value["outfit"]) @@ -231,6 +231,7 @@ SUBSYSTEM_DEF(mapping) stack_trace("Invalid job outfit! [value["outfit"]] on [S.name]'s config! Defaulting to assistant clothing.") job_outfit = /datum/outfit/job/assistant job_slot = new /datum/job(job, job_outfit) + job_slot.display_order = length(S.job_slots) job_slot.wiki_page = value["wiki_page"] job_slot.officer = value["officer"] slots = value["slots"] diff --git a/code/controllers/subsystem/overmap.dm b/code/controllers/subsystem/overmap.dm index 2a09ae4c6ae7..eb6ccfa3c7b4 100644 --- a/code/controllers/subsystem/overmap.dm +++ b/code/controllers/subsystem/overmap.dm @@ -435,6 +435,49 @@ SUBSYSTEM_DEF(overmap) ship_count++ return ship_count +/datum/controller/subsystem/overmap/proc/get_manifest() + var/list/manifest_out = list() + for(var/datum/overmap/ship/controlled/ship as anything in controlled_ships) + if(!length(ship.manifest)) + continue + manifest_out["[ship.name] ([ship.source_template.short_name])"] = list() + for(var/crewmember in ship.manifest) + var/datum/job/crewmember_job = ship.manifest[crewmember] + manifest_out["[ship.name] ([ship.source_template.short_name])"] += list(list( + "name" = crewmember, + "rank" = crewmember_job.name, + "officer" = crewmember_job.officer + )) + + return manifest_out + +/datum/controller/subsystem/overmap/proc/get_manifest_html(monochrome = FALSE) + var/list/manifest = get_manifest() + var/dat = {" + + + + "} + for(var/department in manifest) + var/list/entries = manifest[department] + dat += "" + var/even = FALSE + for(var/entry in entries) + var/list/entry_list = entry + dat += "" + even = !even + + dat += "
NameRank
[department]
[entry_list["name"]][entry_list["rank"]]
" + dat = replacetext(dat, "\n", "") + dat = replacetext(dat, "\t", "") + return dat + /datum/controller/subsystem/overmap/Recover() overmap_objects = SSovermap.overmap_objects controlled_ships = SSovermap.controlled_ships diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 86c76e653f51..fabb64505899 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -240,7 +240,6 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "Unable to start [mode.name]. Not enough players, [mode.required_players] players and [mode.required_enemies] eligible antagonists needed. Reverting to pre-game lobby.") qdel(mode) mode = null - SSjob.ResetOccupations() return 0 CHECK_TICK @@ -254,7 +253,6 @@ SUBSYSTEM_DEF(ticker) log_game("[mode.name] failed pre_setup, cause: [mode.setup_error]") QDEL_NULL(mode) to_chat(world, "Error setting up [GLOB.master_mode]. Reverting to pre-game lobby.") - SSjob.ResetOccupations() return 0 else message_admins("DEBUG: Bypassing prestart checks...") diff --git a/code/datums/components/art.dm b/code/datums/components/art.dm index 0683426ea1c2..13249a19e736 100644 --- a/code/datums/components/art.dm +++ b/code/datums/components/art.dm @@ -51,16 +51,3 @@ if(!do_after(M, 20, target = parent)) return on_obj_examine(source, M) - -/datum/component/art/rev - -/datum/component/art/rev/apply_moodlet(mob/M, impress) - M.visible_message( - "[M] stops to inspect [parent].", - "You take in [parent], inspecting the fine craftsmanship of the proletariat." - ) - - if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) - else - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 97def620c708..50568ef82863 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -87,8 +87,8 @@ /// A lazy list of statuses to add next to this mind in the traitor panel var/list/special_statuses - ///WS edit - Crew objectives variable, stores crew objective datums - var/list/crew_objectives + /// A weakref to the /datum/overmap/ship/controlled the original mob spawned on + var/datum/weakref/original_ship /datum/mind/New(_key) SSticker.minds += src @@ -345,13 +345,6 @@ special_role = null remove_antag_equip() -/datum/mind/proc/remove_rev() - var/datum/antagonist/rev/rev = has_antag_datum(/datum/antagonist/rev) - if(rev) - remove_antag_datum(rev.type) - special_role = null - - /datum/mind/proc/remove_antag_equip() var/list/Mob_Contents = current.get_contents() for(var/obj/item/I in Mob_Contents) @@ -365,7 +358,6 @@ remove_nukeop() remove_wizard() remove_cultist() - remove_rev() /datum/mind/proc/equip_traitor(employer = "The Syndicate", silent = FALSE, datum/antagonist/uplink_owner) if(!current) @@ -441,10 +433,6 @@ if(iscultist(creator)) SSticker.mode.add_cultist(src) - else if(is_revolutionary(creator)) - var/datum/antagonist/rev/converter = creator.mind.has_antag_datum(/datum/antagonist/rev,TRUE) - converter.add_revolutionary(src,FALSE) - else if(is_nuclear_operative(creator)) var/datum/antagonist/nukeop/converter = creator.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE) var/datum/antagonist/nukeop/N = new() @@ -722,13 +710,6 @@ to_chat(current, "You catch a glimpse of the Realm of Nar'Sie, The Geometer of Blood. You now see how flimsy your world is, you see that it should be open to the knowledge of Nar'Sie.") to_chat(current, "Assist your new brethren in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") -/datum/mind/proc/make_Rev() - var/datum/antagonist/rev/head/head = new() - head.give_flash = TRUE - head.give_hud = TRUE - add_antag_datum(head) - special_role = ROLE_REV_HEAD - /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 059caa18db18..3069a050a04d 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -268,7 +268,7 @@ /datum/world_topic/manifest/Run(list/input) . = list() - var/list/manifest = SSjob.get_manifest() + var/list/manifest = SSovermap.get_manifest() for(var/department in manifest) var/list/entries = manifest[department] var/list/dept_entries = list() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 60a61718bd8a..3e97c843fd13 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1652,6 +1652,11 @@ //We inline a MAPTEXT() here, because there's no good way to statically add to a string like this active_hud.screentip_text.maptext = "[name]" +///Called whenever a player is spawned on the same turf as this atom. +/atom/proc/join_player_here(mob/M) + // By default, just place the mob on the same turf as the marker or whatever. + M.forceMove(get_turf(src)) + /* * Used to set something as 'open' if it's being used as a supplypod * diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 04d7a42f4373..228df9bd35f1 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -68,79 +68,3 @@ high_population_requirement = 10 repeatable = TRUE flags = TRAITOR_RULESET - -////////////////////////////////////////////// -// // -// REVOLUTIONARY PROVOCATEUR // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/latejoin/provocateur - name = "Provocateur" - persistent = TRUE - antag_datum = /datum/antagonist/rev/head - antag_flag = ROLE_REV_HEAD - antag_flag_override = ROLE_REV - restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "SolGov Representative") - enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden") - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 1 - weight = 2 - delay = 1 MINUTES // Prevents rule start while head is offstation. - cost = 20 - requirements = list(101,101,70,40,30,20,20,20,20,20) - high_population_requirement = 50 - flags = HIGHLANDER_RULESET - blocking_rules = list(/datum/dynamic_ruleset/roundstart/revs) - var/required_heads_of_staff = 3 - var/finished = FALSE - /// How much threat should be injected when the revolution wins? - var/revs_win_threat_injection = 20 - var/datum/team/revolution/revolution - -/datum/dynamic_ruleset/latejoin/provocateur/ready(forced=FALSE) - if (forced) - required_heads_of_staff = 1 - if(!..()) - return FALSE - var/head_check = 0 - for(var/mob/player in mode.current_players[CURRENT_LIVING_PLAYERS]) - if (player.mind.assigned_role in GLOB.command_positions) - head_check++ - return (head_check >= required_heads_of_staff) - -/datum/dynamic_ruleset/latejoin/provocateur/execute() - var/mob/M = pick(candidates) // This should contain a single player, but in case. - if(check_eligible(M.mind)) // Didnt die/run off z-level/get implanted since leaving shuttle. - assigned += M.mind - M.mind.special_role = antag_flag - revolution = new() - var/datum/antagonist/rev/head/new_head = new() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - new_head = M.mind.add_antag_datum(new_head, revolution) - revolution.update_objectives() - revolution.update_heads() - return TRUE - else - log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") - log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") - return FALSE - -/datum/dynamic_ruleset/latejoin/provocateur/rule_process() - var/winner = revolution.process_victory(revs_win_threat_injection) - if (isnull(winner)) - return - - finished = winner - return RULESET_STOP_PROCESSING - -/// Checks for revhead loss conditions and other antag datums. -/datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(datum/mind/M) - if(!considered_afk(M) && considered_alive(M) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) - return TRUE - return FALSE - -/datum/dynamic_ruleset/latejoin/provocateur/round_result() - revolution.round_result(finished) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index f3d11c3a399b..29333ce332d4 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -330,90 +330,6 @@ SSticker.mode_result = "halfwin - interrupted" SSticker.news_report = OPERATIVE_SKIRMISH -////////////////////////////////////////////// -// // -// REVS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/revs - name = "Revolution" - persistent = TRUE - antag_flag = ROLE_REV_HEAD - antag_flag_override = ROLE_REV - antag_datum = /datum/antagonist/rev/head - minimum_required_age = 14 - restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "SolGov Representative") - required_candidates = 3 - weight = 2 - delay = 7 MINUTES - cost = 35 - requirements = list(101,101,70,40,30,20,10,10,10,10) - high_population_requirement = 10 - antag_cap = list(3,3,3,3,3,3,3,3,3,3) - flags = HIGHLANDER_RULESET - blocking_rules = list(/datum/dynamic_ruleset/latejoin/provocateur) - // I give up, just there should be enough heads with 35 players... - minimum_players = 35 - /// How much threat should be injected when the revolution wins? - var/revs_win_threat_injection = 20 - var/datum/team/revolution/revolution - var/finished = FALSE - -/datum/dynamic_ruleset/roundstart/revs/pre_execute() - . = ..() - var/max_candidates = antag_cap[indice_pop] - mode.antags_rolled += max_candidates - for(var/i = 1 to max_candidates) - if(candidates.len <= 0) - break - var/mob/M = pick_n_take(candidates) - assigned += M.mind - M.mind.restricted_roles = restricted_roles - M.mind.special_role = antag_flag - GLOB.pre_setup_antags += M.mind - return TRUE - -/datum/dynamic_ruleset/roundstart/revs/execute() - revolution = new() - for(var/datum/mind/M in assigned) - GLOB.pre_setup_antags -= M - if(check_eligible(M)) - var/datum/antagonist/rev/head/new_head = new antag_datum() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - M.add_antag_datum(new_head,revolution) - else - assigned -= M - log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") - if(revolution.members.len) - revolution.update_objectives() - revolution.update_heads() - return TRUE - log_game("DYNAMIC: [ruletype] [name] failed to get any eligible headrevs. Refunding [cost] threat.") - return FALSE - -/datum/dynamic_ruleset/roundstart/revs/clean_up() - qdel(revolution) - ..() - -/datum/dynamic_ruleset/roundstart/revs/rule_process() - var/winner = revolution.process_victory(revs_win_threat_injection) - if (isnull(winner)) - return - - finished = winner - return RULESET_STOP_PROCESSING - -/// Checks for revhead loss conditions and other antag datums. -/datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(datum/mind/M) - if(!considered_afk(M) && considered_alive(M) && !M.antag_datums?.len && !HAS_TRAIT(M, TRAIT_MINDSHIELD)) - return TRUE - return FALSE - -/datum/dynamic_ruleset/roundstart/revs/round_result() - revolution.round_result(finished) // Admin only rulesets. The threat requirement is 101 so it is not possible to roll them. diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 61c3efab9582..53f6f85f71b5 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -420,9 +420,6 @@ /datum/game_mode/proc/remove_antag_for_borging(datum/mind/newborgie) SSticker.mode.remove_cultist(newborgie, 0, 0) - var/datum/antagonist/rev/rev = newborgie.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(TRUE) /datum/game_mode/proc/generate_station_goals() var/list/possible = list() diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm deleted file mode 100644 index 1682a27584fd..000000000000 --- a/code/game/gamemodes/gang/gang.dm +++ /dev/null @@ -1,498 +0,0 @@ -#define LOWPOP_FAMILIES_COUNT 50 - -#define TWO_STARS_HIGHPOP 11 -#define THREE_STARS_HIGHPOP 16 -#define FOUR_STARS_HIGHPOP 21 -#define FIVE_STARS_HIGHPOP 31 - -#define TWO_STARS_LOW 6 -#define THREE_STARS_LOW 9 -#define FOUR_STARS_LOW 12 -#define FIVE_STARS_LOW 15 - -#define CREW_SIZE_MIN 4 -#define CREW_SIZE_MAX 8 - - -GLOBAL_VAR_INIT(deaths_during_shift, 0) -/datum/game_mode/gang - name = "Families" - config_tag = "families" - antag_flag = ROLE_FAMILIES - false_report_weight = 5 - required_players = 40 - required_enemies = 6 - recommended_enemies = 6 - announce_span = "danger" - announce_text = "Grove For Lyfe!" - reroll_friendly = FALSE - restricted_jobs = list("Cyborg", "AI", "Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")//N O - protected_jobs = list() - var/check_counter = 0 - var/endtime = null - var/start_time = null - var/fuckingdone = FALSE - var/time_to_end = 60 MINUTES - var/gangs_to_generate = 3 - var/list/gangs_to_use - var/list/datum/mind/gangbangers = list() - var/list/datum/mind/pigs = list() - var/list/datum/mind/undercover_cops = list() - var/list/gangs = list() - var/gangs_still_alive = 0 - var/sent_announcement = FALSE - var/list/gang_locations = list() - var/cops_arrived = FALSE - var/gang_balance_cap = 5 - var/wanted_level = 0 - -/datum/game_mode/gang/warriors - name = "Warriors" - config_tag = "warriors" - announce_text = "Can you survive this onslaught?" - gangs_to_generate = 11 - gang_balance_cap = 3 - -/datum/game_mode/gang/warriors/pre_setup() - gangs_to_use = subtypesof(/datum/antagonist/gang) - gangs_to_generate = gangs_to_use.len - . = ..() - -/datum/game_mode/gang/pre_setup() - gangs_to_use = subtypesof(/datum/antagonist/gang) - for(var/j = 0, j < gangs_to_generate, j++) - if (!antag_candidates.len) - break - var/datum/mind/gangbanger = antag_pick(antag_candidates) - gangbangers += gangbanger - gangbanger.restricted_roles = restricted_jobs - log_game("[key_name(gangbanger)] has been selected as a starting gangster!") - antag_candidates.Remove(gangbanger) - for(var/j = 0, j < gangs_to_generate, j++) - if(!antag_candidates.len) - break - var/datum/mind/one_eight_seven_on_an_undercover_cop = antag_pick(antag_candidates) - pigs += one_eight_seven_on_an_undercover_cop - undercover_cops += one_eight_seven_on_an_undercover_cop - one_eight_seven_on_an_undercover_cop.restricted_roles = restricted_jobs - log_game("[key_name(one_eight_seven_on_an_undercover_cop)] has been selected as a starting undercover cop!") - antag_candidates.Remove(one_eight_seven_on_an_undercover_cop) - endtime = world.time + time_to_end - start_time = world.time - return TRUE - -/datum/game_mode/gang/post_setup() - var/replacement_gangsters = 0 - var/replacement_cops = 0 - for(var/datum/mind/gangbanger in gangbangers) - if(!ishuman(gangbanger.current)) - gangbangers.Remove(gangbanger) - log_game("[gangbanger] was not a human, and thus has lost their gangster role.") - replacement_gangsters++ - if(replacement_gangsters) - for(var/j = 0, j < replacement_gangsters, j++) - if(!antag_candidates.len) - log_game("Unable to find more replacement gangsters. Not all of the gangs will spawn.") - break - var/datum/mind/gangbanger = antag_pick(antag_candidates) - gangbangers += gangbanger - log_game("[key_name(gangbanger)] has been selected as a replacement gangster!") - for(var/datum/mind/undercover_cop in undercover_cops) - if(!ishuman(undercover_cop.current)) - undercover_cops.Remove(undercover_cop) - pigs.Remove(undercover_cop) - log_game("[undercover_cop] was not a human, and thus has lost their undercover cop role.") - replacement_cops++ - if(replacement_cops) - for(var/j = 0, j < replacement_cops, j++) - if(!antag_candidates.len) - log_game("Unable to find more replacement undercover cops. Not all of the gangs will spawn.") - break - var/datum/mind/undercover_cop = antag_pick(antag_candidates) - undercover_cops += undercover_cop - pigs += undercover_cop - log_game("[key_name(undercover_cop)] has been selected as a replacement undercover cop!") - for(var/datum/mind/undercover_cop in undercover_cops) - var/datum/antagonist/ert/families/undercover_cop/one_eight_seven_on_an_undercover_cop = new() - undercover_cop.add_antag_datum(one_eight_seven_on_an_undercover_cop) - - for(var/datum/mind/gangbanger in gangbangers) - var/gang_to_use = pick_n_take(gangs_to_use) - var/datum/antagonist/gang/new_gangster = new gang_to_use() - var/datum/team/gang/ballas = new /datum/team/gang() - new_gangster.my_gang = ballas - new_gangster.starter_gangster = TRUE - gangs += ballas - ballas.add_member(gangbanger) - ballas.name = new_gangster.gang_name - - ballas.acceptable_clothes = new_gangster.acceptable_clothes.Copy() - ballas.free_clothes = new_gangster.free_clothes.Copy() - ballas.my_gang_datum = new_gangster - - for(var/C in ballas.free_clothes) - var/obj/O = new C(gangbanger.current) - var/list/slots = list ( - "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET - ) - var/mob/living/carbon/human/H = gangbanger.current - var/equipped = H.equip_in_one_of_slots(O, slots) - if(!equipped) - to_chat(gangbanger.current, "Unfortunately, you could not bring your [O] to this shift. You will need to find one.") - qdel(O) - - gangbanger.add_antag_datum(new_gangster) - gangbanger.current.playsound_local(gangbanger.current, 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE) - to_chat(gangbanger.current, "As you're the first gangster, your uniform and spraycan are in your inventory!") - addtimer(CALLBACK(src, .proc/announce_gang_locations), 5 MINUTES) - addtimer(CALLBACK(src, .proc/five_minute_warning), time_to_end - 5 MINUTES) - gamemode_ready = TRUE - ..() - -/datum/game_mode/gang/proc/announce_gang_locations() - var/list/readable_gang_names = list() - for(var/GG in gangs) - var/datum/team/gang/G = GG - readable_gang_names += "[G.name]" - var/finalized_gang_names = english_list(readable_gang_names) - priority_announce("Julio G coming to you live from Radio Los Spess! We've been hearing reports of gang activity on [station_name()], with the [finalized_gang_names] duking it out, looking for fresh territory and drugs to sling! Stay safe out there for the hour 'till the space cops get there, and keep it cool, yeah?\n\n The local jump gates are shut down for about an hour due to some maintenance troubles, so if you wanna split from the area you're gonna have to wait an hour. \n Play music, not gunshots, I say. Peace out!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg') - sent_announcement = TRUE - -/datum/game_mode/gang/proc/five_minute_warning() - priority_announce("Julio G coming to you live from Radio Los Spess! The space cops are closing in on [station_name()] and will arrive in about 5 minutes! Better clear on out of there if you don't want to get hurt!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg') - -/datum/game_mode/gang/check_win() - var/alive_gangsters = 0 - var/alive_cops = 0 - for(var/datum/mind/gangbanger in gangbangers) - if(!ishuman(gangbanger.current)) - continue - var/mob/living/carbon/human/H = gangbanger.current - if(H.stat) - continue - alive_gangsters++ - for(var/datum/mind/bacon in pigs) - if(!ishuman(bacon.current)) // always returns false - continue - var/mob/living/carbon/human/H = bacon.current - if(H.stat) - continue - alive_cops++ - if(alive_gangsters > alive_cops) - SSticker.mode_result = "win - gangs survived" - SSticker.news_report = GANG_OPERATING - return TRUE - SSticker.mode_result = "loss - police destroyed the gangs" - SSticker.news_report = GANG_DESTROYED - return FALSE - -/datum/game_mode/gang/process() - check_wanted_level() - check_counter++ - if(check_counter >= 5) - if (world.time > endtime && !fuckingdone) - fuckingdone = TRUE - send_in_the_fuzz() - check_counter = 0 - SSticker.mode.check_win() - - check_tagged_turfs() - check_gang_clothes() - check_rollin_with_crews() - -///Checks if our wanted level has changed. Only actually does something post the initial announcement and until the cops are here. After that its locked. -/datum/game_mode/gang/proc/check_wanted_level() - if(!sent_announcement || cops_arrived) - return - var/new_wanted_level - if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT) - switch(GLOB.deaths_during_shift) - if(0 to TWO_STARS_HIGHPOP-1) - new_wanted_level = 1 - if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1) - new_wanted_level = 2 - if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1) - new_wanted_level = 3 - if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1) - new_wanted_level = 4 - if(FIVE_STARS_HIGHPOP to INFINITY) - new_wanted_level = 5 - else - switch(GLOB.deaths_during_shift) - if(0 to TWO_STARS_LOW-1) - new_wanted_level = 1 - if(TWO_STARS_LOW to THREE_STARS_LOW-1) - new_wanted_level = 2 - if(THREE_STARS_LOW to FOUR_STARS_LOW-1) - new_wanted_level = 3 - if(FOUR_STARS_LOW to FIVE_STARS_LOW-1) - new_wanted_level = 4 - if(FIVE_STARS_LOW to INFINITY) - new_wanted_level = 5 - update_wanted_level(new_wanted_level) - -///Updates the icon states for everyone and sends outs announcements regarding the police. -/datum/game_mode/gang/proc/update_wanted_level(newlevel) - if(newlevel > wanted_level) - on_gain_wanted_level(newlevel) - else if (newlevel < wanted_level) - on_lower_wanted_level(newlevel) - wanted_level = newlevel - for(var/i in GLOB.player_list) - var/mob/M = i - if(!M.hud_used?.wanted_lvl) - continue - var/datum/hud/H = M.hud_used - H.wanted_lvl.level = newlevel - H.wanted_lvl.cops_arrived = cops_arrived - H.wanted_lvl.update_appearance() - -/datum/game_mode/gang/proc/on_gain_wanted_level(newlevel) - var/announcement_message - switch(newlevel) - if(2) - announcement_message = "Small amount of police vehicles have been spotted en route towards [station_name()]. They will arrive at the 50 minute mark." - endtime = start_time + 50 MINUTES - if(3) - announcement_message = "A large detachment police vehicles have been spotted en route towards [station_name()]. They will arrive at the 40 minute mark." - endtime = start_time + 40 MINUTES - if(4) - announcement_message = "A detachment of top-trained agents has been spotted on their way to [station_name()]. They will arrive at the 35 minute mark." - endtime = start_time + 35 MINUTES - if(5) - announcement_message = "The fleet enroute to [station_name()] now consists of national guard personnel. They will arrive at the 30 minute mark." - endtime = start_time + 30 MINUTES - priority_announce(announcement_message, "Station Spaceship Detection Systems") - -/datum/game_mode/gang/proc/on_lower_wanted_level(newlevel) - var/announcement_message - switch(newlevel) - if(1) - announcement_message = "There are now only a few police vehicle headed towards [station_name()]. They will arrive at the 60 minute mark." - endtime = start_time + 60 MINUTES - if(2) - announcement_message = "There seem to be fewer police vehicles headed towards [station_name()]. They will arrive at the 50 minute mark." - endtime = start_time + 50 MINUTES - if(3) - announcement_message = "There are no longer top-trained agents in the fleet headed towards [station_name()]. They will arrive at the 40 minute mark." - endtime = start_time + 40 MINUTES - if(4) - announcement_message = "The convoy enroute to [station_name()] seems to no longer consist of national guard personnel. They will arrive at the 35 minute mark." - endtime = start_time + 35 MINUTES - priority_announce(announcement_message, "Station Spaceship Detection Systems") - -/datum/game_mode/gang/proc/send_in_the_fuzz() - var/team_size - var/cops_to_send - var/announcement_message = "PUNK ASS BALLA BITCH" - var/announcer = "Spinward Stellar Coalition" - if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT) - switch(wanted_level) - if(1) - team_size = 8 - cops_to_send = /datum/antagonist/ert/families/beatcop - announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!" - announcer = "Spinward Stellar Coalition Police Department" - if(2) - team_size = 9 - cops_to_send = /datum/antagonist/ert/families/beatcop/armored - announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day." - announcer = "Spinward Stellar Coalition Police Department" - if(3) - team_size = 10 - cops_to_send = /datum/antagonist/ert/families/beatcop/swat - announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day." - announcer = "Spinward Stellar Coalition Police Department" - if(4) - team_size = 11 - cops_to_send = /datum/antagonist/ert/families/beatcop/fbi - announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions." - announcer = "Federal Bureau of Investigation" - if(5) - team_size = 12 - cops_to_send = /datum/antagonist/ert/families/beatcop/military - announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians." - announcer = "Spinward Stellar Coalition National Guard" - else - switch(wanted_level) - if(1) - team_size = 5 - cops_to_send = /datum/antagonist/ert/families/beatcop - announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!" - announcer = "Spinward Stellar Coalition Police Department" - if(2) - team_size = 6 - cops_to_send = /datum/antagonist/ert/families/beatcop/armored - announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day." - announcer = "Spinward Stellar Coalition Police Department" - if(3) - team_size = 7 - cops_to_send = /datum/antagonist/ert/families/beatcop/swat - announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day." - announcer = "Spinward Stellar Coalition Police Department" - if(4) - team_size = 8 - cops_to_send = /datum/antagonist/ert/families/beatcop/fbi - announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions." - announcer = "Federal Bureau of Investigation" - if(5) - team_size = 10 - cops_to_send = /datum/antagonist/ert/families/beatcop/military - announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians." - announcer = "Spinward Stellar Coalition National Guard" - - priority_announce(announcement_message, announcer, 'sound/effects/families_police.ogg') - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to help clean up crime on this station?", "deathsquad", null) - - - if(candidates.len) - //Pick the (un)lucky players - var/numagents = min(team_size,candidates.len) - - var/list/spawnpoints = GLOB.emergencyresponseteamspawn - var/index = 0 - while(numagents && candidates.len) - var/spawnloc = spawnpoints[index+1] - //loop through spawnpoints one at a time - index = (index + 1) % spawnpoints.len - var/mob/dead/observer/chosen_candidate = pick(candidates) - candidates -= chosen_candidate - if(!chosen_candidate.key) - continue - - //Spawn the body - var/mob/living/carbon/human/cop = new(spawnloc) - chosen_candidate.client.prefs.copy_to(cop) - cop.key = chosen_candidate.key - - //Give antag datum - var/datum/antagonist/ert/ert_antag = new cops_to_send - - cop.mind.add_antag_datum(ert_antag) - cop.mind.assigned_role = ert_antag.name - SSjob.SendToLateJoin(cop) - - //Logging and cleanup - log_game("[key_name(cop)] has been selected as an [ert_antag.name]") - numagents-- - cops_arrived = TRUE - update_wanted_level() //Will make sure our icon updates properly - return TRUE - -/datum/game_mode/gang/proc/check_tagged_turfs() - for(var/T in GLOB.gang_tags) - var/obj/effect/decal/cleanable/crayon/gang/tag = T - if(tag.my_gang) - tag.my_gang.adjust_points(50) - CHECK_TICK - -/datum/game_mode/gang/proc/check_gang_clothes() // TODO: make this grab the sprite itself, average out what the primary color would be, then compare how close it is to the gang color so I don't have to manually fill shit out for 5 years for every gang type - for(var/mob/living/carbon/human/H in GLOB.player_list) - if(!H.mind || !H.client) - continue - var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang) - for(var/clothing in list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.back, H.gloves, H.shoes, H.belt, H.s_store, H.glasses, H.ears, H.wear_id)) - if(is_gangster) - if(is_type_in_list(clothing, is_gangster.acceptable_clothes)) - is_gangster.add_gang_points(10) - else - for(var/G in gangs) - var/datum/team/gang/gang_clothes = G - if(is_type_in_list(clothing, gang_clothes.acceptable_clothes)) - gang_clothes.adjust_points(5) - - CHECK_TICK - -/datum/game_mode/gang/proc/check_rollin_with_crews() - var/list/areas_to_check = list() - for(var/G in gangbangers) - var/datum/mind/gangster = G - areas_to_check += get_area(gangster.current) - for(var/AA in areas_to_check) - var/area/A = AA - var/list/gang_members = list() - for(var/mob/living/carbon/human/H in A) - if(H.stat || !H.mind || !H.client) - continue - var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang) - if(is_gangster) - gang_members[is_gangster.my_gang]++ - CHECK_TICK - if(gang_members.len) - for(var/datum/team/gang/gangsters in gang_members) - if(gang_members[gangsters] >= CREW_SIZE_MIN) - if(gang_members[gangsters] >= CREW_SIZE_MAX) - gangsters.adjust_points(5) // Discourage larger clumps, spread ur people out - else - gangsters.adjust_points(10) - - -/datum/game_mode/gang/generate_report() - return "Potential violent criminal activity has been detected on board your station, and we believe the Spinward Stellar Coalition may be conducting an audit of us. Keep an eye out for tagging of turf, color coordination, and suspicious people asking you to say things a little closer to their chest." - -/datum/game_mode/gang/send_intercept(report = 0) - return - -/datum/game_mode/gang/special_report() - var/list/report = list() - var/highest_point_value = 0 - var/highest_gang = "Leet Like Jeff K" - report += "The families in the round were:" - var/objective_failures = TRUE - for(var/datum/team/gang/GG in gangs) - if(GG.my_gang_datum.check_gang_objective()) - objective_failures = FALSE - break - for(var/datum/team/gang/G in gangs) - report += "[G.name]:" - if(G.members.len) - report += "[G.my_gang_datum.roundend_category] were:" - report += printplayerlist(G.members) - report += "Points: [G.points]" - report += "Objective: [G.my_gang_datum.gang_objective]" - if(G.my_gang_datum.check_gang_objective()) - report += "The family completed their objective!" - else - report += "The family failed their objective!" - else - report += "The family was wiped out!" - if(!objective_failures) - if(G.points >= highest_point_value && G.members.len && G.my_gang_datum.check_gang_objective()) - highest_point_value = G.points - highest_gang = G.name - else - if(G.points >= highest_point_value && G.members.len) - highest_point_value = G.points - highest_gang = G.name - var/alive_gangsters = 0 - var/alive_cops = 0 - for(var/datum/mind/gangbanger in gangbangers) - if(gangbanger.current) - if(!ishuman(gangbanger.current)) - continue - var/mob/living/carbon/human/H = gangbanger.current - if(H.stat) - continue - alive_gangsters++ - for(var/datum/mind/bacon in pigs) - if(bacon.current) - if(!ishuman(bacon.current)) // always returns false - continue - var/mob/living/carbon/human/H = bacon.current - if(H.stat) - continue - alive_cops++ - if(alive_gangsters > alive_cops) - if(!objective_failures) - report += "[highest_gang] won the round by completing their objective and having the most points!" - else - report += "[highest_gang] won the round by having the most points!" - else if(alive_gangsters == alive_cops) - report += "Legend has it the police and the families are still duking it out to this day!" - else - report += "The police put the boots to the families, medium style!" - - - return "
[report.Join("
")]
" diff --git a/code/game/gamemodes/gang/gang_things.dm b/code/game/gamemodes/gang/gang_things.dm deleted file mode 100644 index 5871ed6a24cf..000000000000 --- a/code/game/gamemodes/gang/gang_things.dm +++ /dev/null @@ -1,57 +0,0 @@ -/obj/item/gang_induction_package - name = "family signup package" - icon = 'icons/obj/gang/signup_points.dmi' - icon_state = "signup_book" - var/gang_to_use - var/datum/team/gang/team_to_use - - -/obj/item/gang_induction_package/attack_self(mob/living/user) - ..() - if(HAS_TRAIT(user, TRAIT_MINDSHIELD)) - to_chat(user, "You attended a seminar on not signing up for a gang, and are not interested.") - return - if(user.mind.has_antag_datum(/datum/antagonist/ert/families)) - to_chat(user, "As a police officer, you can't join this family. However, you pretend to accept it to keep your cover up.") - for(var/threads in team_to_use.free_clothes) - new threads(get_turf(user)) - qdel(src) - return - var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang) - if(is_gangster && is_gangster.starter_gangster) - to_chat(user, "You started your family. You can't turn your back on it now.") - return - attempt_join_gang(user) - -/obj/item/gang_induction_package/proc/add_to_gang(mob/living/user) - var/datum/game_mode/gang/F = SSticker.mode - var/datum/antagonist/gang/swappin_sides = new gang_to_use() - user.mind.add_antag_datum(swappin_sides) - var/policy = get_policy(ROLE_FAMILIES) - if(policy) - to_chat(user, policy) - swappin_sides.my_gang = team_to_use - user.playsound_local(user, 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE) - team_to_use.add_member(user.mind) - for(var/threads in team_to_use.free_clothes) - new threads(get_turf(user)) - if (!F.gangbangers.Find(user.mind)) - F.gangbangers += user.mind - team_to_use.adjust_points(30) - - -/obj/item/gang_induction_package/proc/attempt_join_gang(mob/living/user) - if(user && user.mind) - var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang) - if(is_gangster) - if(is_gangster.my_gang == team_to_use) - return - else - is_gangster.my_gang.adjust_points(-30) - is_gangster.my_gang.remove_member(user.mind) - user.mind.remove_antag_datum(/datum/antagonist/gang) - add_to_gang(user) - qdel(src) - else - add_to_gang(user) - qdel(src) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm deleted file mode 100644 index 9c0d6fc8c905..000000000000 --- a/code/game/gamemodes/revolution/revolution.dm +++ /dev/null @@ -1,232 +0,0 @@ -// To add a rev to the list of revolutionaries, make sure it's rev (with if(SSticker.mode.name == "revolution)), -// then call SSticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) -// nothing else needs to be done, as that proc will check if they are a valid target. -// Just make sure the converter is a head before you call it! -// To remove a rev (from brainwashing or w/e), call SSticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), -// this will also check they're not a head, so it can just be called freely -// If the game somtimes isn't registering a win properly, then SSticker.mode.check_win() isn't being called somewhere. - - -/datum/game_mode/revolution - name = "revolution" - config_tag = "revolution" - report_type = "revolution" - antag_flag = ROLE_REV - false_report_weight = 10 - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician", "SolGov Representative", "Prisoner") //WS edit - Brig Physicians, SolGov Rep - required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present - required_players = 20 - required_enemies = 1 - recommended_enemies = 3 - enemy_minimum_age = 14 - - announce_span = "Revolution" - announce_text = "Some crewmembers are attempting a coup!\n\ - Revolutionaries: Expand your cause and overthrow the heads of staff by execution or otherwise.\n\ - Crew: Prevent the revolutionaries from taking over the station." - - var/finished = 0 - var/check_counter = 0 - var/max_headrevs = 3 - var/datum/team/revolution/revolution - var/list/datum/mind/headrev_candidates = list() - var/end_when_heads_dead = TRUE - -/////////////////////////////////////////////////////////////////////////////// -//Gets the round setup, cancelling if there's not enough players at the start// -/////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/revolution/pre_setup() - - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - restricted_jobs += protected_jobs - - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - restricted_jobs += "Assistant" - - for (var/i=1 to max_headrevs) - if (antag_candidates.len==0) - break - var/datum/mind/lenin = antag_pick(antag_candidates) - antag_candidates -= lenin - headrev_candidates += lenin - lenin.restricted_roles = restricted_jobs - - if(headrev_candidates.len < required_enemies) - setup_error = "Not enough headrev candidates" - return FALSE - - for(var/antag in headrev_candidates) - GLOB.pre_setup_antags += antag - return TRUE - -/datum/game_mode/revolution/post_setup() - var/list/heads = SSjob.get_living_heads() - var/list/sec = SSjob.get_living_sec() - var/weighted_score = min(max(round(heads.len - ((8 - sec.len) / 3)),1),max_headrevs) - - for(var/datum/mind/rev_mind in headrev_candidates) //People with return to lobby may still be in the lobby. Let's pick someone else in that case. - if(isnewplayer(rev_mind.current)) - headrev_candidates -= rev_mind - var/list/newcandidates = shuffle(antag_candidates) - if(newcandidates.len == 0) - continue - for(var/M in newcandidates) - var/datum/mind/lenin = M - antag_candidates -= lenin - newcandidates -= lenin - if(isnewplayer(lenin.current)) //We don't want to make the same mistake again - continue - else - var/mob/Nm = lenin.current - if(Nm.job in restricted_jobs) //Don't make the HOS a replacement revhead - antag_candidates += lenin //Let's let them keep antag chance for other antags - continue - - headrev_candidates += lenin - break - - while(weighted_score < headrev_candidates.len) //das vi danya - var/datum/mind/trotsky = pick(headrev_candidates) - antag_candidates += trotsky - headrev_candidates -= trotsky - - revolution = new() - - for(var/datum/mind/rev_mind in headrev_candidates) - log_game("[key_name(rev_mind)] has been selected as a head rev") - var/datum/antagonist/rev/head/new_head = new() - new_head.give_flash = TRUE - new_head.give_hud = TRUE - new_head.remove_clumsy = TRUE - rev_mind.add_antag_datum(new_head,revolution) - GLOB.pre_setup_antags -= rev_mind - - revolution.update_objectives() - revolution.update_heads() - - ..() - - -/datum/game_mode/revolution/process() - check_counter++ - if(check_counter >= 5) - if(!finished) - SSticker.mode.check_win() - check_counter = 0 - return FALSE - -////////////////////////////////////// -//Checks if the revs have won or not// -////////////////////////////////////// -/datum/game_mode/revolution/check_win() - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - return - -/////////////////////////////// -//Checks if the round is over// -/////////////////////////////// -/datum/game_mode/revolution/check_finished() - if(CONFIG_GET(keyed_list/continuous)["revolution"]) - return ..() - if(finished != 0 && end_when_heads_dead) - return TRUE - else - return ..() - -/////////////////////////////////////////////////// -//Deals with converting players to the revolution// -/////////////////////////////////////////////////// -/proc/is_revolutionary(mob/M) - return M.mind?.has_antag_datum(/datum/antagonist/rev) - -/proc/is_head_revolutionary(mob/M) - return M.mind?.has_antag_datum(/datum/antagonist/rev/head) - -////////////////////////// -//Checks for rev victory// -////////////////////////// -/datum/game_mode/revolution/proc/check_rev_victory() - for(var/datum/objective/mutiny/objective in revolution.objectives) - if(!(objective.check_completion())) - return FALSE - return TRUE - -///////////////////////////// -//Checks for a head victory// -///////////////////////////// -/datum/game_mode/revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in revolution.head_revolutionaries()) - if(!considered_afk(rev_mind) && considered_alive(rev_mind)) - if(ishuman(rev_mind.current) || ismonkey(rev_mind.current)) - return FALSE - return TRUE - - -/datum/game_mode/revolution/set_round_result() - ..() - if(finished == 1) - SSticker.mode_result = "win - heads killed" - SSticker.news_report = REVS_WIN - else if(finished == 2) - SSticker.mode_result = "loss - rev heads killed" - SSticker.news_report = REVS_LOSE - -//TODO What should be displayed for revs in non-rev rounds -/datum/game_mode/revolution/special_report() - if(finished == 1) - return "
The heads of staff were killed or exiled! The revolutionaries win!
" - else if(finished == 2) - return "
The heads of staff managed to stop the revolution!
" - -/datum/game_mode/revolution/generate_report() - return "Employee unrest has spiked in recent weeks, with several attempted mutinies on heads of staff. Some crew have been observed using flashbulb devices to blind their colleagues, \ - who then follow their orders without question and work towards dethroning departmental leaders. Watch for behavior such as this with caution. If the crew attempts a mutiny, you and \ - your heads of staff are fully authorized to execute them using lethal weaponry - they will be later cloned and interrogated at Central Command." - -/datum/game_mode/revolution/extended - name = "extended_revolution" - config_tag = "extended_revolution" - end_when_heads_dead = FALSE - -/datum/game_mode/revolution/speedy - name = "speedy_revolution" - config_tag = "speedy_revolution" - end_when_heads_dead = FALSE - var/endtime = null - var/fuckingdone = FALSE - -/datum/game_mode/revolution/speedy/pre_setup() - endtime = world.time + 20 MINUTES - return ..() - -/datum/game_mode/revolution/speedy/process() - . = ..() - if(check_counter == 0) - if (world.time > endtime && !fuckingdone) - fuckingdone = TRUE - for (var/obj/machinery/nuclearbomb/N in GLOB.nuke_list) - if (!N.timing) - N.timer_set = 200 - N.set_safety() - N.set_active() - - -/datum/game_mode/revolution/generate_credit_text() - var/list/round_credits = list() - var/len_before_addition - - round_credits += "

The Disgruntled Revolutionaries:

" - len_before_addition = round_credits.len - for(var/datum/mind/headrev in revolution.head_revolutionaries()) - round_credits += "

[headrev.name] as a revolutionary leader

" - for(var/datum/mind/grunt in (revolution.members - revolution.head_revolutionaries())) - round_credits += "

[grunt.name] as a grunt of the revolution

" - if(len_before_addition == round_credits.len) - round_credits += list("

The revolutionaries were all destroyed as martyrs!

", "

We couldn't identify their remains!

") - round_credits += "
" - - round_credits += ..() - return round_credits diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 39f86e7ca889..2f8e066a74ba 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -123,31 +123,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) /obj/machinery/computer/card/proc/job_blacklisted(jobtitle) return (jobtitle in blacklisted) -//Logic check for Topic() if you can open the job -/obj/machinery/computer/card/proc/can_open_job(datum/job/job) - if(job) - if(!job_blacklisted(job.name)) - if((job.total_positions <= GLOB.player_list.len * (max_relative_positions / 100))) - var/delta = (world.time / 10) - GLOB.time_last_changed_position - if((change_position_cooldown < delta) || (opened_positions[job.name] < 0)) - return JOB_ALLOWED - return JOB_COOLDOWN - return JOB_MAX_POSITIONS - return JOB_DENIED - -//Logic check for Topic() if you can close the job -/obj/machinery/computer/card/proc/can_close_job(datum/job/job) - if(job) - if(!job_blacklisted(job.name)) - if(job.total_positions > job.current_positions) - var/delta = (world.time / 10) - GLOB.time_last_changed_position - if((change_position_cooldown < delta) || (opened_positions[job.name] > 0)) - return JOB_ALLOWED - return JOB_COOLDOWN - return JOB_MAX_POSITIONS - return JOB_DENIED - - /obj/machinery/computer/card/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) var/obj/item/card/id/card_to_insert = inserting_item var/holder_item = FALSE @@ -209,63 +184,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) dat += {"[t.fields["name"]] - [t.fields["rank"]]
"} dat += "Print

Access ID modification console.
" - else if(mode == 2) - // JOB MANAGEMENT - dat += {"Return - - "} - for(var/datum/job/job in SSjob.occupations) - dat += "" - if(job.name in blacklisted) - continue - dat += {" - - " - dat += "
JobSlotsOpen jobClose jobPrioritize
[job.name][job.current_positions]/[job.total_positions]"} - switch(can_open_job(job)) - if(JOB_ALLOWED) - if(authenticated == AUTHENTICATED_ALL) - dat += "Open Position
" - else - dat += "Open Position" - if(JOB_COOLDOWN) - var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1) - var/mins = round(time_to_wait / 60) - var/seconds = time_to_wait - (60*mins) - dat += "Cooldown ongoing: [mins]:[(seconds < 10) ? "0[seconds]" : "[seconds]"]" - else - dat += "Denied" - dat += "
" - switch(can_close_job(job)) - if(JOB_ALLOWED) - if(authenticated == AUTHENTICATED_ALL) - dat += "Close Position" - else - dat += "Close Position" - if(JOB_COOLDOWN) - var/time_to_wait = round(change_position_cooldown - ((world.time / 10) - GLOB.time_last_changed_position), 1) - var/mins = round(time_to_wait / 60) - var/seconds = time_to_wait - (60*mins) - dat += "Cooldown ongoing: [mins]:[(seconds < 10) ? "0[seconds]" : "[seconds]"]" - else - dat += "Denied" - dat += "" - switch(job.total_positions) - if(0) - dat += "Denied" - else - if(authenticated == AUTHENTICATED_ALL) - if(job in SSjob.prioritized_jobs) - dat += "Deprioritize" - else - if(SSjob.prioritized_jobs.len < 5) - dat += "Prioritize" - else - dat += "Denied" - else - dat += "Prioritize" - - dat += "
" else var/list/header = list() @@ -286,7 +204,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) Target: Remove [target_name] || Confirm Identity: Remove [scan_name]
Access Crew Manifest
- [!target_dept ? "Job Management
" : ""] Unique Ship Access: [ship.unique_ship_access?"Enabled":"Disabled"] [ship.unique_ship_access?"Disable":"Enable"]
Print Silicon Access Chip Print Log Out"} @@ -370,8 +287,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) else if (!authenticated) body = {"Log In

Access Crew Manifest

"} - if(!target_dept) - body += "Job Management
" dat = list("", header.Join(), body, "
") var/datum/browser/popup = new(user, "id_com", src.name, 900, 620) @@ -545,62 +460,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) mode = 3; playsound(src, "terminal_type", 25, FALSE) - if("make_job_available") - // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS - if(authenticated && !target_dept) - var/edit_job_target = href_list["job"] - var/datum/job/j = SSjob.GetJob(edit_job_target) - if(!j) - updateUsrDialog() - return 0 - if(can_open_job(j) != 1) - updateUsrDialog() - return 0 - if(opened_positions[edit_job_target] >= 0) - GLOB.time_last_changed_position = world.time / 10 - j.total_positions++ - opened_positions[edit_job_target]++ - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - - if("make_job_unavailable") - // MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS - if(authenticated && !target_dept) - var/edit_job_target = href_list["job"] - var/datum/job/j = SSjob.GetJob(edit_job_target) - if(!j) - updateUsrDialog() - return 0 - if(can_close_job(j) != 1) - updateUsrDialog() - return 0 - //Allow instant closing without cooldown if a position has been opened before - if(opened_positions[edit_job_target] <= 0) - GLOB.time_last_changed_position = world.time / 10 - j.total_positions-- - opened_positions[edit_job_target]-- - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - - if ("prioritize_job") - // TOGGLE WHETHER JOB APPEARS AS PRIORITIZED IN THE LOBBY - if(authenticated && !target_dept) - var/priority_target = href_list["job"] - var/datum/job/j = SSjob.GetJob(priority_target) - if(!j) - updateUsrDialog() - return 0 - var/priority = TRUE - if(j in SSjob.prioritized_jobs) - SSjob.prioritized_jobs -= j - priority = FALSE - else if(j.total_positions <= j.current_positions) - to_chat(usr, "[j.name] has had all positions filled. Open up more slots before prioritizing it.") - updateUsrDialog() - return - else - SSjob.prioritized_jobs += j - to_chat(usr, "[j.name] has been successfully [priority ? "prioritized" : "unprioritized"]. Potential employees will notice your request.") - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - if ("print") if (!(printing)) printing = 1 diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 7c97e4fa6d8e..589289c595db 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -32,60 +32,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) /datum/crewmonitor var/list/ui_sources = list() //List of user -> ui source - var/list/jobs var/list/data_by_z = list() var/list/last_update = list() -/datum/crewmonitor/New() - . = ..() - - var/list/jobs = new/list() - jobs["Captain"] = 00 - jobs["Head of Personnel"] = 02 - jobs["SolGov Representative"] = 05 //WS Edit - SolGov Rep - jobs["Head of Security"] = 10 - jobs["Warden"] = 11 - jobs["Security Officer"] = 12 - jobs["Detective"] = 13 - jobs["Brig Physician"] = 14 - jobs["Chief Medical Officer"] = 20 - jobs["Chemist"] = 21 - jobs["Virologist"] = 22 - jobs["Medical Doctor"] = 23 - jobs["Paramedic"] = 24 - jobs["Research Director"] = 30 - jobs["Scientist"] = 31 - jobs["Roboticist"] = 32 - jobs["Geneticist"] = 33 - jobs["Chief Engineer"] = 40 - jobs["Station Engineer"] = 41 - jobs["Atmospheric Technician"] = 42 - jobs["Quartermaster"] = 51 - jobs["Shaft Miner"] = 52 - jobs["Cargo Technician"] = 53 - jobs["Bartender"] = 61 - jobs["Cook"] = 62 - jobs["Botanist"] = 63 - jobs["Curator"] = 64 - jobs["Chaplain"] = 65 - jobs["Clown"] = 66 - jobs["Mime"] = 67 - jobs["Janitor"] = 68 - jobs["Lawyer"] = 69 - jobs["Psychologist"] = 70 - jobs["Admiral"] = 200 - jobs["CentCom Commander"] = 210 - jobs["Custodian"] = 211 - jobs["Medical Officer"] = 212 - jobs["Research Officer"] = 213 - jobs["Emergency Response Team Commander"] = 220 - jobs["Security Response Officer"] = 221 - jobs["Engineer Response Officer"] = 222 - jobs["Medical Response Officer"] = 223 - jobs["Assistant"] = 999 //Unknowns/custom jobs should appear after civilians, and before assistants - - src.jobs = jobs - /datum/crewmonitor/Destroy() return ..() @@ -117,22 +66,23 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return data_by_z["[z]"] var/list/results = list() - var/obj/item/clothing/under/U - var/obj/item/card/id/I - var/turf/pos - var/ijob - var/name - var/assignment - var/oxydam - var/toxdam - var/burndam - var/brutedam - var/area - var/pos_x - var/pos_y - var/life_status for(var/i in GLOB.human_list) + var/obj/item/clothing/under/U + var/obj/item/card/id/I + var/turf/pos + var/ijob = JOB_DISPLAY_ORDER_DEFAULT + var/name = "Unknown" + var/assignment + var/oxydam + var/toxdam + var/burndam + var/brutedam + var/area + var/pos_x + var/pos_y + var/life_status + var/mob/living/carbon/human/H = i var/nanite_sensors = FALSE if(H in SSnanites.nanite_monitored_mobs) @@ -156,30 +106,18 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (I) name = I.registered_name assignment = I.assignment - if(I.assignment in jobs) - ijob = jobs[I.assignment] - else - ijob = jobs["Unknown"] - else - name = "Unknown" - assignment = "" - ijob = 80 + if(I.assignment in GLOB.name_occupations) + var/datum/job/assigned_job = GLOB.name_occupations[I.assignment] + ijob = assigned_job.display_order if (nanite_sensors || U.sensor_mode >= SENSOR_LIVING) life_status = ((H.stat < DEAD) ? TRUE : FALSE) //So anything less that dead is marked as alive. (Soft crit, concious, unconcious) - else - life_status = null if (nanite_sensors || U.sensor_mode >= SENSOR_VITALS) oxydam = round(H.getOxyLoss(),1) toxdam = round(H.getToxLoss(),1) burndam = round(H.getFireLoss(),1) brutedam = round(H.getBruteLoss(),1) - else - oxydam = null - toxdam = null - burndam = null - brutedam = null if (nanite_sensors || U.sensor_mode >= SENSOR_COORDS) if (!pos) @@ -187,14 +125,10 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) area = get_area_name(H, TRUE) pos_x = pos.x pos_y = pos.y - else - area = null - pos_x = null - pos_y = null results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null)) - data_by_z["[z]"] = sortTim(results,/proc/sensor_compare) + data_by_z["[z]"] = sortTim(results, /proc/sensor_compare) last_update["[z]"] = world.time return results diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 8b2ef4b1169c..63165a84b823 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -194,7 +194,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17) message_admins("Cryopod in [get_area(src)] could not find control computer!") last_no_computer_message = world.time -/obj/machinery/cryopod/JoinPlayerHere(mob/M, buckle) +/obj/machinery/cryopod/join_player_here(mob/M) . = ..() close_machine(M, TRUE) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 595c45ff9a9b..5ca8fa313c60 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -336,14 +336,6 @@ else if(drawing in graffiti|oriented) temp = "graffiti" - var/gang_mode - if(user.mind) - gang_mode = user.mind.has_antag_datum(/datum/antagonist/gang) - - if(gang_mode && (!can_claim_for_gang(user, target))) - return - - var/graf_rot if(drawing in oriented) switch(user.dir) @@ -375,9 +367,8 @@ if(paint_mode == PAINT_LARGE_HORIZONTAL) wait_time *= 3 - if(gang_mode || !instant) - if(!do_after(user, 50, target = target)) - return + if(!instant && !do_after(user, 50, target = target)) + return if(length(text_buffer)) drawing = text_buffer[1] @@ -387,34 +378,28 @@ if(actually_paints) var/obj/effect/decal/cleanable/crayon/C - if(gang_mode) - if(!can_claim_for_gang(user, target)) - return - tag_for_gang(user, target, gang_mode) - affected_turfs += target - else - switch(paint_mode) - if(PAINT_NORMAL) - C = new(target, paint_color, drawing, temp, graf_rot) - C.pixel_x = clickx - C.pixel_y = clicky + switch(paint_mode) + if(PAINT_NORMAL) + C = new(target, paint_color, drawing, temp, graf_rot) + C.pixel_x = clickx + C.pixel_y = clicky + affected_turfs += target + if(PAINT_LARGE_HORIZONTAL) + var/turf/left = locate(target.x-1,target.y,target.z) + var/turf/right = locate(target.x+1,target.y,target.z) + if(isValidSurface(left) && isValidSurface(right)) + C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) + affected_turfs += left + affected_turfs += right affected_turfs += target - if(PAINT_LARGE_HORIZONTAL) - var/turf/left = locate(target.x-1,target.y,target.z) - var/turf/right = locate(target.x+1,target.y,target.z) - if(isValidSurface(left) && isValidSurface(right)) - C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON) - affected_turfs += left - affected_turfs += right - affected_turfs += target - else - to_chat(user, "There isn't enough space to paint!") - return - C.add_hiddenprint(user) - if(istagger) - C.AddComponent(/datum/component/art, GOOD_ART) - else - C.AddComponent(/datum/component/art, BAD_ART) + else + to_chat(user, "There isn't enough space to paint!") + return + C.add_hiddenprint(user) + if(istagger) + C.AddComponent(/datum/component/art, GOOD_ART) + else + C.AddComponent(/datum/component/art, BAD_ART) if(!instant) to_chat(user, "You finish drawing \the [temp].") @@ -479,19 +464,6 @@ // stolen from oldgang lmao return TRUE -/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target, datum/antagonist/gang/user_gang) - for(var/obj/effect/decal/cleanable/crayon/old_marking in target) - qdel(old_marking) - - var/area/territory = get_area(target) - - var/obj/effect/decal/cleanable/crayon/gang/tag = new /obj/effect/decal/cleanable/crayon/gang(target) - tag.my_gang = user_gang.my_gang - tag.icon_state = "[user_gang.gang_id]_tag" - tag.name = "[tag.my_gang.name] gang tag" - tag.desc = "Looks like someone's claimed this area for [tag.my_gang.name]." - to_chat(user, "You tagged [territory] for [tag.my_gang.name]!") - /obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user) for(var/obj/effect/decal/cleanable/crayon/gang/G in GLOB.gang_tags) if(get_area(G) == territory) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e7da99ab87e7..9dd00660d362 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -364,7 +364,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(41) //crew manifest dat += "

Crew Manifest

" dat += "
" - dat += SSjob.get_manifest_html() + dat += SSovermap.get_manifest_html() dat += "
" if(3) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index d07a356107ff..1e96a5b3ce01 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -233,7 +233,7 @@ Code: Send Signal
"} if (41) //crew manifest menu = "

[PDAIMG(notes)] Crew Manifest

" - menu += "
[SSjob.get_manifest_html()]
" + menu += "
[SSovermap.get_manifest_html()]
" if (42) //status displays diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 78732e7e944c..121fa9f0c234 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -27,17 +27,6 @@ target.mind.remove_antag_datum(/datum/antagonist/brainwashed) deconverted = TRUE - if(target.mind.has_antag_datum(/datum/antagonist/rev/head)|| target.mind.unconvertable) - if(!silent) - target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") - removed(target, 1) - qdel(src) - return TRUE //the implant is still used - - var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - deconverted = TRUE - rev.remove_revolutionary(FALSE, user) if(!silent) if(target.mind in SSticker.mode.cult) to_chat(target, "You feel something interfering with your mental conditioning, but you resist it!") diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index eac8d783f578..7badc7a3795b 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -306,9 +306,6 @@ new /obj/item/stack/rods(get_turf(loc), 2) qdel(src) - - - /obj/item/chair/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance)) owner.visible_message("[owner] fends off [attack_text] with [src]!") @@ -327,6 +324,12 @@ C.Paralyze(20) smash(user) +/obj/structure/chair/join_player_here(mob/M) + // Placing a mob in a chair will attempt to buckle it, or else fall back to default. + if (isliving(M) && buckle_mob(M, FALSE, FALSE)) + return + ..() + /obj/item/chair/greyscale material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS origin_type = /obj/structure/chair/greyscale diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index a98cf5ef40a3..f43a7a95f8fd 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -299,4 +299,3 @@ name = "\improper Karl Marx bust" desc = "A bust depicting a certain 19th century economist. You get the feeling a specter is haunting the sector." icon_state = "marx" - art_type = /datum/component/art/rev diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 3ba6a5374cd6..a530012270ae 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -685,9 +685,14 @@ set category = "Admin" set name = "Unprison" if (is_centcom_level(M)) - SSjob.SendToLateJoin(M) - message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]") - log_admin("[key_name(usr)] has unprisoned [key_name(M)]") + var/datum/overmap/ship/controlled/original_ship = M.mind.original_ship.resolve() + if(original_ship) + var/atom/new_spawn_point = pick(original_ship.shuttle_port.spawn_points) + new_spawn_point.join_player_here(M) + message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]") + log_admin("[key_name(usr)] has unprisoned [key_name(M)]") + else + alert("[M.name] could not be sent back to their original ship.") else alert("[M.name] is not prisoned.") SSblackbox.record_feedback("tally", "admin_verb", 1, "Unprison") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b5ef01db7c76..32840115224c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -78,13 +78,6 @@ else message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.") log_admin("[key_name(usr)] failed to create changelings.") - if("revs") - if(src.makeRevs()) - message_admins("[key_name(usr)] started a revolution.") - log_admin("[key_name(usr)] started a revolution.") - else - message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunately, there were no candidates available.") - log_admin("[key_name(usr)] failed to start a revolution.") if("cult") if(src.makeCult()) message_admins("[key_name(usr)] started a cult.") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 2b7bf06d2d6d..72091fbe0469 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -13,7 +13,6 @@ var/dat = {" Make Traitors
Make Changelings
- Make Revs
Make Cult
Make Blob
Make Wizard (Requires Ghosts)
@@ -101,34 +100,6 @@ return 0 -/datum/admins/proc/makeRevs() - - var/datum/game_mode/revolution/temp = new - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - temp.restricted_jobs += temp.protected_jobs - - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - temp.restricted_jobs += "Assistant" - - var/list/mob/living/carbon/human/candidates = list() - var/mob/living/carbon/human/H = null - - for(var/mob/living/carbon/human/applicant in GLOB.player_list) - if(isReadytoRumble(applicant, ROLE_REV)) - if(temp.age_check(applicant.client)) - if(!(applicant.job in temp.restricted_jobs)) - candidates += applicant - - if(candidates.len) - var/numRevs = min(candidates.len, 3) - - for(var/i = 0, iYou are the [name].
") - to_chat(owner, "You are NOT a Nanotrasen Employee. You work for the local government.") - - var/missiondesc = "After an uptick in gang violence on [station_name()], you are responding to emergency calls from the station for immediate SSC Police assistance!\n" - missiondesc += "
Your Mission:" - missiondesc += "
1. Secure the situation and crack down on any gang activity. You can view gangsters with your sunglasses." - missiondesc += "
2. There is an undercover police officer on station. Secure him, receive his intel, and extract him safely." - missiondesc += "
3. Minimize civilian casualties, but defend yourself and civilians from hostile gangsters." - missiondesc += "
3. If Security is found to be violating the rights of citizens, detain them as per your authority as Spinward Stellar Coalition officers." - missiondesc += "
4. If the situation demands it, evacuate the station. Otherwise, remain on station and keep the peace." - to_chat(owner,missiondesc) - var/policy = get_policy(ROLE_FAMILIES) - if(policy) - to_chat(owner, policy) - var/mob/living/M = owner.current - M.playsound_local(M, 'sound/effects/families_police.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) - -/datum/antagonist/ert/families/undercover_cop - name = "Undercover Cop" - role = "Undercover Cop" - outfit = /datum/outfit/families_police/beatcop - var/free_clothes = list(/obj/item/clothing/glasses/hud/spacecop/hidden, - /obj/item/clothing/under/rank/security/officer/beatcop, - /obj/item/clothing/head/spacepolice) - forge_objectives_for_ert = FALSE - equip_ert = FALSE - random_names = FALSE - -/datum/antagonist/ert/families/undercover_cop/on_gain() - for(var/C in free_clothes) - var/obj/O = new C(owner.current) - var/list/slots = list ( - "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET - ) - var/mob/living/carbon/human/H = owner.current - var/equipped = H.equip_in_one_of_slots(O, slots) - if(!equipped) - to_chat(owner.current, "Unfortunately, you could not bring your [O] to this shift. You will need to find one.") - qdel(O) - . = ..() - - -/datum/antagonist/ert/families/undercover_cop/greet() - to_chat(owner, "You are the [name].") - to_chat(owner, "You are NOT a Nanotrasen Employee. You work for the local government.") - - var/missiondesc = "You are an undercover police officer on board [station_name()]. You've been sent here by the Spinward Stellar Coalition because of suspected abusive behavior by the security department, and to keep tabs on a potential criminal organization operation." - missiondesc += "
Your Mission:" - missiondesc += "
1. Keep a close eye on any gangsters you spot. You can view gangsters using your sunglasses in your backpack." - missiondesc += "
2. Keep an eye on how Security handles any gangsters, and watch for excessive security brutality." - missiondesc += "
3. Remain undercover and do not get found out by Security or any gangs. Nanotrasen does not take kindly to being spied on." - missiondesc += "
4. When your backup arrives to extract you in 1 hour, inform them of everything you saw of note, and assist them in securing the situation." - to_chat(owner,missiondesc) - -/datum/antagonist/ert/families/beatcop - name = "Beat Cop" - role = "Police Officer" - outfit = /datum/outfit/families_police/beatcop - -/datum/antagonist/ert/families/beatcop/armored - name = "Armored Beat Cop" - role = "Police Officer" - outfit = /datum/outfit/families_police/beatcop/armored - -/datum/antagonist/ert/families/beatcop/swat - name = "S.W.A.T. Member" - role = "S.W.A.T. Officer" - outfit = /datum/outfit/families_police/beatcop/swat - -/datum/antagonist/ert/families/beatcop/fbi - name = "FBI Agent" - role = "FBI Agent" - outfit = /datum/outfit/families_police/beatcop/fbi - -/datum/antagonist/ert/families/beatcop/military - name = "Space Military" - role = "Sergeant" - outfit = /datum/outfit/families_police/beatcop/military - -/datum/antagonist/ert/families/beatcop/military/New() - . = ..() - name_source = GLOB.commando_names - - /datum/antagonist/ert/marine name = "Marine Commander" outfit = /datum/outfit/centcom/ert/marine diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm deleted file mode 100644 index 8a9200fb08d0..000000000000 --- a/code/modules/antagonists/revolution/revolution.dm +++ /dev/null @@ -1,539 +0,0 @@ -#define DECONVERTER_STATION_WIN "gamemode_station_win" -#define DECONVERTER_REVS_WIN "gamemode_revs_win" -//How often to check for promotion possibility -#define HEAD_UPDATE_PERIOD 300 - -/datum/antagonist/rev - name = "Revolutionary" - roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen - antagpanel_category = "Revolution" - job_rank = ROLE_REV - antag_moodlet = /datum/mood_event/revolution - antag_hud_type = ANTAG_HUD_REV - antag_hud_name = "rev" - var/datum/team/revolution/rev_team - - /// What message should the player receive when they are being demoted, and the revolution has won? - var/victory_message = "The revolution has overpowered the command staff! Viva la revolution! Execute any head of staff and security should you find them alive." - -/datum/antagonist/rev/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - if(new_owner.assigned_role in GLOB.command_positions) - return FALSE - if(new_owner.unconvertable) - return FALSE - if(new_owner.current && HAS_TRAIT(new_owner.current, TRAIT_MINDSHIELD)) - return FALSE - -/datum/antagonist/rev/apply_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - add_antag_hud(antag_hud_type, antag_hud_name, M) - handle_clown_mutation(M, mob_override ? null : "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - -/datum/antagonist/rev/remove_innate_effects(mob/living/mob_override) - var/mob/living/M = mob_override || owner.current - remove_antag_hud(antag_hud_type, M) - handle_clown_mutation(M, removing = FALSE) - -/datum/antagonist/rev/proc/equip_rev() - return - -/datum/antagonist/rev/on_gain() - . = ..() - create_objectives() - equip_rev() - owner.current.log_message("has been converted to the revolution!", LOG_ATTACK, color="red") - -/datum/antagonist/rev/on_removal() - remove_objectives() - . = ..() - -/datum/antagonist/rev/greet() - to_chat(owner, "You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!") - owner.announce_objectives() - -/datum/antagonist/rev/create_team(datum/team/revolution/new_team) - if(!new_team) - //For now only one revolution at a time - for(var/datum/antagonist/rev/head/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.rev_team) - rev_team = H.rev_team - return - rev_team = new /datum/team/revolution - rev_team.update_objectives() - rev_team.update_heads() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - rev_team = new_team - -/datum/antagonist/rev/get_team() - return rev_team - -/datum/antagonist/rev/proc/create_objectives() - objectives |= rev_team.objectives - -/datum/antagonist/rev/proc/remove_objectives() - objectives -= rev_team.objectives - -//Bump up to head_rev -/datum/antagonist/rev/proc/promote() - var/old_team = rev_team - var/datum/mind/old_owner = owner - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev) - var/datum/antagonist/rev/head/new_revhead = new() - new_revhead.silent = TRUE - old_owner.add_antag_datum(new_revhead,old_team) - new_revhead.silent = FALSE - to_chat(old_owner, "You have proved your devotion to revolution! You are a head revolutionary now!") - -/datum/antagonist/rev/get_admin_commands() - . = ..() - .["Promote"] = CALLBACK(src,.proc/admin_promote) - -/datum/antagonist/rev/proc/admin_promote(mob/admin) - var/datum/mind/O = owner - promote() - message_admins("[key_name_admin(admin)] has head-rev'ed [O].") - log_admin("[key_name(admin)] has head-rev'ed [O].") - -/datum/antagonist/rev/head/admin_add(datum/mind/new_owner,mob/admin) - give_flash = TRUE - give_hud = TRUE - remove_clumsy = TRUE - new_owner.add_antag_datum(src) - message_admins("[key_name_admin(admin)] has head-rev'ed [key_name_admin(new_owner)].") - log_admin("[key_name(admin)] has head-rev'ed [key_name(new_owner)].") - to_chat(new_owner.current, "You are a member of the revolutionaries' leadership now!") - -/datum/antagonist/rev/head/get_admin_commands() - . = ..() - . -= "Promote" - .["Take flash"] = CALLBACK(src,.proc/admin_take_flash) - .["Give flash"] = CALLBACK(src,.proc/admin_give_flash) - .["Repair flash"] = CALLBACK(src,.proc/admin_repair_flash) - .["Demote"] = CALLBACK(src,.proc/admin_demote) - -/datum/antagonist/rev/head/proc/admin_take_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/assembly/flash/handheld/flash = locate() in L - if (!flash) - to_chat(admin, "Deleting flash failed!") - return - qdel(flash) - -/datum/antagonist/rev/head/proc/admin_give_flash(mob/admin) - //This is probably overkill but making these impact state annoys me - var/old_give_flash = give_flash - var/old_give_hud = give_hud - var/old_remove_clumsy = remove_clumsy - give_flash = TRUE - give_hud = FALSE - remove_clumsy = FALSE - equip_rev() - give_flash = old_give_flash - give_hud = old_give_hud - remove_clumsy = old_remove_clumsy - -/datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/assembly/flash/handheld/flash = locate() in L - if (!flash) - to_chat(admin, "Repairing flash failed!") - else - flash.burnt_out = FALSE - flash.update_appearance() - -/datum/antagonist/rev/head/proc/admin_demote(datum/mind/target,mob/user) - message_admins("[key_name_admin(user)] has demoted [key_name_admin(owner)] from head revolutionary.") - log_admin("[key_name(user)] has demoted [key_name(owner)] from head revolutionary.") - demote() - -/datum/antagonist/rev/head - name = "Head Revolutionary" - antag_hud_name = "rev_head" - var/remove_clumsy = FALSE - var/give_flash = FALSE - var/give_hud = TRUE - -/datum/antagonist/rev/head/on_removal() - if(give_hud) - var/mob/living/carbon/C = owner.current - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = C.getorganslot(ORGAN_SLOT_HUD) - if(S) - S.Remove(C) - return ..() - -/datum/antagonist/rev/head/antag_listing_name() - return ..() + "(Leader)" - -/datum/antagonist/rev/proc/can_be_converted(mob/living/candidate) - if(!candidate.mind) - return FALSE - if(!can_be_owned(candidate.mind)) - return FALSE - var/mob/living/carbon/C = candidate //Check to see if the potential rev is implanted - if(!istype(C)) //Can't convert simple animals - return FALSE - return TRUE - -/datum/antagonist/rev/proc/add_revolutionary(datum/mind/rev_mind,stun = TRUE) - if(!can_be_converted(rev_mind.current)) - return FALSE - if(stun) - if(iscarbon(rev_mind.current)) - var/mob/living/carbon/carbon_mob = rev_mind.current - carbon_mob.silent = max(carbon_mob.silent, 5) - carbon_mob.flash_act(1, 1) - rev_mind.current.Stun(100) - rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team) - rev_mind.special_role = ROLE_REV - return TRUE - -/datum/antagonist/rev/head/proc/demote() - var/datum/mind/old_owner = owner - var/old_team = rev_team - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/rev/head) - var/datum/antagonist/rev/new_rev = new /datum/antagonist/rev() - new_rev.silent = TRUE - old_owner.add_antag_datum(new_rev,old_team) - new_rev.silent = FALSE - to_chat(old_owner, "Revolution has been disappointed of your leader traits! You are a regular revolutionary now!") - -/// Checks if the revolution succeeded, and lets them know. -/datum/antagonist/rev/proc/announce_victorious() - . = rev_team.check_rev_victory() - - if (!.) - return - - to_chat(owner, "[victory_message]") - var/policy = get_policy(ROLE_REV_SUCCESSFUL) - if (policy) - to_chat(owner, policy) - -/datum/antagonist/rev/farewell() - if (announce_victorious()) - return - - if(ishuman(owner.current) || ismonkey(owner.current)) - owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current) - to_chat(owner, "You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you....") - else if(issilicon(owner.current)) - owner.current.visible_message("The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.", null, null, null, owner.current) - to_chat(owner, "The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.") - -/datum/antagonist/rev/head/farewell() - if (announce_victorious()) - return - - if((ishuman(owner.current) || ismonkey(owner.current))) - if(owner.current.stat != DEAD) - owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!", null, null, null, owner.current) - to_chat(owner, "You have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.") - else - to_chat(owner, "The sweet release of death. You are no longer a Head Revolutionary.") - else if(issilicon(owner.current)) - owner.current.visible_message("The frame beeps contentedly, suppressing the disloyal personality traits from the MMI before initalizing it.", null, null, null, owner.current) - to_chat(owner, "The frame's firmware detects and suppresses your unwanted personality traits! You feel more content with the leadership around these parts.") - -//blunt trauma deconversions call this through species.dm spec_attacked_by() -/datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - log_attack("[key_name(owner.current)] has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!") - if(borged) - message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") - owner.special_role = null - if(iscarbon(owner.current) && deconverter != DECONVERTER_REVS_WIN) - var/mob/living/carbon/C = owner.current - C.Unconscious(100) - owner.remove_antag_datum(type) - -/datum/antagonist/rev/head/remove_revolutionary(borged,deconverter) - if(borged || deconverter == DECONVERTER_STATION_WIN || deconverter == DECONVERTER_REVS_WIN) - . = ..() - -/datum/antagonist/rev/head/equip_rev() - var/mob/living/carbon/C = owner.current - if(!ishuman(C) && !ismonkey(C)) - return - - if(give_flash) - var/obj/item/assembly/flash/handheld/T = new(C) - var/list/slots = list ( - "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET - ) - var/where = C.equip_in_one_of_slots(T, slots) - if (!where) - to_chat(C, "The Syndicate were unfortunately unable to get you a flash.") - else - to_chat(C, "The flash in your [where] will help you to persuade the crew to join your cause.") - - if(give_hud) - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new() - S.Insert(C) - to_chat(C, "Your eyes have been implanted with a cybernetic security HUD which will help you keep track of who is mindshield-implanted, and therefore unable to be recruited.") - -/// "Enemy of the Revolutionary", given to heads and security when the revolution wins -/datum/antagonist/revolution_enemy - name = "Enemy of the Revolution" - show_in_antagpanel = FALSE - -/datum/antagonist/revolution_enemy/on_gain() - owner.special_role = "revolution enemy" - - var/datum/objective/survive/survive = new /datum/objective/survive - survive.owner = owner - survive.explanation_text = "The station has been overrun by revolutionaries, stay alive until the end." - objectives += survive - - return ..() - -/datum/team/revolution - name = "Revolution" - var/max_headrevs = 3 - var/list/ex_headrevs = list() // Dynamic removes revs on loss, used to keep a list for the roundend report. - var/list/ex_revs = list() - -/datum/team/revolution/proc/update_objectives(initial = FALSE) - var/untracked_heads = SSjob.get_all_heads() - for(var/datum/objective/mutiny/O in objectives) - untracked_heads -= O.target - for(var/datum/mind/M in untracked_heads) - var/datum/objective/mutiny/new_target = new() - new_target.team = src - new_target.target = M - new_target.update_explanation_text() - objectives += new_target - for(var/datum/mind/M in members) - var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) - R.objectives |= objectives - - addtimer(CALLBACK(src,.proc/update_objectives),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - -/datum/team/revolution/proc/head_revolutionaries() - . = list() - for(var/datum/mind/M in members) - if(M.has_antag_datum(/datum/antagonist/rev/head)) - . += M - -/datum/team/revolution/proc/update_heads() - if(SSticker.HasRoundStarted()) - var/list/datum/mind/head_revolutionaries = head_revolutionaries() - var/list/datum/mind/heads = SSjob.get_all_heads() - var/list/sec = SSjob.get_all_sec() - - if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < round(heads.len - ((8 - sec.len) / 3))) - var/list/datum/mind/non_heads = members - head_revolutionaries - var/list/datum/mind/promotable = list() - var/list/datum/mind/nonhuman_promotable = list() - for(var/datum/mind/khrushchev in non_heads) - if(khrushchev.current && !khrushchev.current.incapacitated() && !HAS_TRAIT(khrushchev.current, TRAIT_RESTRAINED) && khrushchev.current.client) - if(ROLE_REV in khrushchev.current.client.prefs.be_special) - if(ishuman(khrushchev.current)) - promotable += khrushchev - else - nonhuman_promotable += khrushchev - if(!promotable.len && nonhuman_promotable.len) //if only nonhuman revolutionaries remain, promote one of them to the leadership. - promotable = nonhuman_promotable - if(promotable.len) - var/datum/mind/new_leader = pick(promotable) - var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev) - rev.promote() - - addtimer(CALLBACK(src,.proc/update_heads),HEAD_UPDATE_PERIOD,TIMER_UNIQUE) - -/datum/team/revolution/proc/save_members() - ex_headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) - ex_revs = get_antag_minds(/datum/antagonist/rev, TRUE) - -/// Checks if revs have won -/datum/team/revolution/proc/check_rev_victory() - for(var/datum/objective/mutiny/objective in objectives) - if(!(objective.check_completion())) - return FALSE - return TRUE - -/// Checks if heads have won -/datum/team/revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in head_revolutionaries()) - if(!considered_afk(rev_mind) && considered_alive(rev_mind)) - if(ishuman(rev_mind.current)) - return FALSE - return TRUE - -/// Updates the state of the world depending on if revs won or loss. -/// Returns who won, at which case this method should no longer be called. -/// If revs_win_injection_amount is passed, then that amount of threat will be added if the revs win. -/datum/team/revolution/proc/process_victory(revs_win_injection_amount) - if (check_rev_victory()) - . = REVOLUTION_VICTORY - else if (check_heads_victory()) - . = STATION_VICTORY - else - return - - save_members() - - // Remove everyone as a revolutionary - for (var/_rev_mind in members) - var/datum/mind/rev_mind = _rev_mind - if (rev_mind.has_antag_datum(/datum/antagonist/rev)) - var/datum/antagonist/rev/rev_antag = rev_mind.has_antag_datum(/datum/antagonist/rev) - rev_antag.remove_revolutionary(FALSE, . == STATION_VICTORY ? DECONVERTER_STATION_WIN : DECONVERTER_REVS_WIN) - LAZYADD(rev_mind.special_statuses, "Former [(rev_mind in ex_headrevs) ? "head revolutionary" : "revolutionary"]") - - if (. == STATION_VICTORY) - // If the revolution was quelled, make rev heads unable to be revived through pods - for (var/_rev_head_mind in ex_revs) - var/datum/mind/rev_head_mind = _rev_head_mind - var/mob/living/carbon/rev_head_body = rev_head_mind.current - if(istype(rev_head_body) && rev_head_body.stat == DEAD) - rev_head_body.makeUncloneable() - - priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ - We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") - else - for (var/_player in GLOB.player_list) - var/mob/player = _player - var/datum/mind/mind = player.mind - - if (isnull(mind)) - continue - - if (!(mind.assigned_role in GLOB.command_positions + GLOB.security_positions)) - continue - - var/mob/living/carbon/target_body = mind.current - - mind.add_antag_datum(/datum/antagonist/revolution_enemy) - - if (!istype(target_body)) - continue - - if (target_body.stat == DEAD) - target_body.makeUncloneable() - else - mind.announce_objectives() - - if (revs_win_injection_amount) - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.create_threat(revs_win_injection_amount) - dynamic.threat_log += "[worldtime2text()]: Revolution victory. Added [revs_win_injection_amount] threat." - - priority_announce("A recent assessment of your station has marked your station as a severe risk area for high ranking Nanotrasen officials. \ - For the safety of our staff, we have blacklisted your station for new employment of security and command. \ - [pick(world.file2list("strings/anti_union_propaganda.txt"))]", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") - -/// Mutates the ticker to report that the revs have won -/datum/team/revolution/proc/round_result(finished) - if (finished == REVOLUTION_VICTORY) - SSticker.mode_result = "win - heads killed" - SSticker.news_report = REVS_WIN - else if (finished == STATION_VICTORY) - SSticker.mode_result = "loss - rev heads killed" - SSticker.news_report = REVS_LOSE - -/datum/team/revolution/roundend_report() - if(!members.len && !ex_headrevs.len) - return - - var/list/result = list() - - result += "
" - - var/list/targets = list() - var/list/datum/mind/headrevs - var/list/datum/mind/revs - if(ex_headrevs.len) - headrevs = ex_headrevs - else - headrevs = get_antag_minds(/datum/antagonist/rev/head, TRUE) - - if(ex_revs.len) - revs = ex_revs - else - revs = get_antag_minds(/datum/antagonist/rev, TRUE) - - var/num_revs = 0 - var/num_survivors = 0 - for(var/mob/living/carbon/survivor in GLOB.alive_mob_list) - if(survivor.ckey) - num_survivors += 1 - if ((survivor.mind in revs) || (survivor.mind in headrevs)) - num_revs += 1 - - if(num_survivors) - result += "Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%
" - - if(headrevs.len) - var/list/headrev_part = list() - headrev_part += "The head revolutionaries were:" - headrev_part += printplayerlist(headrevs) - result += headrev_part.Join("
") - - if(revs.len) - var/list/rev_part = list() - rev_part += "The revolutionaries were:" - rev_part += printplayerlist(revs) - result += rev_part.Join("
") - - var/list/heads = SSjob.get_all_heads() - if(heads.len) - var/head_text = "The heads of staff were:" - head_text += "
    " - for(var/datum/mind/head in heads) - var/target = (head in targets) - head_text += "
  • " - if(target) - head_text += "Target" - head_text += "[printplayer(head, 1)]
  • " - head_text += "

" - result += head_text - - result += "
" - - return result.Join() - -/datum/team/revolution/antag_listing_entry() - var/common_part = "" - var/list/parts = list() - parts += "[antag_listing_name()]
" - parts += "" - - var/list/heads = get_team_antags(/datum/antagonist/rev/head,TRUE) - - for(var/datum/antagonist/A in heads | get_team_antags()) - parts += A.antag_listing_entry() - - parts += "
" - parts += antag_listing_footer() - common_part = parts.Join() - - var/heads_report = "Heads of Staff
" - heads_report += "" - for(var/datum/mind/N in SSjob.get_living_heads()) - var/mob/M = N.current - if(M) - heads_report += "" - heads_report += "" - heads_report += "" - var/turf/mob_loc = get_turf(M) - heads_report += "" - else - heads_report += "" - heads_report += "" - heads_report += "
[M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]PMFLW[mob_loc.loc]
[N.name]([N.key])Head body destroyed!PM
" - return common_part + heads_report - -/datum/team/revolution/is_gamemode_hero() - return SSticker.mode.name == "revolution" - -#undef DECONVERTER_STATION_WIN -#undef DECONVERTER_REVS_WIN diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index e05e4e83d1c3..528fd33db5d4 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -56,9 +56,6 @@ /datum/antagonist/wizard/proc/send_to_lair() if(!owner || !owner.current) return - if(!GLOB.wizardstart.len) - SSjob.SendToLateJoin(owner.current) - to_chat(owner, "HOT INSERTION, GO GO GO") owner.current.forceMove(pick(GLOB.wizardstart)) /datum/antagonist/wizard/proc/create_objectives() diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index b7a1ba88f39b..dd7936968ae2 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -125,7 +125,6 @@ var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused M.confused += min(power, diff) if(user) - terrible_conversion_proc(M, user) visible_message("[user] blinds [M] with the flash!") to_chat(user, "You blind [M] with the flash!") to_chat(M, "[user] blinds you with the flash!") @@ -182,26 +181,6 @@ return AOE_flash() -/obj/item/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/H, mob/user) - if(istype(H) && H.stat != DEAD) - if(user.mind) - var/datum/antagonist/rev/head/converter = user.mind.has_antag_datum(/datum/antagonist/rev/head) - if(!converter) - return - if(!H.client) - to_chat(user, "This mind is so vacant that it is not susceptible to influence!") - return - if(H.stat != CONSCIOUS) - to_chat(user, "They must be conscious before you can convert [H.p_them()]!") - return - if(converter.add_revolutionary(H.mind)) - if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) - H.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.") - times_used -- //Flashes less likely to burn out for headrevs when used for conversion - else - to_chat(user, "This mind seems resistant to the flash!") - - /obj/item/assembly/flash/cyborg /obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index f8ee83b60b0c..e16fde8d54f0 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -102,7 +102,7 @@ return FALSE var/datum/outfit/job/O = new outfit_type() var/list/outfit_types = O.get_chameleon_disguise_info() - var/datum/job/job_datum = SSjob.GetJobType(O.jobtype) + var/datum/job/job_datum = GLOB.type_occupations[O.jobtype] for(var/V in user.chameleon_item_actions) var/datum/action/item_action/chameleon/change/A = V diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm index 99ec2a6856de..656888f068bc 100644 --- a/code/modules/events/devil.dm +++ b/code/modules/events/devil.dm @@ -32,7 +32,7 @@ spawned_mobs += devil message_admins("[ADMIN_LOOKUPFLW(devil)] has been made into a devil by an event.") log_game("[key_name(devil)] was spawned as a devil by an event.") - var/datum/job/jobdatum = SSjob.GetJob("Assistant") + var/datum/job/jobdatum = new /datum/job/assistant() devil.job = jobdatum.name jobdatum.equip(devil) return SUCCESSFUL_SPAWN @@ -40,8 +40,6 @@ /proc/create_event_devil(spawn_loc) var/mob/living/carbon/human/new_devil = new(spawn_loc) - if(!spawn_loc) - SSjob.SendToLateJoin(new_devil) var/datum/preferences/A = new() //Randomize appearance for the devil. A.copy_to(new_devil) new_devil.dna.update_dna_identity() diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index e2a68a937d71..0e21622c72c5 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -6,7 +6,7 @@ /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() for(var/mob/living/carbon/human/victim in shuffle(GLOB.player_list)) - if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !SSjob.GetJob(victim.mind.assigned_role) || (victim.mind.assigned_role in GLOB.nonhuman_positions)) + if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || (victim.mind.assigned_role in GLOB.nonhuman_positions)) continue fake_virus_victims += victim diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 3c947107efa6..35d8c4b141e1 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -10,7 +10,7 @@ for(var/mob/living/carbon/human/victim as anything in shuffle(GLOB.human_list)) if(!victim.client || victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !victim.can_heartattack() || victim.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in victim.diseases) || victim.undergoing_cardiac_arrest()) continue - if(!SSjob.GetJob(victim.mind.assigned_role) || (victim.mind.assigned_role in GLOB.nonhuman_positions))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event + if(victim.mind.assigned_role in GLOB.nonhuman_positions) continue if(victim.satiety <= -60) //Multiple junk food items recently heart_attack_contestants[victim] = 3 diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index f5e71a3c7c84..186922c76a8f 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -293,14 +293,6 @@ unit_name = "hostage" export_types = list(/mob/living/carbon/human) -/datum/export/pirate/ransom/find_loot() - var/list/head_minds = SSjob.get_living_heads() - var/list/head_mobs = list() - for(var/datum/mind/M in head_minds) - head_mobs += M.current - if(head_mobs.len) - return pick(head_mobs) - /datum/export/pirate/ransom/get_cost(atom/movable/AM) var/mob/living/carbon/human/H = AM if(H.stat != CONSCIOUS || !H.mind || !H.mind.assigned_role) //mint condition only diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 2184cd3869f0..5f04f8c31000 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -92,7 +92,7 @@ GLOBAL_PROTECT(exp_to_update) play_records[exp_read.item[1]] = text2num(exp_read.item[2]) qdel(exp_read) - for(var/rtype in SSjob.name_occupations) + for(var/rtype in GLOB.name_occupations) if(!play_records[rtype]) play_records[rtype] = 0 for(var/rtype in GLOB.exp_specialmap) @@ -143,7 +143,7 @@ GLOBAL_PROTECT(exp_to_update) if(announce_changes) to_chat(src,"You got: [minutes] Living EXP!") if(mob.mind.assigned_role) - for(var/job in SSjob.name_occupations) + for(var/job in GLOB.name_occupations) if(mob.mind.assigned_role == job) rolefound = TRUE play_records[job] += minutes diff --git a/code/modules/jobs/job_report.dm b/code/modules/jobs/job_report.dm index 88c7f7ad1902..cbc43f4110bf 100644 --- a/code/modules/jobs/job_report.dm +++ b/code/modules/jobs/job_report.dm @@ -32,7 +32,7 @@ data["jobPlaytimes"] = list() data["specialPlaytimes"] = list() - for (var/job_name in SSjob.name_occupations) + for (var/job_name in GLOB.name_occupations) var/playtime = play_records[job_name] ? text2num(play_records[job_name]) : 0 data["jobPlaytimes"][job_name] = playtime diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 550b496344ff..206c0746bc85 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -15,15 +15,6 @@ //Bitflags for the job var/auto_deadmin_role_flags = NONE - //How many players can be this job - var/total_positions = 0 - - //How many players can spawn in as this job - var/spawn_positions = 0 - - //How many players have this job - var/current_positions = 0 - //If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.) var/minimal_player_age = 0 @@ -42,6 +33,14 @@ if(new_name) name = new_name outfit = new_outfit + register() + +/datum/job/proc/register() + GLOB.occupations += src + if(name in GLOB.name_occupations) + return + + GLOB.name_occupations[name] = src //Only override this proc //H is usually a human unless an /equip override transformed it @@ -95,8 +94,6 @@ if(living_mob.client.holder) if(CONFIG_GET(flag/auto_deadmin_players) || (living_mob.client.prefs?.toggles & DEADMIN_ALWAYS)) living_mob.client.holder.auto_deadmin() - else - SSjob.handle_auto_deadmin_roles(living_mob.client, name) radio_help_message(living_mob) //WS Begin - Wikilinks @@ -264,9 +261,9 @@ if(visualsOnly) return - var/datum/job/J = SSjob.GetJobType(jobtype) + var/datum/job/J = GLOB.type_occupations[jobtype] if(!J) - J = SSjob.GetJob(H.job) + J = GLOB.name_occupations[H.job] var/obj/item/card/id/C = H.wear_id if(istype(C)) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index e3df96314769..146a21b35be8 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -1,8 +1,6 @@ /datum/job/ai name = "AI" auto_deadmin_role_flags = DEADMIN_POSITION_SILICON - total_positions = 1 - spawn_positions = 1 minimal_player_age = 30 display_order = JOB_DISPLAY_ORDER_AI var/do_special_check = TRUE diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 33fe24c4ff5d..b6e6c9e2b731 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -3,8 +3,6 @@ Assistant */ /datum/job/assistant name = "Assistant" - total_positions = 5 - spawn_positions = 5 access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() outfit = /datum/outfit/job/assistant diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index bd3788944c42..eb2df5a68039 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -1,7 +1,5 @@ /datum/job/atmos name = "Atmospheric Technician" - total_positions = 3 - spawn_positions = 2 wiki_page = "Guide_to_Atmospherics" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/atmos diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index ca6517ae78a0..680fe6ee880d 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -1,7 +1,5 @@ /datum/job/bartender name = "Bartender" - total_positions = 1 - spawn_positions = 1 wiki_page = "Drinks" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/bartender diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 63d90f19abbd..27906b1d8bac 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -1,7 +1,5 @@ /datum/job/hydro name = "Botanist" - total_positions = 3 - spawn_positions = 2 wiki_page = "Guide_to_Botany" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/botanist diff --git a/code/modules/jobs/job_types/brig_physician.dm b/code/modules/jobs/job_types/brig_physician.dm index 40a740e7e844..6b670693186e 100644 --- a/code/modules/jobs/job_types/brig_physician.dm +++ b/code/modules/jobs/job_types/brig_physician.dm @@ -1,7 +1,5 @@ /datum/job/brig_phys name = "Brig Physician" - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 wiki_page = "Guide_to_Medicine" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 968934302da7..bf8bf6cd8086 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -1,8 +1,6 @@ /datum/job/captain name = "Captain" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - total_positions = 1 - spawn_positions = 1 minimal_player_age = 30 officer = TRUE wiki_page = "Captain" diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 09d0fa1631ab..c5d2b14aa0eb 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -1,7 +1,5 @@ /datum/job/cargo_tech name = "Cargo Technician" - total_positions = 3 - spawn_positions = 2 wiki_page = "Cargo_technician" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/cargo_tech diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index efb9292353b7..97a2a2403717 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -1,7 +1,5 @@ /datum/job/chaplain name = "Chaplain" - total_positions = 1 - spawn_positions = 1 wiki_page = "Chaplain" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/chaplain diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 4173863dda34..9e26a0787865 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -1,7 +1,5 @@ /datum/job/chemist name = "Chemist" - total_positions = 2 - spawn_positions = 2 wiki_page = "Guide_to_Chemistry" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/chemist diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 2012b1dd9716..50386243d0a2 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -1,8 +1,6 @@ /datum/job/chief_engineer name = "Chief Engineer" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 officer = TRUE wiki_page = "Chief_Engineer" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 4ad8cea562a8..92e270ee22e7 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -1,8 +1,6 @@ /datum/job/cmo name = "Chief Medical Officer" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 officer = TRUE wiki_page = "Chief_Medical_Officer" diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index cecfb2fd8f63..d131d8ad4cd4 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -1,7 +1,5 @@ /datum/job/clown name = "Clown" - total_positions = 1 - spawn_positions = 1 wiki_page = "Clown" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/clown diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 6f90a883267e..d1006a5b154f 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -1,7 +1,5 @@ /datum/job/cook name = "Cook" - total_positions = 2 - spawn_positions = 1 wiki_page = "Food" //WS Edit - Wikilinks/Warning var/cooks = 0 //Counts cooks amount diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 791c1ba667c6..d069e3411bbc 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -1,7 +1,5 @@ /datum/job/curator name = "Curator" - total_positions = 1 - spawn_positions = 1 wiki_page = "Curator" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/curator diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index 3eddc92c017d..460406436e97 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -1,8 +1,6 @@ /datum/job/cyborg name = "Cyborg" auto_deadmin_role_flags = DEADMIN_POSITION_SILICON - total_positions = 0 - spawn_positions = 1 //Nodrak minimal_player_age = 21 wiki_page = "Cyborg" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 9a263ae85207..450ac5064e34 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -1,8 +1,6 @@ /datum/job/detective name = "Detective" auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 wiki_page = "Space_Law" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 181109e65c31..2720dcf064fd 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -1,7 +1,5 @@ /datum/job/geneticist - name = "Geneticist" //WS Edit - More Gen/Sci Split - total_positions = 2 - spawn_positions = 2 //WS Edit - Gen/Sci Split + name = "Geneticist" wiki_page = "Guide_to_Genetics" //WS Edit - Wikilinks outfit = /datum/outfit/job/geneticist diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 205d5e57bb94..d75ff460c750 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -1,8 +1,6 @@ /datum/job/head_of_personnel name = "Head of Personnel" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - total_positions = 1 - spawn_positions = 1 minimal_player_age = 10 officer = TRUE wiki_page = "Head_of_Personnel" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 0f786bb29b69..f38c9fd3a901 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -1,8 +1,6 @@ /datum/job/hos name = "Head of Security" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - total_positions = 1 - spawn_positions = 1 minimal_player_age = 14 officer = TRUE wiki_page = "Head_of_Security" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 6abec33ca735..6f673a06195d 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -1,7 +1,5 @@ /datum/job/janitor name = "Janitor" - total_positions = 2 - spawn_positions = 1 wiki_page = "Janitor" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/janitor diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index af30fb3e129e..d0777a8af2f8 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -1,7 +1,5 @@ /datum/job/lawyer name = "Lawyer" - total_positions = 2 - spawn_positions = 2 wiki_page = "Lawyer" //WS Edit - Wikilinks/Warning var/lawyers = 0 //Counts lawyer amount diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index a1ea895ee0d6..49a23855c3c8 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -1,7 +1,5 @@ /datum/job/doctor name = "Medical Doctor" - total_positions = 5 - spawn_positions = 3 wiki_page = "Guide_to_Medicine" outfit = /datum/outfit/job/doctor diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index b9cca8f02106..3d165c8610b7 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -1,7 +1,5 @@ /datum/job/mime name = "Mime" - total_positions = 1 - spawn_positions = 1 wiki_page = "Mime" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/mime diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 01fd52f07dcf..a51249c10f7d 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -1,7 +1,5 @@ /datum/job/paramedic name = "Paramedic" - total_positions = 2 - spawn_positions = 2 wiki_page = "Paramedic" outfit = /datum/outfit/job/paramedic diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 2e26dd90d67a..16195bfc1a85 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -1,7 +1,5 @@ /datum/job/prisoner name = "Prisoner" - total_positions = 0 - spawn_positions = 2 outfit = /datum/outfit/job/prisoner diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index 5bf7d50c790c..de4a0eb10a24 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -1,8 +1,6 @@ //psychologist back :) /datum/job/psychologist name = "Psychologist" - total_positions = 1 - spawn_positions = 1 outfit = /datum/outfit/job/psychologist diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index e7a94cc0f99e..3399fb9de9f1 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -1,7 +1,5 @@ /datum/job/qm name = "Quartermaster" - total_positions = 1 - spawn_positions = 1 wiki_page = "Quartermaster" //WS Edit - Wikilinks/Warning officer = TRUE diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 2fd7fea06db7..7a91f58996a4 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -1,8 +1,6 @@ /datum/job/rd name = "Research Director" auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 officer = TRUE wiki_page = "Research_Director" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index bf08b5667e5f..2543d1caa852 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -1,7 +1,5 @@ /datum/job/roboticist name = "Roboticist" - total_positions = 2 - spawn_positions = 2 wiki_page = "Guide_to_Robotics" outfit = /datum/outfit/job/roboticist diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 6db93bac91a7..78f0407d2604 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -1,7 +1,5 @@ /datum/job/scientist name = "Scientist" - total_positions = 5 - spawn_positions = 3 wiki_page = "Scientist" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/scientist diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index e180bde52d18..d847e015cde6 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -1,8 +1,6 @@ /datum/job/officer name = "Security Officer" auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() minimal_player_age = 7 wiki_page = "Space_Law" //WS Edit - Wikilinks/Warning diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 1f8876091a9f..1fade6b2ecf0 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -1,7 +1,5 @@ /datum/job/mining name = "Shaft Miner" - total_positions = 3 - spawn_positions = 3 wiki_page = "Shaft_Miner" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/miner diff --git a/code/modules/jobs/job_types/solgov_rep.dm b/code/modules/jobs/job_types/solgov_rep.dm index a7c185624763..f95b520e2850 100644 --- a/code/modules/jobs/job_types/solgov_rep.dm +++ b/code/modules/jobs/job_types/solgov_rep.dm @@ -4,8 +4,6 @@ SolGov Representative /datum/job/solgov name = "SolGov Representative" - total_positions = 2 - spawn_positions = 2 wiki_page = "Government_Attaché" minimal_player_age = 7 officer = TRUE diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 42a6e0774f2f..cf774d8a25bb 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -1,7 +1,5 @@ /datum/job/engineer name = "Station Engineer" - total_positions = 5 - spawn_positions = 5 wiki_page = "Station_Engineer" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/engineer diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 85f038e1b476..ac0a3986634d 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -1,7 +1,5 @@ /datum/job/virologist name = "Virologist" - total_positions = 1 - spawn_positions = 1 wiki_page = "Infections" //WS Edit - Wikilinks/Warning outfit = /datum/outfit/job/virologist diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index d3daa2c112bf..08aeaab16e8d 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -1,8 +1,6 @@ /datum/job/warden name = "Warden" auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - total_positions = 1 - spawn_positions = 1 minimal_player_age = 7 officer = TRUE wiki_page = "Space_Law" //WS Edit - Wikilinks/Warning diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm index 355af961f299..c7ca52968f86 100644 --- a/code/modules/mob/dead/crew_manifest.dm +++ b/code/modules/mob/dead/crew_manifest.dm @@ -19,5 +19,5 @@ /datum/crew_manifest/ui_static_data(mob/user) return list( - "manifest" = SSjob.get_manifest() + "manifest" = SSovermap.get_manifest() ) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index a1062f6864d2..6597e5282a9f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -309,7 +309,8 @@ character = equip if(job && !job.override_latejoin_spawn(character)) - SSjob.SendToLateJoin(character, destination = pick(ship.shuttle_port.spawn_points)) + var/atom/spawn_point = pick(ship.shuttle_port.spawn_points) + spawn_point.join_player_here(character) var/atom/movable/screen/splash/Spl = new(character.client, TRUE) Spl.Fade(TRUE) character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 822a49c65e65..f5d37597ed84 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -51,7 +51,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) jitteriness = 0 if(client && !(client in GLOB.dead_players_during_shift)) GLOB.dead_players_during_shift += client - GLOB.deaths_during_shift++ if(ismecha(loc)) var/obj/mecha/M = loc if(M.occupant == src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 459de6c78c0d..4f3399675f0a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1713,11 +1713,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) else H.adjustOrganLoss(ORGAN_SLOT_BRAIN, I.force * 0.2) - if(H.mind && H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma. - var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(FALSE, user) - if(bloody) //Apply blood if(H.wear_mask) H.wear_mask.add_mob_blood(H) diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index ad28d663690d..559ad42b1768 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -1,9 +1,6 @@ /mob/living/silicon/Login() if(mind && SSticker.mode) SSticker.mode.remove_cultist(mind, 0, 0) - var/datum/antagonist/rev/rev = mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(TRUE) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index bbd925035043..2de9fba68678 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -33,7 +33,7 @@ dummy_prefs.pref_species = new /datum/species/zombie dummy_prefs.randomise[RANDOM_BODY] = TRUE if(zombiejob) - var/datum/job/J = SSjob.GetJob(zombiejob) + var/datum/job/J = GLOB.name_occupations[zombiejob] var/datum/outfit/O if(J.outfit) O = new J.outfit diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index cbc6599a3980..b3719d9cca52 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -106,5 +106,3 @@ return client.holder.auto_deadmin() if(mind.has_antag_datum(/datum/antagonist) && (CONFIG_GET(flag/auto_deadmin_antagonists) || client.prefs?.toggles & DEADMIN_ANTAGONIST)) return client.holder.auto_deadmin() - if(job) - return SSjob.handle_auto_deadmin_roles(client, job) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 69ec7e9ca5cd..f7ef27f0c298 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -330,9 +330,6 @@ return FALSE if(M.mind && M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist. switch(SSticker.mode.config_tag) - if("revolution") - if(is_revolutionary(M)) - return 2 if("cult") if(M.mind in SSticker.mode.cult) return 2 diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index 3c741e987ea5..fba43fdd5403 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -80,7 +80,6 @@ var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) hard_drive.store_file(new/datum/computer_file/program/card_mod()) - hard_drive.store_file(new/datum/computer_file/program/job_management()) // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index 0577d3eb668c..d48df5159671 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -272,6 +272,7 @@ eligible = TRUE ) LAZYSET(owner_candidates, H.mind, mind_info) + H.mind.original_ship = WEAKREF(src) RegisterSignal(H.mind, COMSIG_PARENT_QDELETING, .proc/crew_mind_deleting) if(!owner_mob) set_owner_mob(H) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 5196298a80c3..843297c9307d 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -502,15 +502,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" -/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M) - if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - M.adjustToxLoss(-1, 0) - M.adjustOxyLoss(-5, 0) - . = 1 - return ..() || . - /datum/reagent/consumable/ethanol/whiskey_cola name = "Whiskey Cola" description = "Whiskey, mixed with cola. Surprisingly refreshing." diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm index 7d82324a8de1..e0f490ca1123 100644 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ b/code/modules/research/nanites/nanite_programs/buffing.dm @@ -116,9 +116,8 @@ /datum/nanite_program/mindshield/enable_passive_effect() . = ..() - if(!host_mob.mind.has_antag_datum(/datum/antagonist/rev, TRUE)) //won't work if on a rev, to avoid having implanted revs. - ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") - host_mob.sec_hud_set_implants() + ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") + host_mob.sec_hud_set_implants() /datum/nanite_program/mindshield/disable_passive_effect() . = ..() diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index 61425a82cf0c..e0ef3566fa0d 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -30,7 +30,7 @@ var/mob/living/victim = targets[1] //The target of the spell whos body will be transferred to. var/datum/mind/VM = victim.mind - if(victim.anti_magic_check(TRUE, FALSE) || VM.has_antag_datum(/datum/antagonist/wizard) || VM.has_antag_datum(/datum/antagonist/cult) || VM.has_antag_datum(/datum/antagonist/changeling) || VM.has_antag_datum(/datum/antagonist/rev) || victim.key[1] == "@") + if(victim.anti_magic_check(TRUE, FALSE) || VM.has_antag_datum(/datum/antagonist/wizard) || VM.has_antag_datum(/datum/antagonist/cult) || VM.has_antag_datum(/datum/antagonist/changeling) || victim.key[1] == "@") if(!silent) to_chat(user, "[victim.p_their(TRUE)] mind is resisting your spell!") return FALSE diff --git a/shiptest.dme b/shiptest.dme index a5ac08c6a055..1303fb845c60 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -219,6 +219,7 @@ #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\faxes.dm" #include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\jobs.dm" #include "code\_globalvars\lists\keybindings.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" @@ -252,7 +253,6 @@ #include "code\_onclick\hud\credits.dm" #include "code\_onclick\hud\devil.dm" #include "code\_onclick\hud\drones.dm" -#include "code\_onclick\hud\families.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\generic_dextrous.dm" #include "code\_onclick\hud\ghost.dm" @@ -316,7 +316,6 @@ #include "code\controllers\subsystem\idlenpcpool.dm" #include "code\controllers\subsystem\input.dm" #include "code\controllers\subsystem\ipintel.dm" -#include "code\controllers\subsystem\job.dm" #include "code\controllers\subsystem\jukeboxes.dm" #include "code\controllers\subsystem\lag_switch.dm" #include "code\controllers\subsystem\language.dm" @@ -814,12 +813,9 @@ #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\gang\gang.dm" -#include "code\game\gamemodes\gang\gang_things.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\sandbox\airlock_maker.dm" #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" @@ -1661,7 +1657,6 @@ #include "code\modules\antagonists\fugitive\fugitive_outfits.dm" #include "code\modules\antagonists\fugitive\fugitive_ship.dm" #include "code\modules\antagonists\fugitive\hunter.dm" -#include "code\modules\antagonists\gang\gang.dm" #include "code\modules\antagonists\gang\outfits.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\magic_servant\servant.dm" @@ -1682,7 +1677,6 @@ #include "code\modules\antagonists\revenant\revenant_antag.dm" #include "code\modules\antagonists\revenant\revenant_blight.dm" #include "code\modules\antagonists\revenant\revenant_spawn_event.dm" -#include "code\modules\antagonists\revolution\revolution.dm" #include "code\modules\antagonists\santa\santa.dm" #include "code\modules\antagonists\separatist\separatist.dm" #include "code\modules\antagonists\slaughter\slaughter.dm" @@ -2769,7 +2763,6 @@ #include "code\modules\modular_computers\file_system\programs\cargoship.dm" #include "code\modules\modular_computers\file_system\programs\configurator.dm" #include "code\modules\modular_computers\file_system\programs\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\jobmanagement.dm" #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" From b9391acb4293b3bc7a9d80c8bf417d895442d03d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 14 Sep 2023 11:38:04 -0500 Subject: [PATCH 38/57] Automatic changelog generation for PR #2127 [ci skip] --- html/changelogs/AutoChangeLog-pr-2127.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2127.yml diff --git a/html/changelogs/AutoChangeLog-pr-2127.yml b/html/changelogs/AutoChangeLog-pr-2127.yml new file mode 100644 index 000000000000..f81c335488d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2127.yml @@ -0,0 +1,5 @@ +author: MarkSuckerberg +delete-after: true +changes: + - rscdel: Gang and revs gamemode (the gear remains) + - admin: Removes SSjob, occupations are now stored in a global list From 7b10e32320d00208c744586d8e2819ccd4152ff3 Mon Sep 17 00:00:00 2001 From: Mark Suckerberg Date: Thu, 14 Sep 2023 11:26:01 -0500 Subject: [PATCH 39/57] Hopefully adds proper annotations to the regex linter (#2352) ## About The Pull Request See title ## Why It's Good For The Game More clear what's going wrong when linters fails ## Changelog :cl: /:cl: --- .github/workflows/ci_suite.yml | 2 +- tools/ci/check_regex.py | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 20378d43932b..f844f8da5747 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -59,7 +59,7 @@ jobs: python-version: "3.9" - name: Run Check Regex run: | - tools/bootstrap/python -m ci.check_regex --log-changes-only + tools/bootstrap/python -m ci.check_regex --log-changes-only --github-actions - name: Annotate Regex Matches if: always() run: | diff --git a/tools/ci/check_regex.py b/tools/ci/check_regex.py index 279d8236cbd6..f104139b7e18 100644 --- a/tools/ci/check_regex.py +++ b/tools/ci/check_regex.py @@ -31,6 +31,10 @@ modification, or removal. Good if you want to track down errors caused by commit or PR changes. + --github-actions + An output option to format the output in a way that Github Actions + can parse and show as annotations in the PR. + Copyright 2021 Martin Lyrå Permission is hereby granted, free of charge, to any person obtaining a copy @@ -99,6 +103,12 @@ dest="log_changes_only", default=False, action="store_true") +options.add_argument( + "--github-actions", + dest="github_actions", + default=False, + action="store_true" +) args = options.parse_args() @@ -790,9 +800,25 @@ def git_get_detached_head_ref(head: Head, ref_info: str) -> str: show_items.append("Current (%4i): %s" % (len(matches), matches)) if len(adds): show_items.append("+++++++ (%4i): %s" % (len(adds), adds)) + #Github actions annotations + if args.github_actions and matching != RESULT_OK: + for line_no in adds: + output_write("::error file=%s,line=%i,title=Check Regex::%s added to here, remove or update check_regex.yml" % ( + f, + line_no, + standard.message + ), to_stdout=True, to_file=False) inner_prefix = prefix if len(removes): show_items.append("------- (%4i): %s" % (len(removes), removes)) + #Github actions annotations + if args.github_actions and matching != RESULT_OK: + for line_no in removes: + output_write("::error file=%s,line=%i,title=Check Regex::%s removed from here, update check_regex.yml" % ( + f, + line_no, + standard.message + ), to_stdout=True, to_file=False) inner_prefix = prefix lines.append("%2s %s" % ("\u2500\u252C", f)) @@ -898,4 +924,4 @@ def git_get_detached_head_ref(head: Head, ref_info: str) -> str: output_file.close() output_file = None - exit(failure > 0 or fail_files > 0) \ No newline at end of file + exit(failure > 0 or fail_files > 0) From 877174c815c43edb18bb7ebd2858d80e7c4aa75f Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu, 14 Sep 2023 11:41:27 -0500 Subject: [PATCH 40/57] Rations! (#2260) ## About The Pull Request Adds a whole bunch of highly varied rations to replace the common beans, donks, and rationpacks that litter most ships https://hackmd.io/THabcH5VRuuHCBjSV9iJgQ Sprites were done by stiel! ## Why It's Good For The Game Fixes weird lore stuff about why donk pockets would be on none syndicate ships and helps give edible food to species with limited diets + everyone hates rationpacks ## Changelog :cl: add: better rations del: rationpack spawns /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: Slashy Slasher Co-authored-by: Mark Suckerberg --- .../Ships/independent_sugarcube.dmm | 4 +- _maps/deprecated/Ships/minutemen_carina.dmm | 20 +- _maps/deprecated/Ships/nanotrasen_pubby.dmm | 4 +- .../deprecated/Ships/syndicate_kugelblitz.dmm | 2 +- .../shuttles/shiptest/independent_beluga.dmm | 2 +- _maps/shuttles/shiptest/independent_box.dmm | 4 +- .../shiptest/independent_boyardee.dmm | 4 +- _maps/shuttles/shiptest/independent_byo.dmm | 12 +- .../shuttles/shiptest/independent_caravan.dmm | 4 +- .../shuttles/shiptest/independent_dwayne.dmm | 14 +- .../shiptest/independent_halftrack.dmm | 4 +- _maps/shuttles/shiptest/independent_kilo.dmm | 4 +- .../shiptest/independent_litieguai.dmm | 4 +- _maps/shuttles/shiptest/independent_meta.dmm | 2 +- .../shiptest/independent_mudskipper.dmm | 8 +- .../shuttles/shiptest/independent_rigger.dmm | 16 +- .../shiptest/independent_rube_goldberg.dmm | 6 +- .../shiptest/independent_shetland.dmm | 16 +- _maps/shuttles/shiptest/inteq_colossus.dmm | 24 +- _maps/shuttles/shiptest/inteq_hound.dmm | 14 +- _maps/shuttles/shiptest/inteq_talos.dmm | 14 +- _maps/shuttles/shiptest/inteq_vaquero.dmm | 20 +- .../shuttles/shiptest/minutemen_asclepius.dmm | 4 +- _maps/shuttles/shiptest/minutemen_cepheus.dmm | 4 +- _maps/shuttles/shiptest/minutemen_corvus.dmm | 4 +- _maps/shuttles/shiptest/minutemen_vela.dmm | 2 +- _maps/shuttles/shiptest/nanotrasen_delta.dmm | 14 +- _maps/shuttles/shiptest/nanotrasen_gecko.dmm | 14 +- _maps/shuttles/shiptest/nanotrasen_mimir.dmm | 8 +- _maps/shuttles/shiptest/nanotrasen_osprey.dmm | 12 +- .../shuttles/shiptest/nanotrasen_skipper.dmm | 2 +- _maps/shuttles/shiptest/pirate_libertatia.dmm | 16 +- .../shiptest/syndicate_gorlex_hyena.dmm | 12 +- .../subshuttles/independent_sugarcube.dmm | 4 +- code/_globalvars/lists/maintenance_loot.dm | 1 + code/datums/components/storage/storage.dm | 17 +- .../game/objects/effects/spawners/lootdrop.dm | 25 + code/game/objects/items/storage/ration.dm | 386 +++++++++ code/modules/cargo/packs/food.dm | 13 + code/modules/food_and_drinks/drinks/drinks.dm | 35 + .../modules/food_and_drinks/food/condiment.dm | 5 - code/modules/food_and_drinks/food/ration.dm | 767 ++++++++++++++++++ .../food_and_drinks/food/snacks_other.dm | 6 +- .../kitchen_machinery/microwave.dm | 48 ++ .../chemistry/reagents/food_reagents.dm | 14 + icons/obj/food/ration.dmi | Bin 0 -> 1832 bytes shiptest.dme | 2 + sound/effects/rip3.ogg | Bin 0 -> 33531 bytes 48 files changed, 1453 insertions(+), 164 deletions(-) create mode 100644 code/game/objects/items/storage/ration.dm create mode 100644 code/modules/food_and_drinks/food/ration.dm create mode 100644 icons/obj/food/ration.dmi create mode 100644 sound/effects/rip3.ogg diff --git a/_maps/deprecated/Ships/independent_sugarcube.dmm b/_maps/deprecated/Ships/independent_sugarcube.dmm index 91d92a7fce0b..53e73a592993 100644 --- a/_maps/deprecated/Ships/independent_sugarcube.dmm +++ b/_maps/deprecated/Ships/independent_sugarcube.dmm @@ -59,8 +59,8 @@ /turf/open/floor/plating, /area/ship/storage) "h" = ( -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/trash/cheesie, /obj/item/trash/cheesie, /obj/item/trash/candy, diff --git a/_maps/deprecated/Ships/minutemen_carina.dmm b/_maps/deprecated/Ships/minutemen_carina.dmm index f3c74f713347..00b2bbfc33ba 100644 --- a/_maps/deprecated/Ships/minutemen_carina.dmm +++ b/_maps/deprecated/Ships/minutemen_carina.dmm @@ -2031,8 +2031,8 @@ /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/reagent_containers/food/snacks/meat/slab, /obj/item/reagent_containers/food/snacks/meat/slab, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/camera/autoname, /turf/open/floor/plasteel/mono, /area/ship/crew) @@ -3662,14 +3662,14 @@ pixel_x = 1; pixel_y = -3 }, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 diff --git a/_maps/deprecated/Ships/nanotrasen_pubby.dmm b/_maps/deprecated/Ships/nanotrasen_pubby.dmm index a1680beacbaf..179c7e811e65 100644 --- a/_maps/deprecated/Ships/nanotrasen_pubby.dmm +++ b/_maps/deprecated/Ships/nanotrasen_pubby.dmm @@ -236,8 +236,8 @@ /obj/machinery/microwave{ pixel_y = 2 }, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets{ +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration{ pixel_x = 3; pixel_y = 2 }, diff --git a/_maps/deprecated/Ships/syndicate_kugelblitz.dmm b/_maps/deprecated/Ships/syndicate_kugelblitz.dmm index 307df52d270e..27986b9fbc77 100644 --- a/_maps/deprecated/Ships/syndicate_kugelblitz.dmm +++ b/_maps/deprecated/Ships/syndicate_kugelblitz.dmm @@ -801,7 +801,7 @@ /obj/item/radio, /obj/item/radio, /obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/mineral/plastitanium, /area/ship/crew) "mv" = ( diff --git a/_maps/shuttles/shiptest/independent_beluga.dmm b/_maps/shuttles/shiptest/independent_beluga.dmm index 8737c51a64e6..471140ec16fa 100644 --- a/_maps/shuttles/shiptest/independent_beluga.dmm +++ b/_maps/shuttles/shiptest/independent_beluga.dmm @@ -1071,7 +1071,7 @@ pixel_y = -32 }, /obj/item/storage/bag/tray, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = 6; pixel_y = 6 }, diff --git a/_maps/shuttles/shiptest/independent_box.dmm b/_maps/shuttles/shiptest/independent_box.dmm index 0a011231ffbd..f46c36b3cec9 100644 --- a/_maps/shuttles/shiptest/independent_box.dmm +++ b/_maps/shuttles/shiptest/independent_box.dmm @@ -1425,10 +1425,10 @@ /area/ship/medical) "nA" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_y = 3 }, -/obj/effect/spawner/lootdrop/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = -5; pixel_y = 3 }, diff --git a/_maps/shuttles/shiptest/independent_boyardee.dmm b/_maps/shuttles/shiptest/independent_boyardee.dmm index bb35d794651d..bd9296d7fa75 100644 --- a/_maps/shuttles/shiptest/independent_boyardee.dmm +++ b/_maps/shuttles/shiptest/independent_boyardee.dmm @@ -223,7 +223,7 @@ /area/ship/storage) "ej" = ( /obj/structure/table/reinforced, -/obj/item/storage/box/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/corner/opaque/white/half, /obj/effect/turf_decal/corner/opaque/white{ dir = 4 @@ -2259,7 +2259,7 @@ /area/ship/crew) "Qc" = ( /obj/structure/table/reinforced, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/structure/cable{ icon_state = "4-8" }, diff --git a/_maps/shuttles/shiptest/independent_byo.dmm b/_maps/shuttles/shiptest/independent_byo.dmm index 458d8c6f0fb3..e7aed1945ea5 100644 --- a/_maps/shuttles/shiptest/independent_byo.dmm +++ b/_maps/shuttles/shiptest/independent_byo.dmm @@ -585,12 +585,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plating/airless, /area/ship/construction) "Vu" = ( diff --git a/_maps/shuttles/shiptest/independent_caravan.dmm b/_maps/shuttles/shiptest/independent_caravan.dmm index 8f9837c4065f..4f4554641a9a 100644 --- a/_maps/shuttles/shiptest/independent_caravan.dmm +++ b/_maps/shuttles/shiptest/independent_caravan.dmm @@ -846,8 +846,8 @@ /area/ship/crew) "oA" = ( /obj/structure/table/reinforced, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/kitchen/knife, /obj/item/kitchen/rollingpin, /turf/open/floor/carpet/royalblue, diff --git a/_maps/shuttles/shiptest/independent_dwayne.dmm b/_maps/shuttles/shiptest/independent_dwayne.dmm index ecf9b941b994..6f86b626025b 100644 --- a/_maps/shuttles/shiptest/independent_dwayne.dmm +++ b/_maps/shuttles/shiptest/independent_dwayne.dmm @@ -63,7 +63,7 @@ icon_state = "4-8" }, /obj/structure/table/wood, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/item/storage/cans/sixbeer, /turf/open/floor/wood, /area/ship/crew) @@ -811,12 +811,12 @@ icon_state = "1-2" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plasteel/tech/grid, /area/ship/engineering) "rE" = ( diff --git a/_maps/shuttles/shiptest/independent_halftrack.dmm b/_maps/shuttles/shiptest/independent_halftrack.dmm index b2a10b35c53e..01dce81860b9 100644 --- a/_maps/shuttles/shiptest/independent_halftrack.dmm +++ b/_maps/shuttles/shiptest/independent_halftrack.dmm @@ -179,8 +179,8 @@ /area/ship/crew) "fa" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/newscaster/directional/south, /turf/open/floor/carpet/nanoweave, /area/ship/crew) diff --git a/_maps/shuttles/shiptest/independent_kilo.dmm b/_maps/shuttles/shiptest/independent_kilo.dmm index 2c9d8a006140..48c5487f6ebe 100644 --- a/_maps/shuttles/shiptest/independent_kilo.dmm +++ b/_maps/shuttles/shiptest/independent_kilo.dmm @@ -1412,11 +1412,11 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = -6; pixel_y = 4 }, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = -6; pixel_y = 8 }, diff --git a/_maps/shuttles/shiptest/independent_litieguai.dmm b/_maps/shuttles/shiptest/independent_litieguai.dmm index cf8ac312b338..65710c834f80 100644 --- a/_maps/shuttles/shiptest/independent_litieguai.dmm +++ b/_maps/shuttles/shiptest/independent_litieguai.dmm @@ -205,8 +205,8 @@ /area/ship/hallway/aft) "fa" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/newscaster/directional/south, /turf/open/floor/plasteel/grimy, /area/ship/crew) diff --git a/_maps/shuttles/shiptest/independent_meta.dmm b/_maps/shuttles/shiptest/independent_meta.dmm index 52232d6b22b0..8a640e7e64a4 100644 --- a/_maps/shuttles/shiptest/independent_meta.dmm +++ b/_maps/shuttles/shiptest/independent_meta.dmm @@ -611,7 +611,7 @@ /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, -/obj/item/storage/box/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/corner/transparent/bar, /obj/effect/turf_decal/corner/transparent/bar{ dir = 1 diff --git a/_maps/shuttles/shiptest/independent_mudskipper.dmm b/_maps/shuttles/shiptest/independent_mudskipper.dmm index 2f3900971f1b..033800b8f8e5 100644 --- a/_maps/shuttles/shiptest/independent_mudskipper.dmm +++ b/_maps/shuttles/shiptest/independent_mudskipper.dmm @@ -1795,10 +1795,10 @@ /obj/structure/closet/crate{ name = "ration crate" }, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/snacks/canned/beans, /obj/item/reagent_containers/food/snacks/canned/beans, /obj/item/reagent_containers/food/snacks/canned/beans, diff --git a/_maps/shuttles/shiptest/independent_rigger.dmm b/_maps/shuttles/shiptest/independent_rigger.dmm index 00347dae6852..6ebe28fedadc 100644 --- a/_maps/shuttles/shiptest/independent_rigger.dmm +++ b/_maps/shuttles/shiptest/independent_rigger.dmm @@ -225,8 +225,8 @@ /area/ship/construction) "dx" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/corner/opaque/yellow/diagonal, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/plasteel/white, @@ -947,12 +947,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/box/corners{ dir = 1 }, diff --git a/_maps/shuttles/shiptest/independent_rube_goldberg.dmm b/_maps/shuttles/shiptest/independent_rube_goldberg.dmm index 69043b560f0d..50febf2f2550 100644 --- a/_maps/shuttles/shiptest/independent_rube_goldberg.dmm +++ b/_maps/shuttles/shiptest/independent_rube_goldberg.dmm @@ -2852,9 +2852,9 @@ /area/ship/engineering/atmospherics) "Ck" = ( /obj/structure/closet/crate/freezer, -/obj/item/storage/box/donkpockets/donkpocketpizza, -/obj/item/storage/box/donkpockets/donkpocketspicy, -/obj/item/storage/box/donkpockets/donkpocketteriyaki, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/pizzabox/meat, /obj/item/pizzabox/vegetable, /obj/machinery/camera/autoname{ diff --git a/_maps/shuttles/shiptest/independent_shetland.dmm b/_maps/shuttles/shiptest/independent_shetland.dmm index 173322da6bd4..062e8a8f61f3 100644 --- a/_maps/shuttles/shiptest/independent_shetland.dmm +++ b/_maps/shuttles/shiptest/independent_shetland.dmm @@ -975,8 +975,8 @@ /area/ship/engineering/engine) "kO" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/corner/opaque/white{ dir = 10 }, @@ -1157,12 +1157,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/box, /turf/open/floor/plating{ icon_state = "platingdmg2" diff --git a/_maps/shuttles/shiptest/inteq_colossus.dmm b/_maps/shuttles/shiptest/inteq_colossus.dmm index 17bdf1f38f25..04c52ce9626f 100644 --- a/_maps/shuttles/shiptest/inteq_colossus.dmm +++ b/_maps/shuttles/shiptest/inteq_colossus.dmm @@ -235,8 +235,8 @@ locked = 0; name = "fridge" }, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/storage/cans/sixbeer, /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 @@ -1591,16 +1591,16 @@ dir = 1 }, /obj/structure/closet/crate, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, diff --git a/_maps/shuttles/shiptest/inteq_hound.dmm b/_maps/shuttles/shiptest/inteq_hound.dmm index 5df3e85787e5..e937caddf2bd 100644 --- a/_maps/shuttles/shiptest/inteq_hound.dmm +++ b/_maps/shuttles/shiptest/inteq_hound.dmm @@ -27,8 +27,8 @@ locked = 0; name = "fridge" }, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/storage/cans/sixbeer, /obj/item/reagent_containers/food/snacks/icecreamsandwich, /obj/machinery/light/directional/south, @@ -2038,11 +2038,11 @@ dir = 4 }, /obj/structure/closet/crate, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, /turf/open/floor/plasteel/patterned/cargo_one, diff --git a/_maps/shuttles/shiptest/inteq_talos.dmm b/_maps/shuttles/shiptest/inteq_talos.dmm index 052d1010728b..92187aee8641 100644 --- a/_maps/shuttles/shiptest/inteq_talos.dmm +++ b/_maps/shuttles/shiptest/inteq_talos.dmm @@ -2489,8 +2489,8 @@ name = "fridge" }, /obj/item/storage/cans/sixbeer, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/snacks/popsicle/creamsicle_orange, /obj/item/reagent_containers/food/snacks/popsicle/creamsicle_orange, /obj/item/radio/intercom/directional/north, @@ -7074,11 +7074,11 @@ /obj/structure/closet/crate{ name = "food crate" }, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, diff --git a/_maps/shuttles/shiptest/inteq_vaquero.dmm b/_maps/shuttles/shiptest/inteq_vaquero.dmm index 6e380f8b0bf1..4019964cc483 100644 --- a/_maps/shuttles/shiptest/inteq_vaquero.dmm +++ b/_maps/shuttles/shiptest/inteq_vaquero.dmm @@ -1513,16 +1513,16 @@ dir = 1 }, /obj/structure/closet/crate, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, /obj/item/reagent_containers/food/drinks/waterbottle/large, diff --git a/_maps/shuttles/shiptest/minutemen_asclepius.dmm b/_maps/shuttles/shiptest/minutemen_asclepius.dmm index 787be58f3cd0..ed665fcd4fad 100644 --- a/_maps/shuttles/shiptest/minutemen_asclepius.dmm +++ b/_maps/shuttles/shiptest/minutemen_asclepius.dmm @@ -2707,8 +2707,8 @@ /obj/machinery/microwave{ pixel_y = 2 }, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/wood, /area/ship/hallway/central) "AY" = ( diff --git a/_maps/shuttles/shiptest/minutemen_cepheus.dmm b/_maps/shuttles/shiptest/minutemen_cepheus.dmm index 5196010b4bf5..de6f56531bb5 100644 --- a/_maps/shuttles/shiptest/minutemen_cepheus.dmm +++ b/_maps/shuttles/shiptest/minutemen_cepheus.dmm @@ -97,11 +97,11 @@ /area/ship/engineering/electrical) "bn" = ( /obj/item/storage/bag/tray, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = 8; pixel_y = 8 }, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = 6; pixel_y = 6 }, diff --git a/_maps/shuttles/shiptest/minutemen_corvus.dmm b/_maps/shuttles/shiptest/minutemen_corvus.dmm index edcdbd0fe6ea..907c9dc222e3 100644 --- a/_maps/shuttles/shiptest/minutemen_corvus.dmm +++ b/_maps/shuttles/shiptest/minutemen_corvus.dmm @@ -1527,8 +1527,8 @@ }, /obj/item/reagent_containers/food/snacks/hotdog, /obj/item/storage/cans/sixbeer, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plastic, /area/ship/hallway/central) "Eo" = ( diff --git a/_maps/shuttles/shiptest/minutemen_vela.dmm b/_maps/shuttles/shiptest/minutemen_vela.dmm index 037e1d33c1bb..1bbb3680a44b 100644 --- a/_maps/shuttles/shiptest/minutemen_vela.dmm +++ b/_maps/shuttles/shiptest/minutemen_vela.dmm @@ -3479,7 +3479,7 @@ /obj/item/pizzabox/pineapple, /obj/item/pizzabox/pineapple, /obj/item/pizzabox/pineapple, -/obj/item/storage/box/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/glass/mortar/metal, /obj/item/pestle, /obj/item/reagent_containers/food/condiment/saltshaker, diff --git a/_maps/shuttles/shiptest/nanotrasen_delta.dmm b/_maps/shuttles/shiptest/nanotrasen_delta.dmm index 673dc0cb88ea..67e7dd8f1afc 100644 --- a/_maps/shuttles/shiptest/nanotrasen_delta.dmm +++ b/_maps/shuttles/shiptest/nanotrasen_delta.dmm @@ -239,11 +239,11 @@ }, /obj/structure/closet/crate, /obj/effect/turf_decal/industrial/outline/yellow, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plasteel/patterned, /area/ship/cargo) "bd" = ( @@ -1021,8 +1021,8 @@ dir = 1; pixel_y = -32 }, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/storage/cans/sixbeer, /turf/open/floor/plasteel, /area/ship/crew) diff --git a/_maps/shuttles/shiptest/nanotrasen_gecko.dmm b/_maps/shuttles/shiptest/nanotrasen_gecko.dmm index bba93f324f62..529647a0cbb9 100644 --- a/_maps/shuttles/shiptest/nanotrasen_gecko.dmm +++ b/_maps/shuttles/shiptest/nanotrasen_gecko.dmm @@ -950,9 +950,9 @@ /area/ship/bridge) "jc" = ( /obj/structure/table/reinforced, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/radio/intercom/directional/east, /turf/open/floor/plasteel/grimy, /area/ship/crew) @@ -1421,10 +1421,10 @@ /obj/item/reagent_containers/food/snacks/canned/beans, /obj/item/reagent_containers/food/snacks/canned/beans, /obj/structure/closet/crate, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plasteel/patterned, /area/ship/storage) "oR" = ( diff --git a/_maps/shuttles/shiptest/nanotrasen_mimir.dmm b/_maps/shuttles/shiptest/nanotrasen_mimir.dmm index a7e2a5042350..5e8f8530b1cd 100644 --- a/_maps/shuttles/shiptest/nanotrasen_mimir.dmm +++ b/_maps/shuttles/shiptest/nanotrasen_mimir.dmm @@ -881,7 +881,7 @@ /area/ship/engineering) "fd" = ( /obj/structure/table/wood/reinforced, -/obj/item/storage/box/donkpockets/donkpocketteriyaki{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = 5; pixel_y = 5 }, @@ -913,7 +913,7 @@ pixel_x = -5; pixel_y = -7 }, -/obj/item/storage/box/donkpockets{ +/obj/effect/spawner/lootdrop/ration{ pixel_x = 6; pixel_y = 11 }, @@ -4933,7 +4933,7 @@ /area/ship/crew/canteen) "Dh" = ( /obj/structure/table/wood, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plasteel, /area/ship/security/prison) "Dm" = ( @@ -8572,7 +8572,7 @@ /area/ship/engineering/atmospherics) "XY" = ( /obj/structure/table/wood, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/spline/plain/opaque/blue, /turf/open/floor/plasteel, /area/ship/security/prison) diff --git a/_maps/shuttles/shiptest/nanotrasen_osprey.dmm b/_maps/shuttles/shiptest/nanotrasen_osprey.dmm index 27564870d7a9..970e3b2031f0 100644 --- a/_maps/shuttles/shiptest/nanotrasen_osprey.dmm +++ b/_maps/shuttles/shiptest/nanotrasen_osprey.dmm @@ -2897,12 +2897,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, diff --git a/_maps/shuttles/shiptest/nanotrasen_skipper.dmm b/_maps/shuttles/shiptest/nanotrasen_skipper.dmm index 29f6ee5dfbdb..75215dc349a9 100644 --- a/_maps/shuttles/shiptest/nanotrasen_skipper.dmm +++ b/_maps/shuttles/shiptest/nanotrasen_skipper.dmm @@ -4415,7 +4415,7 @@ /obj/effect/turf_decal/industrial/outline/yellow, /obj/effect/spawner/lootdrop/maintenance/five, /obj/structure/closet/cardboard, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, /turf/open/floor/plasteel/mono, /area/ship/cargo) "MI" = ( diff --git a/_maps/shuttles/shiptest/pirate_libertatia.dmm b/_maps/shuttles/shiptest/pirate_libertatia.dmm index 2291bece301d..e0c0905371ad 100644 --- a/_maps/shuttles/shiptest/pirate_libertatia.dmm +++ b/_maps/shuttles/shiptest/pirate_libertatia.dmm @@ -854,8 +854,8 @@ /area/ship/crew) "AL" = ( /obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/item/radio/intercom/directional/north, /obj/item/lighter{ @@ -1592,12 +1592,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, diff --git a/_maps/shuttles/shiptest/syndicate_gorlex_hyena.dmm b/_maps/shuttles/shiptest/syndicate_gorlex_hyena.dmm index 98d65bc0b7da..5d1d70d59fec 100644 --- a/_maps/shuttles/shiptest/syndicate_gorlex_hyena.dmm +++ b/_maps/shuttles/shiptest/syndicate_gorlex_hyena.dmm @@ -221,12 +221,12 @@ name = "food crate" }, /obj/item/storage/cans/sixbeer, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/effect/turf_decal/industrial/outline, /turf/open/floor/plasteel/mono/dark, /area/ship/cargo) diff --git a/_maps/shuttles/subshuttles/independent_sugarcube.dmm b/_maps/shuttles/subshuttles/independent_sugarcube.dmm index 0765373b95f4..865e0da78091 100644 --- a/_maps/shuttles/subshuttles/independent_sugarcube.dmm +++ b/_maps/shuttles/subshuttles/independent_sugarcube.dmm @@ -56,8 +56,8 @@ /turf/open/floor/plating, /area/ship/engineering) "h" = ( -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/trash/cheesie, /obj/item/trash/cheesie, /obj/item/trash/candy, diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 07e17b8382c5..0091b88fa15f 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -233,6 +233,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/storage/box/donkpockets/donkpockethonk = 1, ) = 1, /obj/item/reagent_containers/food/snacks/monkeycube = 1, + /obj/effect/spawner/lootdrop/ration = 1, ) = 8, list(//fakeout items, keep this list at low relative weight diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index bba9f933e336..af1c88c1f64c 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -24,6 +24,7 @@ var/list/mob/is_using //lazy list of mobs looking at the contents of this storage. var/locked = FALSE //when locked nothing can see inside or use it. + var/locked_flavor = "locked" //prevents tochat messages related to locked from sending var/max_w_class = WEIGHT_CLASS_SMALL //max size of objects that will fit. var/max_combined_w_class = 14 //max combined sizes of objects that will fit. @@ -194,7 +195,7 @@ SIGNAL_HANDLER if(locked) - to_chat(M, "[parent] seems to be locked!") + to_chat(M, "[parent] seems to be [locked_flavor]!") return FALSE if((M.get_active_held_item() == parent) && allow_quick_empty) INVOKE_ASYNC(src, .proc/quick_empty, M) @@ -206,7 +207,7 @@ return FALSE . = COMPONENT_NO_ATTACK if(locked) - to_chat(M, "[parent] seems to be locked!") + to_chat(M, "[parent] seems to be [locked_flavor]!") return FALSE var/obj/item/I = O if(collection_mode == COLLECT_ONE) @@ -279,7 +280,7 @@ if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) return if(locked) - to_chat(M, "[parent] seems to be locked!") + to_chat(M, "[parent] seems to be [locked_flavor]!") return FALSE A.add_fingerprint(M) to_chat(M, "You start dumping out [parent].") @@ -506,7 +507,7 @@ var/atom/dump_destination = dest_object.get_dumping_location() if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) if(locked) - to_chat(M, "[parent] seems to be locked!") + to_chat(M, "[parent] seems to be [locked_flavor]!") return FALSE if(dump_destination.storage_contents_dump_act(src, M)) playsound(A, "rustle", 50, TRUE, -5) @@ -603,7 +604,7 @@ return FALSE A.add_fingerprint(M) if(locked && !force) - to_chat(M, "[parent] seems to be locked!") + to_chat(M, "[parent] seems to be [locked_flavor]!") return FALSE if(force || M.CanReach(parent, view_only = TRUE)) show_to(M) @@ -633,7 +634,7 @@ if(locked) if(M && !stop_messages) host.add_fingerprint(M) - to_chat(M, "[host] seems to be locked!") + to_chat(M, "[host] seems to be [locked_flavor]!") return FALSE if(real_location.contents.len >= max_items) if(!stop_messages) @@ -811,7 +812,7 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(locked) - to_chat(user, "[parent] seems to be locked!") + to_chat(user, "[parent] seems to be [locked_flavor]!") else show_to(user) if(use_sound) @@ -850,7 +851,7 @@ if(!isliving(user) || !user.CanReach(parent) || user.incapacitated()) return if(locked) - to_chat(user, "[parent] seems to be locked!") + to_chat(user, "[parent] seems to be [locked_flavor]!") return var/atom/A = parent diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 41003679c894..bedf2c894b03 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -1250,3 +1250,28 @@ 4 )) return ..() + +/obj/effect/spawner/lootdrop/ration + loot = list ( + /obj/item/storage/ration/vegan_chili = 5, + /obj/item/storage/ration/shredded_beef = 5, + /obj/item/storage/ration/pork_spaghetti = 5, + /obj/item/storage/ration/fried_fish = 5, + /obj/item/storage/ration/beef_strips = 5, + /obj/item/storage/ration/chili_macaroni = 5, + /obj/item/storage/ration/chicken_wings_hot_sauce = 5, + /obj/item/storage/ration/fish_stew = 5, + /obj/item/storage/ration/lemon_pepper_chicken = 5, + /obj/item/storage/ration/sausage_peppers_onions = 5, + /obj/item/storage/ration/pork_dumplings_chili_sauce = 5, + /obj/item/storage/ration/battered_fish_sticks = 5, + /obj/item/storage/ration/assorted_salted_offal = 5, + /obj/item/storage/ration/maple_pork_sausage_patty = 5, + /obj/item/storage/ration/pepper_jack_beef_patty = 5, + /obj/item/storage/ration/beef_goulash = 5, + /obj/item/storage/ration/pepperoni_pizza_slice = 5, + /obj/item/storage/ration/blackened_calamari = 5, + /obj/item/storage/ration/elbow_macaroni = 5, + /obj/item/storage/ration/cheese_pizza_slice = 5, + /obj/item/storage/ration/crayons + ) diff --git a/code/game/objects/items/storage/ration.dm b/code/game/objects/items/storage/ration.dm new file mode 100644 index 000000000000..5d0e2972954e --- /dev/null +++ b/code/game/objects/items/storage/ration.dm @@ -0,0 +1,386 @@ +/obj/item/storage/ration + name = "empty ration pack" + desc = "standerd issue ration" + icon = 'icons/obj/food/ration.dmi' + icon_state = "ration_package" + item_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + resistance_flags = FLAMMABLE + drop_sound = 'sound/items/handling/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg' + +/obj/item/storage/ration/Initialize(mapload) + . = ..() + update_icon() + +/obj/item/storage/ration/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/reagent_containers/food)) + STR.locked = TRUE + STR.locked_flavor = "sealed closed" + +/obj/item/storage/ration/proc/open_ration(mob/user) + to_chat(user, "You tear open \the [src].") + playsound(user.loc, 'sound/effects/rip3.ogg', 50) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + desc += "\nIt's been opened. Let's get this out onto a tray." + +/obj/item/storage/ration/attack_self(mob/user) + var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) + if(locked) + open_ration(user) + icon_state = "[icon_state]_open" + return ..() + + +/obj/item/storage/ration/vegan_chili + name = "vegan chili with beans ration" + desc = "A complete meal package containing a hearty vegan chili with beans, complemented by vegetable crackers, savory cornbread, flavorful pizza crackers, and more. A perfect choice for plant-based nourishment." + +/obj/item/storage/ration/vegan_chili/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/vegan_chili = 1, + /obj/item/reagent_containers/food/snacks/ration/side/vegan_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/side/cornbread = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/pizza_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/grape_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/ration/shredded_beef + name = "shredded beef in barbecue sauce ration" + desc = "Enjoy the rich and savory flavors of shredded beef in smoky barbecue sauce with this satisfying ration. Accompanied by a fruit puree, jerky wrap, cinnamon bun, and additional condiments, this ration is perfect for meat lovers." + +/obj/item/storage/ration/shredded_beef/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/shredded_beef = 1, + /obj/item/reagent_containers/food/snacks/ration/side/jerky_wrap = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/fruit_puree = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/cinnamon_bun = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/hot_cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/chocolate_protein_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/ration/pork_spaghetti + name = "spaghetti with pork and sauce ration" + desc = "Indulge in a comforting meal of spaghetti with tender pork and savory sauce with this ration. Complemented by a toaster pastry, seasoned bread sticks, dried raisins, and other accompaniments, this ration offers a flavorful experience." + +/obj/item/storage/ration/pork_spaghetti/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/pork_spaghetti = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/toaster_pastry = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/dried_raisins = 1, + /obj/item/reagent_containers/food/snacks/ration/side/bread_sticks = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/lemonade_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/ration/fried_fish + name = "fried fish chunks ration" + desc = "Experience the crispy delight of fried fish chunks with this ration. Accompanied by an energy bar, tortillas, toasted corn kernels, and more, this ration provides a satisfying combination of flavors and textures." + +/obj/item/storage/ration/fried_fish/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/fried_fish = 1, + /obj/item/reagent_containers/food/snacks/ration/side/tortilla = 1, + /obj/item/reagent_containers/food/snacks/ration/side/beef_sticks = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/corn_kernels = 1, + /obj/item/reagent_containers/food/snacks/ration/bar/energy_bar = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/fruit_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/ration/beef_strips + name = "beef strips in tomato sauce ration" + desc = "Savor the deliciousness of tender beef strips in a flavorful tomato sauce with this ration. Enjoy a chocolate pudding, white wheat snack bread, blackberry preserves, and peppermint candy rings as delightful accompaniments." + +/obj/item/storage/ration/beef_strips/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/beef_strips = 1, + /obj/item/reagent_containers/food/snacks/ration/side/wheat_bread = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/chocolate_pudding = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/blackberry_preserves = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/candy_rings = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/peanut_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/fruit_smoothie_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside,src) + + +/obj/item/storage/ration/chili_macaroni + name = "chili and macaroni ration" + desc = "Indulge in the comforting combination of chili and macaroni in this flavorful ration. Satisfy your taste buds with a mix of sweet and savory treats." + +/obj/item/storage/ration/chili_macaroni/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/chili_macaroni = 1, + /obj/item/reagent_containers/food/snacks/ration/side/vegan_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/side/beef_sticks = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/lemon_pound_cake = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/cherry_snackers = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/hot_cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/chicken_wings_hot_sauce + name = "chicken wings in hot sauce ration" + desc = "Experience the bold and spicy flavors of chicken wings drenched in hot sauce. This ration also includes a mix of delightful snacks for a well-rounded meal." + +/obj/item/storage/ration/chicken_wings_hot_sauce/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/chicken_wings_hot_sauce = 1, + /obj/item/reagent_containers/food/snacks/ration/side/garlic_mashed_potatoes = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/strawberry_preserves = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/mint_chocolate_snack_cake = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/peanut_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/cherry_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/fish_stew + name = "fish stew ration" + desc = "Dive into the depths of flavor with this fish stew ration. Enjoy a hearty blend of seafood and vegetables, complemented by a selection of tasty accompaniments." + +/obj/item/storage/ration/fish_stew/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/fish_stew = 1, + /obj/item/reagent_containers/food/snacks/ration/side/soup_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/side/griddled_mushrooms_chili = 1, + /obj/item/reagent_containers/food/snacks/ration/side/wheat_bread = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/sour_gummy_worms = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/garlic_cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_orange = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/lemon_pepper_chicken + name = "lemon pepper chicken ration" + desc = "A tasty Lemon Pepper Chicken ration that combines the flavors of fruit and meat. Perfect for a satisfying meal." + +/obj/item/storage/ration/lemon_pepper_chicken/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/lemon_pepper_chicken = 1, + /obj/item/reagent_containers/food/snacks/ration/side/jellied_eels = 1, + /obj/item/reagent_containers/food/snacks/ration/side/pretzel_sticks_honey_mustard = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/blue_raspberry_candies = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/peanut_cranberry_mix = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_chocolate = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/sausage_peppers_onions + name = "sausage, peppers and onions ration" + desc = "Indulge in the delightful combination of juicy sausage, peppers, and onions in this hearty ration." + +/obj/item/storage/ration/sausage_peppers_onions/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/sausage_peppers_onions = 1, + /obj/item/reagent_containers/food/snacks/ration/side/white_sandwich_bread = 1, + /obj/item/reagent_containers/food/snacks/ration/side/baked_cheddarcheese_chips = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/channeler_meat_candy = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/chocolate_orange_snack_cake = 1, + /obj/item/reagent_containers/food/drinks/ration/pan_genezan_vodka = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/pork_dumplings_chili_sauce + name = "pork dumplings in chili sauce ration" + desc = "Savor the rich flavors of pork dumplings in a spicy chili sauce, accompanied by a variety of complementary snacks." + +/obj/item/storage/ration/pork_dumplings_chili_sauce/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/dumplings_chili_sauce = 1, + /obj/item/reagent_containers/food/snacks/ration/side/fried_potato_curls = 1, + /obj/item/reagent_containers/food/snacks/ration/side/pretzel_sticks_honey_mustard = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/pick_me_up_energy_gum = 1, + /obj/item/reagent_containers/food/snacks/ration/bar/rationers_guild_chocolate_bar = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_hazelnut = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/battered_fish_sticks + name = "battered fish sticks ration" + desc = "Enjoy the crispy goodness of battered fish sticks, along with a selection of sides and a delectable dessert." + +/obj/item/storage/ration/battered_fish_sticks/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/battered_fish_sticks = 1, + /obj/item/reagent_containers/food/snacks/ration/side/stewed_asparagus_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/side/fried_potato_curls = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/chocolate_orange_snack_cake = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/apple_slices = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/pineapple_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/assorted_salted_offal + name = "assorted salted offal ration" + desc = "An adventurous choice, this ration offers an assortment of salted offal, providing a unique culinary experience." + + +/obj/item/storage/ration/assorted_salted_offal/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/assorted_salted_offal = 1, + /obj/item/reagent_containers/food/snacks/ration/side/broth_tuna_rice = 1, + /obj/item/reagent_containers/food/snacks/ration/side/trail_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/candied_pineapple_chunks = 1, + /obj/item/reagent_containers/food/snacks/ration/bar/tropical_energy_bar = 1, + /obj/item/reagent_containers/food/drinks/ration/pan_genezan_vodka = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/maple_pork_sausage_patty + name = "maple pork sausage patty ration" + desc = "Start your day with a satisfying breakfast featuring a maple-infused pork sausage patty and a variety of treats." + +/obj/item/storage/ration/maple_pork_sausage_patty/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/maple_pork_sausage_patty = 1, + /obj/item/reagent_containers/food/snacks/ration/side/hash_brown_bacon = 1, + /obj/item/reagent_containers/food/snacks/ration/side/granola_milk_blueberries = 1, + /obj/item/reagent_containers/food/snacks/ration/side/maple_muffin = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/smoked_almonds = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/maple_syrup = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/grape_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/pepper_jack_beef_patty + name = "jalapeno pepper jack beef patty ration" + desc = "Experience a flavorful fusion of jalapeno, pepper jack cheese, and beef in this grilled beef patty ration." + +/obj/item/storage/ration/pepper_jack_beef_patty/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/pepper_jack_beef_patty = 1, + /obj/item/reagent_containers/food/snacks/ration/side/au_gratin_potatoes = 1, + /obj/item/reagent_containers/food/snacks/ration/side/jerky_wrap = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/chocolate_chunk_oatmeal_cookie = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/peanut_candies = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/bacon_cheddar_cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage_sugar_free = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/beef_goulash + name = "beef goulash ration" + desc = "Delight in the rich flavors of beef goulash, accompanied by a selection of sides and a sweet treat." + +/obj/item/storage/ration/beef_goulash/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/beef_goulash = 1, + /obj/item/reagent_containers/food/snacks/ration/side/applesauce_carb_enhanced = 1, + /obj/item/reagent_containers/food/snacks/ration/side/white_bread_mini_loaf = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/strawberry_preserves = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/patriotic_sugar_cookies = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/chunky_peanut_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/pepperoni_pizza_slice + name = "pepperoni pizza slice ration" + desc = "Indulge in the classic taste of pepperoni pizza with this ration, complete with sides and a refreshing beverage." + +/obj/item/storage/ration/pepperoni_pizza_slice/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/pepperoni_pizza_slice = 1, + /obj/item/reagent_containers/food/snacks/ration/side/apples_in_spiced_sauce = 1, + /obj/item/reagent_containers/food/snacks/ration/side/vegan_crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/oatmeal_cookie = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/hot_cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/lemonade_beverage_suger_free = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/blackened_calamari + name = "blackened calamari in red sauce ration" + desc = "Enjoy the savory delight of blackened calamari served in a rich red sauce." + +/obj/item/storage/ration/blackened_calamari/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/blackened_calamari = 1, + /obj/item/reagent_containers/food/snacks/ration/side/trail_mix_beef_jerky = 1, + /obj/item/reagent_containers/food/snacks/ration/side/crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/dried_cranberries = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/dry_roasted_peanuts = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage_sugar_free = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/elbow_macaroni + name = "elbow macaroni in tomato sauce ration" + desc = "Savor the comforting taste of elbow macaroni in a delicious tomato sauce." + +/obj/item/storage/ration/elbow_macaroni/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/elbow_macaroni = 1, + /obj/item/reagent_containers/food/snacks/ration/side/barbecue_fried_pork_rinds = 1, + /obj/item/reagent_containers/food/snacks/ration/side/applesauce_mango_peach_puree = 1, + /obj/item/reagent_containers/food/snacks/ration/side/white_bread_mini_loaf = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/strawberry_preserves = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/peanut_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/chocolate_protein_beverage = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/cheese_pizza_slice + name = "cheese pizza slice ration" + desc = "Experience the timeless flavor of a classic cheese pizza slice." + +/obj/item/storage/ration/cheese_pizza_slice/PopulateContents() + var/static/items_inside = list( + /obj/item/reagent_containers/food/snacks/ration/entree/cheese_pizza_slice = 1, + /obj/item/reagent_containers/food/snacks/ration/side/applesauce_carb_enhanced = 1, + /obj/item/reagent_containers/food/snacks/ration/side/crackers = 1, + /obj/item/reagent_containers/food/snacks/ration/snack/jalapeno_cashews = 1, + /obj/item/reagent_containers/food/snacks/ration/bar/quik_energy_bar_chocolate = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/chunky_peanut_butter = 1, + /obj/item/reagent_containers/food/snacks/ration/condiment/grape_beverage_sugar_free = 1, + /obj/item/ration_heater = 1 + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/ration/crayons + name = "military grade crayon ration" + desc = "Proven to increase kill count by atleast 1." + +/obj/item/storage/ration/crayons/PopulateContents() + var/static/items_inside = list( + /obj/item/toy/crayon/red = 1, + /obj/item/toy/crayon/orange = 1, + /obj/item/toy/crayon/yellow = 1, + /obj/item/toy/crayon/green = 1, + /obj/item/toy/crayon/blue = 1, + /obj/item/toy/crayon/purple = 1, + /obj/item/toy/crayon/black = 1, + /obj/item/toy/crayon/white = 1 + ) + generate_items_inside(items_inside, src) diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm index c339fe47d781..86e6f293908d 100644 --- a/code/modules/cargo/packs/food.dm +++ b/code/modules/cargo/packs/food.dm @@ -245,3 +245,16 @@ /obj/item/melee/flyswatter) crate_name = "beekeeping starter crate" crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/food/ration + name = "Ration Crate" + desc = "6 standerd issue rations." + cost = 2000 + contains = list(/obj/effect/spawner/lootdrop/ration, + /obj/effect/spawner/lootdrop/ration, + /obj/effect/spawner/lootdrop/ration, + /obj/effect/spawner/lootdrop/ration, + /obj/effect/spawner/lootdrop/ration, + /obj/effect/spawner/lootdrop/ration) + crate_name = "ration crate" + crate_type = /obj/structure/closet/crate diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 542c2383cb27..db58392b12e7 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -738,3 +738,38 @@ desc = "A dangerous fusion of flavors!" icon_state = "plasma" list_reagents = list(/datum/reagent/medicine/molten_bubbles/plasma = 50) + +/obj/item/reagent_containers/food/drinks/ration + name = "empty ration pouch" + desc = "If you ever wondered where air came from..." + list_reagents = list(/datum/reagent/oxygen = 6, /datum/reagent/nitrogen = 24) + icon = 'icons/obj/food/ration.dmi' + icon_state = "ration_package" + drop_sound = 'sound/items/handling/cardboardbox_drop.ogg' + pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg' + in_container = TRUE + reagent_flags = NONE + spillable = FALSE + w_class = WEIGHT_CLASS_SMALL + volume = 50 + +/obj/item/reagent_containers/food/drinks/ration/proc/open_ration(mob/user) + to_chat(user, "You tear open \the [src].") + playsound(user.loc, 'sound/effects/rip3.ogg', 50) + reagents.flags |= OPENCONTAINER + spillable = TRUE + +/obj/item/reagent_containers/food/drinks/ration/attack_self(mob/user) + if(!is_drainable()) + open_ration(user) + icon_state = "[icon_state]_open" + return ..() + +/obj/item/reagent_containers/food/drinks/ration/attack(mob/living/M, mob/user, def_zone) + if (!is_drainable()) + to_chat(user, "The [src] is sealed shut!") + return 0 + return ..() + +/obj/item/reagent_containers/food/drinks/ration/pan_genezan_vodka + list_reagents = list(/datum/reagent/consumable/ethanol/vodka = 30) diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index b1b53adff787..2baf670d807d 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -248,10 +248,6 @@ //You can tear the bag open above food to put the condiments on it, obviously. if(istype(target, /obj/item/reagent_containers/food/snacks)) - if(!reagents.total_volume) - to_chat(user, "You tear open [src], but there's nothing in it.") - qdel(src) - return if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!" ) qdel(src) @@ -297,7 +293,6 @@ originalname = "bbq sauce" list_reagents = list(/datum/reagent/consumable/bbqsauce = 10) - /obj/item/reagent_containers/food/condiment/ketchup name = "ketchup bottle" desc = "You feel more american already" diff --git a/code/modules/food_and_drinks/food/ration.dm b/code/modules/food_and_drinks/food/ration.dm new file mode 100644 index 000000000000..899bff9c9a26 --- /dev/null +++ b/code/modules/food_and_drinks/food/ration.dm @@ -0,0 +1,767 @@ +/obj/item/reagent_containers/food/snacks/ration + name = "nutriment ration" + desc = "standard issue ration" + filling_color = "#664330" + list_reagents = list(/datum/reagent/consumable/nutriment = 4) + icon = 'icons/obj/food/ration.dmi' + icon_state = "ration_side" + in_container = TRUE + reagent_flags = NONE + spillable = FALSE + w_class = WEIGHT_CLASS_SMALL + volume = 50 + var/cookable = FALSE + var/cooked = FALSE + +/obj/item/reagent_containers/food/snacks/ration/Initialize(mapload) + . = ..() + update_overlays() + +/obj/item/reagent_containers/food/snacks/ration/update_overlays() + . = ..() + var/mutable_appearance/ration_overlay + if(icon_exists(icon, "[icon_state]_filling")) + ration_overlay = mutable_appearance(icon, "[icon_state]_filling") + else if(icon_exists(icon, "[initial(icon_state)]_filling")) + ration_overlay = mutable_appearance(icon, "[initial(icon_state)]_filling") + else + return + ration_overlay.color = filling_color + add_overlay(ration_overlay) + +/obj/item/reagent_containers/food/snacks/ration/proc/open_ration(mob/user) + to_chat(user, "You tear open \the [src].") + playsound(user.loc, 'sound/effects/rip3.ogg', 50) + reagents.flags |= OPENCONTAINER + spillable = TRUE + desc += "\nIt's been opened." + update_overlays() + +/obj/item/reagent_containers/food/snacks/ration/attack_self(mob/user) + if(!is_drainable()) + icon_state = "[icon_state]_open" + open_ration(user) + return ..() + +/obj/item/reagent_containers/food/snacks/ration/attack(mob/living/M, mob/user, def_zone) + if (!is_drainable()) + to_chat(user, "The [src] is sealed shut!") + return 0 + return ..() + +/obj/item/reagent_containers/food/snacks/ration/microwave_act(obj/machinery/microwave/Heater) + if (cookable == FALSE) + ..() + else + name = "warm [initial(name)]" + bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) + cooked = TRUE + +/obj/item/reagent_containers/food/snacks/ration/examine(mob/user) + . = ..() + if(cookable && !cooked) + . += "It can be cooked in a microwave or warmed using a flameless ration heater.\n" + +/obj/item/reagent_containers/food/snacks/ration/entree + icon_state = "ration_main" + list_reagents = list(/datum/reagent/consumable/nutriment = 6) + cookable = TRUE + +/obj/item/reagent_containers/food/snacks/ration/side + icon_state = "ration_side" + list_reagents = list(/datum/reagent/consumable/nutriment = 4) + +/obj/item/reagent_containers/food/snacks/ration/snack + icon_state = "ration_side" + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/sugar = 3) + +/obj/item/reagent_containers/food/snacks/ration/bar + icon_state = "ration_bar" + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 2) + +/obj/item/reagent_containers/food/snacks/ration/entree/vegan_chili + name = "vegan chili with beans" + desc = "A hearty and flavorful vegan chili made with beans. It's so delicious, you won't believe it's not meat!" + filling_color = "#B22222" + tastes = list("beans" = 1, "off" = 1) + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/entree/shredded_beef + name = "shredded beef in barbecue sauce" + desc = "Tender, juicy shredded beef coated in smoky barbecue sauce. A savory treat that satisfies your hunger." + filling_color = "#7a3c19" + tastes = list("beef" = 1) + foodtype = MEAT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/entree/pork_spaghetti + name = "spaghetti with pork and sauce" + desc = "A hearty dish of spaghetti with tender pork and a savory sauce. A ration_overlay and delicious meal to satisfy your hunger." + filling_color = "#b82121" + tastes = list("pork" = 1, "spaghetti" = 1, "sauce" = 1) + foodtype = MEAT | GRAIN | VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/entree/fried_fish + name = "fried fish chunks" + desc = "Crispy and delicious fried fish chunks, perfect for seafood lovers. Satisfy your cravings with this delightful fried treat." + filling_color = "#f08934" + tastes = list("fish" = 1, "fried" = 1) + foodtype = FRIED + +/obj/item/reagent_containers/food/snacks/ration/entree/beef_strips + name = "beef strips in tomato sauce" + desc = "Tender beef strips cooked in a rich tomato sauce, creating a delightful and comforting combination. A hearty and delicious meal to enjoy." + filling_color = "#644815" + tastes = list("beef" = 1, "tomato" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/entree/chili_macaroni + name = "chili macaroni" + desc = "A comforting dish of macaroni combined with flavorful chili, providing a hearty and satisfying meal." + filling_color = "#994d00" + tastes = list("chili" = 1, "macaroni" = 1) + foodtype = MEAT | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/entree/chicken_wings_hot_sauce + name = "chicken wings with hot sauce" + desc = "Crispy and flavorful chicken wings tossed in a spicy hot sauce, delivering a bold and satisfying taste." + filling_color = "#ff3300" + tastes = list("chicken" = 1, "hot sauce" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/fish_stew + name = "fish stew" + desc = "A hearty fish stew featuring a rich broth and tender pieces of fish, creating a flavorful and comforting meal." + filling_color = "#336699" + tastes = list("fish" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/lemon_pepper_chicken + name = "lemon pepper chicken" + desc = "Tender chicken seasoned with zesty lemon and fragrant pepper, offering a flavorful and satisfying dish." + filling_color = "#ffff66" + tastes = list("lemon" = 1, "pepper" = 1, "chicken" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/sausage_peppers_onions + name = "sausage with peppers and onions" + desc = "Grilled sausage served with sautéed peppers and onions, creating a flavorful and satisfying dish." + filling_color = "#cc3300" + tastes = list("sausage" = 1, "peppers" = 1, "onions" = 1) + foodtype = MEAT | VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/entree/dumplings_chili_sauce + name = "dumplings with chili sauce" + desc = "Delicious dumplings served with a flavorful chili sauce, providing a hearty and satisfying meal." + filling_color = "#b8711b" + tastes = list("dumplings" = 1, "chili sauce" = 1) + foodtype = GRAIN | MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/battered_fish_sticks + name = "battered fish sticks" + desc = "Crispy battered fish sticks, deep-fried to perfection and offering a delicious seafood snack." + filling_color = "#336699" + tastes = list("fish" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/assorted_salted_offal + name = "assorted salted offal" + desc = "A mix of various salted offal, providing a unique and flavorful snack for those with adventurous tastes." + filling_color = "#cc3300" + tastes = list("assorted offal" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/maple_pork_sausage_patty + name = "maple pork sausage patty" + desc = "Juicy pork sausage patty infused with the sweetness of maple, offering a hearty and flavorful snack." + filling_color = "#b8711b" + tastes = list("maple" = 1, "pork sausage" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/pepper_jack_beef_patty + name = "jalapeno pepper jack beef patty" + desc = "Spicy jalapeno and pepper jack-infused beef patty, offering a bold and flavorful snack option." + filling_color = "#ff9900" + tastes = list("jalapeno" = 1, "pepper jack" = 1, "beef patty" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/beef_goulash + name = "beef goulash" + desc = "A hearty and flavorful beef goulash, combining tender pieces of beef with savory spices for a satisfying meal." + filling_color = "#b82121" + tastes = list("beef" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/pepperoni_pizza_slice + name = "pepperoni pizza slice" + desc = "A classic pepperoni pizza slice topped with melted cheese and savory pepperoni, offering a delicious snack." + filling_color = "#cc3300" + tastes = list("pepperoni" = 1, "pizza" = 1) + foodtype = GRAIN | DAIRY | MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/blackened_calamari + name = "blackened calamari" + desc = "Tender calamari coated in a savory blackened seasoning, creating a flavorful and satisfying seafood dish." + filling_color = "#336699" + tastes = list("calamari" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/entree/elbow_macaroni + name = "elbow macaroni" + desc = "A classic dish of elbow macaroni, offering a simple and satisfying meal." + filling_color = "#ffcc00" + tastes = list("macaroni" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/entree/cheese_pizza_slice + name = "cheese pizza slice" + desc = "A classic cheese pizza slice topped with melted cheese, offering a simple and satisfying snack." + filling_color = "#ffcc00" + tastes = list("cheese" = 1, "pizza" = 1) + foodtype = GRAIN | DAIRY +/obj/item/reagent_containers/food/snacks/ration/side/vegan_crackers + name = "vegetable 'crackers'" + desc = "Delicious vegetable-based crackers that are the perfect crunchy and nutritious snack." + filling_color = "#9ED41B" + tastes = list("cracker" = 1) + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/side/vegan_crackers/open_ration(mob/user) + .=..() + to_chat(user, "\the [src] makes a nice hiss.") + +/obj/item/reagent_containers/food/snacks/ration/side/cornbread + name = "cornbread" + desc = "Deliciously crumbly cornbread, a delightful blend of sweet and savory flavors." + filling_color = "#DDB63B" + tastes = list("corn" = 1) + foodtype = VEGETABLES | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/jerky_wrap + name = "jerky wraps" + desc = "Thin slices of flavorful beef jerky, carefully wrapped to create a portable and protein-packed snack. Ideal for satisfying your hunger on the go." + filling_color = "#532d0e" + tastes = list("dry" = 1, "jerky" = 1, "beef" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/side/bread_sticks + name = "seasoned bread sticks" + desc = "Crunchy and flavorful seasoned bread sticks, a delightful accompaniment to your meal or a satisfying snack on their own." + filling_color = "#e2904d" + tastes = list("bread" = 1, "seasoned" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/tortilla + name = "tortillas" + desc = "Soft and pliable tortillas, a versatile staple that complements various fillings and flavors. A great choice for a quick and satisfying meal." + filling_color = "#f3ac69" + tastes = list("tortilla" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/wheat_bread + name = "white wheat snack bread" + desc = "Soft and fluffy white wheat snack bread, a versatile snack or accompaniment to your meals. Enjoy the wholesome goodness of wheat." + filling_color = "#8d5a30" + tastes = list("wheat" = 1, "bread" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/beef_sticks + name = "teriyaki beef sticks" + desc = "Savory teriyaki-flavored beef sticks, a protein-packed snack that satisfies your taste buds. Ideal for meat lovers." + filling_color = "#664a20" + tastes = list("beef" = 1, "teriyaki" = 1) + foodtype = MEAT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/side/garlic_mashed_potatoes + name = "garlic mashed potatoes" + desc = "Creamy mashed potatoes infused with aromatic garlic, creating a comforting and savory side dish." + filling_color = "#e6e600" + tastes = list("garlic" = 1, "potatoes" = 1) + foodtype = GRAIN | VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/side/soup_crackers + name = "soup crackers" + desc = "Crunchy and satisfying crackers, perfect for dipping into a warm bowl of soup or enjoying on their own." + filling_color = "#663300" + tastes = list("crackers" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/griddled_mushrooms_chili + name = "griddled mushrooms with chili" + desc = "Savory mushrooms griddled to perfection and topped with a spicy chili sauce, offering a delightful burst of flavors." + filling_color = "#b82121" + tastes = list("mushrooms" = 1, "chili" = 1) + foodtype = VEGETABLES | MEAT + +/obj/item/reagent_containers/food/snacks/ration/side/white_sandwich_bread + name = "white sandwich bread" + desc = "Soft and fluffy white bread, perfect for making sandwiches or enjoying as a quick and simple snack." + filling_color = "#ffffff" + tastes = list("bread" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/baked_cheddarcheese_chips + name = "baked cheddar cheese chips" + desc = "Crispy and savory cheddar cheese chips, baked to perfection for a flavorful and satisfying snack." + filling_color = "#ffcc00" + tastes = list("cheddar cheese" = 1, "chips" = 1) + foodtype = DAIRY + +/obj/item/reagent_containers/food/snacks/ration/side/fried_potato_curls + name = "fried potato curls" + desc = "Crispy and golden potato curls, fried to perfection and seasoned for a delightful and savory snack." + filling_color = "#ffcc00" + tastes = list("potato" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/stewed_asparagus_butter + name = "stewed asparagus with butter" + desc = "Tender stewed asparagus served with a generous drizzle of melted butter, creating a delightful and savory side." + filling_color = "#99cc00" + tastes = list("asparagus" = 1, "butter" = 1) + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/side/broth_tuna_rice + name = "broth with tuna and rice" + desc = "A warm and comforting broth with tender tuna and rice, offering a nourishing and satisfying meal." + filling_color = "#669999" + tastes = list("broth" = 1, "tuna" = 1, "rice" = 1) + foodtype = MEAT | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/trail_crackers + name = "trail crackers" + desc = "Nutritious and energy-packed crackers, perfect for on-the-go snacking during outdoor adventures." + filling_color = "#ffcc00" + tastes = list("crackers" = 1) + foodtype = GRAIN | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/side/hash_brown_bacon + name = "hash brown with bacon" + desc = "Crispy hash brown paired with savory bacon, creating a satisfying and indulgent snack option." + filling_color = "#ffcc00" + tastes = list("hash brown" = 1, "bacon" = 1) + foodtype = GRAIN | MEAT + +/obj/item/reagent_containers/food/snacks/ration/side/granola_milk_blueberries + name = "granola with milk and blueberries" + desc = "Nutrient-rich granola served with creamy milk and plump blueberries, providing a wholesome and delicious snack." + filling_color = "#6699ff" + tastes = list("granola" = 1, "milk" = 1, "blueberries" = 1) + foodtype = GRAIN | DAIRY + +/obj/item/reagent_containers/food/snacks/ration/side/maple_muffin + name = "maple muffin" + desc = "A delightful muffin infused with the rich flavor of maple, offering a sweet and satisfying treat." + filling_color = "#b8711b" + tastes = list("maple" = 1, "muffin" = 1) + foodtype = SUGAR | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/au_gratin_potatoes + name = "au gratin potatoes" + desc = "Creamy au gratin potatoes topped with a golden cheesy crust, providing a comforting and satisfying side dish." + filling_color = "#ffcc00" + tastes = list("au gratin potatoes" = 1) + foodtype = GRAIN | DAIRY | VEGETABLES + +/obj/item/reagent_containers/food/snacks/ration/side/applesauce_carb_enhanced + name = "carb-enhanced applesauce" + desc = "Applesauce enriched with carbohydrates, providing a quick and energy-boosting snack option." + filling_color = "#ff9900" + tastes = list("applesauce" = 1) + foodtype = FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/side/white_bread_mini_loaf + name = "mini loaf of white bread" + desc = "A small loaf of soft and fluffy white bread, perfect for making sandwiches or enjoying as a simple snack." + filling_color = "#ffffff" + tastes = list("bread" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/apples_in_spiced_sauce + name = "apples in spiced sauce" + desc = "Tender apple slices coated in a spiced sauce, creating a flavorful and comforting snack option." + filling_color = "#ff3300" + tastes = list("apples" = 1, "spiced sauce" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/side/pretzel_sticks_honey_mustard + name = "pretzel sticks with honey mustard" + desc = "Crunchy pretzel sticks served with a delectable honey mustard dipping sauce, creating a delightful snack." + filling_color = "#996633" + tastes = list("pretzel" = 1, "honey mustard" = 1) + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/ration/side/jellied_eels + name = "jellied eels" + desc = "A classic dish of jellied eels, offering a unique combination of flavors and textures for a nostalgic treat." + filling_color = "#669999" + tastes = list("jellied eels" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/side/trail_mix_beef_jerky + name = "trail mix with beef jerky" + desc = "A hearty trail mix featuring a blend of nuts, seeds, and dried fruit, with savory beef jerky for a protein-packed snack." + filling_color = "#996633" + tastes = list("trail mix" = 1, "beef jerky" = 1) + foodtype = MEAT | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/side/crackers + name = "crackers" + desc = "Crunchy and satisfying crackers, perfect for dipping into a warm bowl of soup or enjoying on their own." + filling_color = "#663300" + tastes = list("crackers" = 1) + foodtype = GRAIN +/obj/item/reagent_containers/food/snacks/ration/side/barbecue_fried_pork_rinds + name = "barbecue fried pork rinds" + desc = "Crispy and flavorful fried pork rinds coated in a savory barbecue seasoning, creating a satisfying snack option." + filling_color = "#b82121" + tastes = list("pork rinds" = 1, "barbecue" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/ration/side/applesauce_mango_peach_puree + name = "applesauce with mango and peach puree" + desc = "A delightful blend of applesauce with mango and peach puree, creating a sweet and satisfying snack option." + filling_color = "#ff9900" + tastes = list("applesauce" = 1, "mango" = 1, "peach" = 1) + foodtype = FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/pizza_crackers + name = "pepperoni pizza cheese filled crackers" + desc = "Irresistible cheese-filled crackers with a savory pepperoni pizza flavor. A delicious and addictive snack." + filling_color = "#b82121" + tastes = list("pizza" = 3, "pepperoni" = 1, "cheese" = 1) + foodtype = MEAT | DAIRY | GRAIN | JUNKFOOD + +/obj/item/reagent_containers/food/snacks/ration/snack/fruit_puree + name = "apple, strawberry, and carrot fruit puree squeeze" + desc = "A delightful blend of fresh apple, succulent strawberry, and nutritious carrot, all pureed into a convenient squeeze pouch. A burst of fruity goodness in every bite." + filling_color = "#cc3131" + tastes = list("apple" = 1, "strawberry" = 1, "carrot" = 1) + foodtype = VEGETABLES | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/cinnamon_bun + name = "cinnamon bun" + desc = "A delectable pastry swirled with cinnamon and drizzled with a sweet glaze. Warm and fluffy, this cinnamon bun is a delightful treat to enjoy with your favorite beverage." + filling_color = "#b18d40" + tastes = list("cinnamon" = 3, "airy" = 1, "sweet" = 1) + foodtype = GRAIN | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/toaster_pastry + name = "chocolate chip toaster pastry" + desc = "A delicious chocolate chip toaster pastry, perfect for a quick breakfast or a tasty snack. Indulge in the delightful blend of chocolate and pastry." + filling_color = "#e2a054" + tastes = list("chocolate" = 1, "pastry" = 1, "sweet" = 1) + foodtype = SUGAR | GRAIN | JUNKFOOD | BREAKFAST + +/obj/item/reagent_containers/food/snacks/ration/snack/dried_raisins + name = "dried raisins" + desc = "Sweet and chewy dried raisins, a natural and healthy snack option. Packed with natural sugars and nutrients for a burst of energy." + filling_color = "#1b1146" + tastes = list("raisins" = 1, "sweet" = 1) + foodtype = FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/corn_kernels + name = "toasted corn kernels, barbecue" + desc = "Toasted corn kernels with a savory barbecue flavor. A crunchy and flavorful snack to enjoy anytime." + filling_color = "#836b1d" + tastes = list("corn" = 1, "barbecue" = 1) + foodtype = SUGAR | VEGETABLES | JUNKFOOD + +/obj/item/reagent_containers/food/snacks/ration/snack/chocolate_pudding + name = "chocolate pudding" + desc = "Creamy and decadent chocolate pudding, a delightful dessert to indulge your sweet tooth." + filling_color = "#3b2406" + tastes = list("chocolate" = 3, "pudding" = 1, "sweet" = 1) + foodtype = SUGAR | JUNKFOOD + +/obj/item/reagent_containers/food/snacks/ration/snack/blackberry_preserves + name = "blackberry preserves" + desc = "Sweet and tangy blackberry preserves, perfect for spreading on toast or pairing with your favorite snacks." + filling_color = "#26133b" + tastes = list("blackberry" = 1, "sweet" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/candy_rings + name = "peppermint candy rings" + desc = "Colorful and refreshing peppermint candy rings, a sweet and delightful treat that brings a burst of coolness to your taste buds." + filling_color = "#ecafaf" + tastes = list("peppermint" = 3, "sweet" = 1) + foodtype = SUGAR | JUNKFOOD + +/obj/item/reagent_containers/food/snacks/ration/snack/lemon_pound_cake + name = "lemon pound cake" + desc = "A zesty and moist lemon pound cake that delivers a burst of citrus flavor in every bite. A delightful dessert to enjoy." + filling_color = "#ffff99" + tastes = list("lemon" = 1, "cake" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/cherry_snackers + name = "cherry snackers" + desc = "Juicy and plump cherries, perfectly preserved and packed for a delightful and refreshing snack." + filling_color = "#ff0066" + tastes = list("cherry" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/mint_chocolate_snack_cake + name = "mint chocolate snack cake" + desc = "A delectable snack cake featuring the perfect blend of refreshing mint and rich chocolate flavors." + filling_color = "#00cc66" + tastes = list("mint" = 1, "chocolate" = 1, "cake" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/strawberry_preserves + name = "strawberry preserves" + desc = "Sweet and luscious strawberry preserves, perfect for spreading on bread or enjoying as a tasty topping." + filling_color = "#ff3300" + tastes = list("strawberry" = 1) + foodtype = SUGAR | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/sour_gummy_worms + name = "sour gummy worms" + desc = "Tangy and chewy gummy worms coated in a sour sugar blend, providing a fun and flavorful snacking experience." + filling_color = "#ff9900" + tastes = list("sour" = 1, "gummy" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/blue_raspberry_candies + name = "blue raspberry candies" + desc = "Sweet and vibrant blue raspberry-flavored candies, perfect for indulging your sweet tooth." + filling_color = "#3399ff" + tastes = list("blue raspberry" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/peanut_cranberry_mix + name = "peanut cranberry mix" + desc = "A satisfying mix of crunchy peanuts and tangy dried cranberries, offering a balanced and flavorful snack." + filling_color = "#cc3300" + tastes = list("peanut" = 1, "cranberry" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/channeler_meat_candy + name = "channeler meat candy" + desc = "A traditional meat-candy from the Antechannel League on Kalixcis, offering an unusual and captivating flavor experience." + filling_color = "#9933ff" + tastes = list("channeler meat" = 1, "candy" = 1) + foodtype = MEAT | SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/chocolate_orange_snack_cake + name = "chocolate orange snack cake" + desc = "A delightful snack cake combining rich chocolate and zesty orange flavors for a mouthwatering treat." + filling_color = "#ff6600" + tastes = list("chocolate" = 1, "orange" = 1, "cake" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/pick_me_up_energy_gum + name = "Pick-Me-Up energy gum" + desc = "Energy-boosting gum that provides a quick and refreshing burst of vitality when you need it the most." + filling_color = "#00cc66" + tastes = list("energy gum" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/apple_slices + name = "apple slices" + desc = "Fresh and crisp apple slices, perfect for a refreshing and healthy snack option." + filling_color = "#ff3300" + tastes = list("apple" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/candied_pineapple_chunks + name = "candied pineapple chunks" + desc = "Sweet and chewy candied pineapple chunks, offering a burst of tropical flavor in every bite." + filling_color = "#ff6600" + tastes = list("candied pineapple" = 1) + foodtype = SUGAR | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/smoked_almonds + name = "smoked almonds" + desc = "Savory smoked almonds, offering a flavorful and protein-packed snack option." + filling_color = "#663300" + tastes = list("smoked almonds" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/chocolate_chunk_oatmeal_cookie + name = "chocolate chunk oatmeal cookie" + desc = "A scrumptious oatmeal cookie studded with rich chocolate chunks for a delightful and indulgent treat." + filling_color = "#663300" + tastes = list("chocolate" = 1, "oatmeal cookie" = 1) + foodtype = SUGAR | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/snack/peanut_candies + name = "peanut candies" + desc = "Sweet and nutty peanut candies, providing a delightful and energy-boosting snack." + filling_color = "#ff9900" + tastes = list("peanut" = 1) + foodtype = SUGAR | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/patriotic_sugar_cookies + name = "patriotic sugar cookies" + desc = "Colorful sugar cookies with patriotic designs, providing a festive and sweet treat for special occasions." + filling_color = "#ffcc00" + tastes = list("sugar cookies" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/snack/oatmeal_cookie + name = "oatmeal cookie" + desc = "A delicious oatmeal cookie, offering a wholesome and satisfying treat for any time of day." + filling_color = "#663300" + tastes = list("oatmeal cookie" = 1) + foodtype = SUGAR | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/snack/dried_cranberries + name = "dried cranberries" + desc = "Tangy and chewy dried cranberries, a healthy and nutritious snack option." + filling_color = "#cc3300" + tastes = list("cranberries" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/dry_roasted_peanuts + name = "dry roasted peanuts" + desc = "Crunchy and flavorful dry roasted peanuts, a satisfying and protein-packed snack option." + filling_color = "#663300" + tastes = list("peanuts" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/snack/jalapeno_cashews + name = "jalapeno cashews" + desc = "Savory cashews coated in a spicy jalapeno seasoning, creating a flavorful and satisfying snack option." + filling_color = "#663300" + tastes = list("jalapeno" = 1, "cashews" = 1) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/ration/bar/energy_bar + name = "quik-energy bar, apple-cinnamon" + desc = "A power-packed quik-energy bar infused with the flavors of apple and cinnamon. Ideal for a quick energy boost on the go." + filling_color = "#ee3e1f" + tastes = list("apple" = 1, "cinnamon" = 1) + foodtype = FRUIT | GRAIN + +/obj/item/reagent_containers/food/snacks/ration/bar/tropical_energy_bar + name = "tropical energy bar" + desc = "An energy-boosting bar packed with tropical flavors and essential nutrients for sustained vitality." + filling_color = "#ff9900" + tastes = list("tropical" = 1, "energy bar" = 1) + foodtype = SUGAR | FRUIT + +/obj/item/reagent_containers/food/snacks/ration/bar/rationers_guild_chocolate_bar + name = "Rationer's Guild chocolate bar" + desc = "A chocolate bar made by the Rationer's Guild, offering a rich and indulgent treat for a quick pick-me-up." + filling_color = "#663300" + tastes = list("chocolate" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/bar/quik_energy_bar_chocolate + name = "quik-energy bar chocolate" + desc = "A power-packed quik-energy bar infused with the rich flavor of chocolate. Ideal for a quick energy boost on the go." + filling_color = "#663300" + tastes = list("chocolate" = 1) + foodtype = SUGAR + +/obj/item/reagent_containers/food/snacks/ration/condiment + name = "condiment bottle" + desc = "Just your average condiment bottle." + icon_state = "ration_condi" + volume = 10 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list() + +/obj/item/reagent_containers/food/snacks/ration/condiment/afterattack(obj/target, mob/user , proximity) + . = ..() + if(!is_drainable()) + to_chat(user, "The [src] is sealed shut!") + return + if(!proximity) + return + + //You can tear the bag open above food to put the condiments on it, obviously. + if(istype(target, /obj/item/reagent_containers/food/snacks)) + if(target.reagents.total_volume >= target.reagents.maximum_volume) + to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off!" ) + qdel(src) + return + else + to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") + src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + qdel(src) + +/obj/item/reagent_containers/food/snacks/ration/condiment/cheese_spread + name = "cheese spread pack" + list_reagents = list(/datum/reagent/consumable/cheese_spread = 8) + +/obj/item/reagent_containers/food/snacks/ration/condiment/hot_cheese_spread + name = "jalapeno cheddar cheese spread pack" + list_reagents = list(/datum/reagent/consumable/cheese_spread = 5 , /datum/reagent/consumable/capsaicin = 3) + +/obj/item/reagent_containers/food/snacks/ration/condiment/garlic_cheese_spread + name = "garlic parmesan cheese spread pack" + list_reagents = list(/datum/reagent/consumable/cheese_spread = 8) + +/obj/item/reagent_containers/food/snacks/ration/condiment/bacon_cheddar_cheese_spread + name = "bacon cheddar cheese spread pack" + list_reagents = list(/datum/reagent/consumable/cheese_spread = 8) + +/obj/item/reagent_containers/food/snacks/ration/condiment/peanut_butter + name = "peanut butter pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/peanut_butter = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/chunky_peanut_butter + name = "chunky peanut butter pack" + list_reagents = list(/datum/reagent/consumable/peanut_butter = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/maple_syrup + name = "maple syrup pack" + list_reagents = list(/datum/reagent/consumable/sugar = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/chocolate_protein_beverage + name = "chocolate hazelnut protein drink powder pack" + list_reagents = list(/datum/reagent/consumable/coco = 5, /datum/reagent/consumable/eggyolk = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/fruit_beverage + name = "fruit punch beverage powder, carb-electrolyte pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/applejuice = 2, /datum/reagent/consumable/orangejuice = 2) + +/obj/item/reagent_containers/food/snacks/ration/condiment/fruit_smoothie_beverage + name = "tropical blend fruit and vegetable smoothie powder pack" + list_reagents = list(/datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/orangejuice = 3, /datum/reagent/consumable/eggyolk = 3) + +/obj/item/reagent_containers/food/snacks/ration/condiment/grape_beverage + name = "grape beverage powder, carb-fortified pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/grapejuice = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/grape_beverage_sugar_free + name = "sugar-free grape beverage base powder" + list_reagents = list(/datum/reagent/consumable/grapejuice = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/lemonade_beverage + name = "lemonade drink powder pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/lemonjuice = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/lemonade_beverage_suger_free + name = "lemonade sugar-free beverage base pack" + list_reagents = list(/datum/reagent/consumable/lemonjuice = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage + name = "orange beverage powder, carb-fortified pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/orangejuice = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/orange_beverage_sugar_free + name = "orange beverage base, sugar-free pack" + list_reagents = list(/datum/reagent/consumable/orangejuice = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/cherry_beverage + name = "cherry high-energy beverage powder pack" + list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/cherryjelly = 5) + +/obj/item/reagent_containers/food/snacks/ration/condiment/pineapple_beverage + name = "pinapple fruit beverage base pack" + list_reagents = list(/datum/reagent/consumable/pineapplejuice = 10) + +/obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_orange + name = "freeze-dried coffee flavored with orange pack" + list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/orangejuice = 3) + +/obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_chocolate + name = "freeze-dried coffee flavored with chocolate pack" + list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/coco = 3) + +/obj/item/reagent_containers/food/snacks/ration/condiment/freeze_dried_coffee_hazelnut + name = "freeze-dried coffee flavored with hazelnut pack" + list_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/coco = 3) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index b923c87f1537..66c3c87a82da 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -734,14 +734,14 @@ foodtype = FRUIT | SUGAR /obj/item/reagent_containers/food/snacks/canned/peaches/maint - name = "Maintenance Peaches" + name = "maintenance peaches" desc = "I have a mouth and I must eat." icon_state = "peachcanmaint" trash = /obj/item/trash/can/food/peaches/maint tastes = list("peaches" = 1, "tin" = 7) /obj/item/reagent_containers/food/snacks/crab_rangoon - name = "Crab Rangoon" + name = "crab rangoon" desc = "Has many names, like crab puffs, cheese wontons, crab dumplings? Whatever you call them, they're a fabulous blast of cream cheesy crab." icon_state = "crabrangoon" list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 5) @@ -761,3 +761,5 @@ filling_color = "#ECA735" tastes = list("fried corn" = 1) foodtype = JUNKFOOD | FRIED + + diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 101b733d3677..72219b159b4d 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -358,6 +358,54 @@ soundloop.stop() update_appearance() +/obj/item/ration_heater + name = "flameless ration heater" + icon = 'icons/obj/food/ration.dmi' + icon_state = "ration_package" + grind_results = list(/datum/reagent/iron = 10, /datum/reagent/water = 10, /datum/reagent/consumable/sodiumchloride = 5) + heat = 3800 + var/obj/item/tocook = null + var/mutable_appearance/ration_overlay + var/uses = 3 + +/obj/item/ration_heater/Initialize() + . = ..() + ration_overlay = mutable_appearance(icon, icon_state, LOW_ITEM_LAYER) + +/obj/item/ration_heater/afterattack(atom/target, mob/user, flag) + if(istype(target, /obj/item/reagent_containers/food) || istype(target, /obj/item/grown)) + to_chat(user, "You start sliding \the [src] under the [target]...") + if(do_after(user, 10)) + tocook = target + RegisterSignal(tocook, COMSIG_PARENT_QDELETING, PROC_REF(clear_cooking)) + target.add_overlay(ration_overlay) + addtimer(CALLBACK(src, .proc/cook), 100) + visible_message("\The [target] rapidly begins cooking...") + playsound(src, 'sound/items/cig_light.ogg', 50, 1) + moveToNullspace() + +/obj/item/ration_heater/proc/clear_cooking(datum/source) + SIGNAL_HANDLER + UnregisterSignal(tocook, COMSIG_PARENT_QDELETING) + tocook.cut_overlay(ration_overlay) + tocook = null +/obj/item/ration_heater/proc/cook() + var/cookturf = get_turf(tocook) + tocook.visible_message("\The [tocook] is done warming up!") + playsound(tocook, 'sound/items/cig_snuff.ogg', 50, 1) + if(istype(tocook, /obj/item/reagent_containers/food) || istype(tocook, /obj/item/grown)) + clear_cooking() + tocook.microwave_act() + if(uses == 0) + qdel() + else + uses-- + src.forceMove(cookturf) + +/obj/item/ration_heater/examine(mob/user) + . = ..() + . += "It has [uses] uses left..." + #undef MICROWAVE_NORMAL #undef MICROWAVE_MUCK #undef MICROWAVE_PRE diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 614cb298fd05..984378477292 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -849,3 +849,17 @@ M.adjustFireLoss(-2*REM, 0) M.adjustStaminaLoss(-5*REM, 0) ..() + +/datum/reagent/consumable/cheese_spread + name = "Cheese Spread" + description = "I cant believe its not cheese!" + color = "#FBDB65" + nutriment_factor = 2 * REAGENTS_METABOLISM + taste_mult = 2 + taste_description = "cheese" + +/datum/reagent/consumable/peanut_butter + name = "Peanut Butter" + nutriment_factor = 1 * REAGENTS_METABOLISM + taste_description = "peanut" + reagent_state = SOLID diff --git a/icons/obj/food/ration.dmi b/icons/obj/food/ration.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5bcf1f2b490bdd68274c1a00f70b8e9b549b0589 GIT binary patch literal 1832 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 U*;rO0XcE4OgC`jD_W#xY0GG+4L;wH) literal 0 HcmV?d00001 From 05ee7c55f518454c616148caf0f4c11460f6f93c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 14 Sep 2023 12:10:47 -0500 Subject: [PATCH 41/57] Automatic changelog generation for PR #2260 [ci skip] --- html/changelogs/AutoChangeLog-pr-2260.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2260.yml diff --git a/html/changelogs/AutoChangeLog-pr-2260.yml b/html/changelogs/AutoChangeLog-pr-2260.yml new file mode 100644 index 000000000000..4b5a8cf7ac75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2260.yml @@ -0,0 +1,5 @@ +author: FalloutFalcon +delete-after: true +changes: + - rscadd: better rations + - rscdel: rationpack spawns From 377baccca520b22b5dc140aaf8df329a23c754bb Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 15 Sep 2023 00:46:00 +0000 Subject: [PATCH 42/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2127.yml | 5 ----- html/changelogs/AutoChangeLog-pr-2260.yml | 5 ----- html/changelogs/archive/2023-09.yml | 7 +++++++ 3 files changed, 7 insertions(+), 10 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2127.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2260.yml diff --git a/html/changelogs/AutoChangeLog-pr-2127.yml b/html/changelogs/AutoChangeLog-pr-2127.yml deleted file mode 100644 index f81c335488d8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2127.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MarkSuckerberg -delete-after: true -changes: - - rscdel: Gang and revs gamemode (the gear remains) - - admin: Removes SSjob, occupations are now stored in a global list diff --git a/html/changelogs/AutoChangeLog-pr-2260.yml b/html/changelogs/AutoChangeLog-pr-2260.yml deleted file mode 100644 index 4b5a8cf7ac75..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2260.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalloutFalcon -delete-after: true -changes: - - rscadd: better rations - - rscdel: rationpack spawns diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index 7dac49601dd5..8d294b1c8790 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -81,3 +81,10 @@ thgvr: - admin: Improved admin build mode menu and Drop pods from tgstation - rscdel: ion storms are removed +2023-09-15: + FalloutFalcon: + - rscadd: better rations + - rscdel: rationpack spawns + MarkSuckerberg: + - rscdel: Gang and revs gamemode (the gear remains) + - admin: Removes SSjob, occupations are now stored in a global list From 313ca1fafdfb9bf0a1186a9e55fbde4367e1b9a5 Mon Sep 17 00:00:00 2001 From: Mark Suckerberg Date: Thu, 14 Sep 2023 20:26:44 -0500 Subject: [PATCH 43/57] Total harddel audit + far more thorough unit testing (#2171) ## About The Pull Request Ports a bunch of harddel fixes from /tg/ + improved reftracking + create & destroy testing, plus adds many harddel fixes of my own from said testing both locally and on live Port list: tgstation/tgstation#57728 tgstation/tgstation#58972 tgstation/tgstation#59371 tgstation/tgstation#59612 (only the test, most harddel fixes I ignored) tgstation/tgstation#62725 tgstation/tgstation#63877 tgstation/tgstation#51544 tgstation/tgstation#59804 tgstation/tgstation#63276 tgstation/tgstation#62755 tgstation/tgstation#66649 tgstation/tgstation#72401 tgstation/tgstation#53816 tgstation/tgstation#73261 (just a few tweaks from this) tgstation/tgstation#73037 ## Why It's Good For The Game Hard deletes are the largest source of overtime currently, and it's becoming a problem now that we're approaching 60pop on the regular. For the sake of playability, drastic action needs to be taken, and this is that drastic action. I hate how big this PR is, it's one of my biggest mistakes so far. ## Changelog :cl: /:cl: --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com> Co-authored-by: AnturK Co-authored-by: Rohesie Co-authored-by: tgstation-server Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: Tastyfish Co-authored-by: Kyle Spier-Swenson Co-authored-by: Couls Co-authored-by: ZephyrTFA --- .github/CONTRIBUTING.md | 4 + .github/HARDDEL_GUIDE.md | 265 + .../JungleRuins/jungle_bombed_starport.dmm | 19979 ++++++++-------- .../LavaRuins/lavaland_surface_codelab.dmm | 16 +- .../RockRuins/rockplanet_crash_cult.dmm | 88 +- .../whitesands_surface_medipen_plant.dmm | 321 +- .../whitesands_surface_youreinsane.dmm | 14 +- _maps/RandomRuins/SpaceRuins/Fast_Food.dmm | 7 +- .../SpaceRuins/corporate_mining.dmm | 139 +- _maps/RandomRuins/SpaceRuins/hellfactory.dmm | 30 +- .../SpaceRuins/singularity_lab.dmm | 14031 ++++++----- _maps/RandomRuins/SpaceRuins/spacemall.dmm | 377 +- .../wasteplanet_abandoned_mechbay.dmm | 982 +- _maps/_basemap.dm | 10 +- .../Ruins}/lavaland_biodome_beach.dmm | 0 .../lavaland_surface_syndicate_base1.dmm | 9168 +++++++ .../Ships}/infiltrator_advanced.dmm | 0 _maps/deprecated/deprecated_datums.dm | 15 + _maps/outpost/hangar/test_20x20.dmm | 2 +- _maps/outpost/hangar/test_2_20x20.dmm | 322 +- _maps/outpost/hangar/test_2_40x20.dmm | 416 +- _maps/outpost/hangar/test_2_40x40.dmm | 6 +- _maps/outpost/hangar/test_40x20.dmm | 2 +- _maps/outpost/hangar/test_40x40.dmm | 2 +- _maps/outpost/hangar/test_56x20.dmm | 2 +- _maps/outpost/hangar/test_56x40.dmm | 2 +- _maps/outpost/outpost_test_1.dmm | 7 +- _maps/outpost/outpost_test_2.dmm | 90 +- .../shuttles/shiptest/independent_junker.dmm | 148 +- _maps/shuttles/shiptest/independent_meta.dmm | 427 +- .../shuttles/shiptest/independent_rigger.dmm | 89 +- .../shiptest/independent_shepherd.dmm | 41 +- .../shiptest/independent_tranquility.dmm | 568 +- _maps/shuttles/shiptest/inteq_talos.dmm | 231 +- _maps/shuttles/shiptest/inteq_vaquero.dmm | 1 - _maps/shuttles/shiptest/solgov_chronicle.dmm | 38 +- _maps/shuttles/shiptest/syndicate_aegis.dmm | 104 +- .../shiptest/syndicate_luxembourg.dmm | 153 +- .../shiptest/syndicate_twinkleshine.dmm | 49 +- .../subshuttles/independent_superpill.dmm | 10 +- check_regex.yaml | 2 +- code/__DEFINES/atoms.dm | 4 + code/__DEFINES/cooldowns.dm | 2 +- code/__DEFINES/flags.dm | 4 + code/__DEFINES/mobs.dm | 3 + code/__DEFINES/obj_flags.dm | 23 +- code/__DEFINES/qdel.dm | 7 + code/__DEFINES/subsystems.dm | 4 +- code/__DEFINES/traits.dm | 6 + code/__HELPERS/_logging.dm | 12 + code/__HELPERS/game.dm | 21 +- code/__HELPERS/unsorted.dm | 14 +- code/__HELPERS/virtual_z_level.dm | 5 + code/_compile_options.dm | 23 + code/_globalvars/bitfields.dm | 9 +- code/_globalvars/logging.dm | 5 + code/_onclick/adjacent.dm | 2 +- code/_onclick/hud/alert.dm | 3 +- code/_onclick/hud/credits.dm | 8 +- code/_onclick/hud/robot.dm | 12 + code/_onclick/hud/screen_objects.dm | 2 + code/controllers/master.dm | 3 +- code/controllers/subsystem/air.dm | 53 +- code/controllers/subsystem/atoms.dm | 13 +- code/controllers/subsystem/garbage.dm | 36 +- code/controllers/subsystem/idlenpcpool.dm | 2 +- code/controllers/subsystem/mapping.dm | 1 + code/controllers/subsystem/persistence.dm | 6 +- .../subsystem/processing/fields.dm | 6 - .../subsystem/processing/quirks.dm | 14 +- code/controllers/subsystem/shuttle.dm | 17 +- code/controllers/subsystem/timer.dm | 2 +- code/controllers/subsystem/vis_overlays.dm | 24 - code/datums/ai_laws.dm | 6 + code/datums/beam.dm | 6 +- code/datums/brain_damage/imaginary_friend.dm | 5 +- code/datums/browser.dm | 19 +- code/datums/components/caltrop.dm | 2 + code/datums/components/chasm.dm | 49 +- code/datums/components/connect_containers.dm | 68 + code/datums/components/connect_range.dm | 107 + code/datums/components/crafting/recipes.dm | 6 +- code/datums/components/fantasy/_fantasy.dm | 3 +- code/datums/components/mirv.dm | 2 +- code/datums/components/overlay_lighting.dm | 11 +- code/datums/components/pellet_cloud.dm | 14 +- code/datums/components/spawner.dm | 3 +- code/datums/components/storage/storage.dm | 16 +- code/datums/components/tackle.dm | 18 +- code/datums/components/udder.dm | 6 +- code/datums/dash_weapon.dm | 14 +- code/datums/datum.dm | 27 +- code/datums/diseases/parrotpossession.dm | 2 +- code/datums/dna.dm | 4 +- code/datums/elements/connect_loc.dm | 2 +- code/datums/elements/forced_gravity.dm | 7 + code/datums/hud.dm | 19 +- code/datums/map_zones.dm | 22 +- code/datums/mapgen/_biome.dm | 6 +- .../mapgen/planetary/JungleGenerator.dm | 4 +- code/datums/mapgen/planetary/LavaGenerator.dm | 8 +- code/datums/mapgen/planetary/RockGenerator.dm | 8 +- code/datums/mapgen/planetary/SnowGenerator.dm | 26 +- .../datums/mapgen/planetary/WasteGenerator.dm | 254 +- code/datums/mapgen/single_biome/Gas_Giant.dm | 15 +- code/datums/mind.dm | 54 +- code/datums/proximity_monitor/field.dm | 169 + .../proximity_monitor}/fields/gravity.dm | 8 +- .../fields/peaceborg_dampener.dm | 78 +- .../proximity_monitor}/fields/timestop.dm | 23 +- .../proximity_monitor/proximity_monitor.dm | 78 + code/datums/quixotejump.dm | 10 +- code/datums/ruins/lavaland.dm | 15 - code/datums/shuttles.dm | 17 +- code/datums/status_effects/buffs.dm | 2 +- code/datums/traits/_quirk.dm | 3 - code/datums/traits/negative.dm | 1 - code/datums/wires/explosive.dm | 7 +- code/game/area/ai_monitored.dm | 2 +- code/game/area/areas/ruins/_ruins.dm | 2 +- code/game/area/areas/shuttles.dm | 2 +- code/game/atoms.dm | 34 +- code/game/atoms_movable.dm | 17 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 5 +- code/game/gamemodes/objective.dm | 5 + code/game/machinery/_machinery.dm | 16 +- code/game/machinery/airlock_cycle_control.dm | 2 +- code/game/machinery/autolathe.dm | 4 +- code/game/machinery/camera/camera.dm | 11 +- code/game/machinery/camera/motion.dm | 2 +- code/game/machinery/camera/presets.dm | 3 + code/game/machinery/camera/tracking.dm | 8 +- code/game/machinery/computer/Operating.dm | 30 +- code/game/machinery/computer/_computer.dm | 4 - code/game/machinery/computer/atmos_control.dm | 4 +- code/game/machinery/computer/dna_console.dm | 23 +- code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/cryopod.dm | 1 + code/game/machinery/deployable.dm | 2 +- code/game/machinery/dna_scanner.dm | 12 + code/game/machinery/doors/airlock.dm | 5 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 20 +- code/game/machinery/doors/windowdoor.dm | 5 +- code/game/machinery/fat_sucker.dm | 4 + code/game/machinery/flasher.dm | 6 +- code/game/machinery/hologram.dm | 2 + code/game/machinery/launch_pad.dm | 63 +- code/game/machinery/navbeacon.dm | 15 +- code/game/machinery/recycler.dm | 5 +- code/game/machinery/roulette_machine.dm | 5 + code/game/machinery/shieldgen.dm | 2 +- code/game/machinery/shuttle/shuttle_engine.dm | 12 +- .../machinery/shuttle/shuttle_engine_types.dm | 6 - code/game/machinery/shuttle/shuttle_heater.dm | 13 +- .../telecomms/machines/message_server.dm | 9 +- code/game/machinery/transformer.dm | 2 +- .../mecha/equipment/tools/medical_tools.dm | 34 +- code/game/mecha/mecha.dm | 45 +- code/game/objects/buckling.dm | 7 +- .../effects/anomalies/anomalies_flux.dm | 3 + .../effects/anomalies/anomalies_gravity.dm | 4 +- code/game/objects/effects/countdown.dm | 12 +- code/game/objects/effects/decals/cleanable.dm | 7 +- .../objects/effects/decals/cleanable/food.dm | 4 +- .../effects/decals/cleanable/robots.dm | 4 - code/game/objects/effects/decals/crayon.dm | 2 +- code/game/objects/effects/decals/decal.dm | 14 +- .../effects/effect_system/effect_shield.dm | 2 +- .../effect_system/effects_explosion.dm | 2 + code/game/objects/effects/effects.dm | 2 +- code/game/objects/effects/misc.dm | 1 + code/game/objects/effects/overlays.dm | 8 +- code/game/objects/effects/proximity.dm | 129 - .../objects/effects/spawners/gibspawner.dm | 20 +- .../objects/effects/spawners/structure.dm | 5 + code/game/objects/effects/spiders.dm | 14 +- code/game/objects/items.dm | 7 +- code/game/objects/items/RSF.dm | 3 +- code/game/objects/items/cash.dm | 2 +- code/game/objects/items/chrono_eraser.dm | 8 +- code/game/objects/items/devices/aicard.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 4 +- .../items/devices/forcefieldprojector.dm | 8 +- .../objects/items/devices/geiger_counter.dm | 10 +- .../game/objects/items/devices/polycircuit.dm | 1 + code/game/objects/items/devices/scanners.dm | 8 +- .../objects/items/devices/transfer_valve.dm | 11 +- code/game/objects/items/dice.dm | 6 +- .../objects/items/grenades/clusterbuster.dm | 3 +- code/game/objects/items/grenades/festive.dm | 2 +- code/game/objects/items/grenades/plastic.dm | 5 +- .../objects/items/implants/implant_track.dm | 14 +- code/game/objects/items/melee/energy.dm | 4 + code/game/objects/items/melee/misc.dm | 2 +- code/game/objects/items/mop.dm | 5 +- code/game/objects/items/robot/robot_items.dm | 12 +- .../objects/items/stacks/license_plates.dm | 9 +- .../items/stacks/sheets/sheet_types.dm | 6 +- code/game/objects/items/stacks/wrap.dm | 3 +- code/game/objects/items/storage/fancy.dm | 2 + code/game/objects/items/stunbaton.dm | 5 +- code/game/objects/items/wayfinding.dm | 4 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures/ai_core.dm | 7 +- .../objects/structures/beds_chairs/bed.dm | 9 + code/game/objects/structures/bedsheet_bin.dm | 4 +- .../structures/crates_lockers/closets.dm | 21 +- .../crates_lockers/closets/secure/freezer.dm | 2 +- .../structures/crates_lockers/crates.dm | 2 +- code/game/objects/structures/displaycase.dm | 3 - .../objects/structures/ghost_role_spawners.dm | 11 +- code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/holosign.dm | 8 +- code/game/objects/structures/manned_turret.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/plasticflaps.dm | 30 +- code/game/objects/structures/railings.dm | 7 +- code/game/objects/structures/tables_racks.dm | 26 +- code/game/objects/structures/traps.dm | 16 +- .../objects/structures/windoor_assembly.dm | 5 +- code/game/objects/structures/window.dm | 22 +- code/game/turfs/change_turf.dm | 25 +- code/game/turfs/open/chasm.dm | 2 +- code/game/turfs/open/floor/catwalk_plating.dm | 6 +- code/game/turfs/open/openspace.dm | 3 + code/game/turfs/open/space/transit.dm | 16 +- code/game/turfs/turf.dm | 16 +- code/game/world.dm | 9 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 4 + code/modules/admin/verbs/atmosdebug.dm | 57 +- code/modules/admin/verbs/secrets.dm | 2 +- code/modules/admin/verbs/shuttlepanel.dm | 12 +- .../view_variables/reference_tracking.dm | 158 +- .../abductor/equipment/glands/slime.dm | 4 +- code/modules/antagonists/blob/blob_mobs.dm | 9 +- .../blob/blobstrains/_blobstrain.dm | 4 + .../blob/blobstrains/energized_jelly.dm | 2 +- code/modules/antagonists/blob/overmind.dm | 1 + .../antagonists/blob/structures/_blob.dm | 4 +- .../antagonists/blob/structures/core.dm | 8 +- code/modules/antagonists/cult/blood_magic.dm | 9 +- code/modules/antagonists/cult/cult_items.dm | 9 +- .../antagonists/disease/disease_disease.dm | 1 + .../antagonists/disease/disease_mob.dm | 2 + code/modules/antagonists/revenant/revenant.dm | 6 +- .../antagonists/slaughter/slaughter.dm | 2 +- .../traitor/equipment/Malf_Modules.dm | 19 +- code/modules/assembly/assembly.dm | 4 + code/modules/assembly/flash.dm | 15 +- code/modules/assembly/proximity.dm | 12 +- .../environmental/LINDA_turf_tile.dm | 4 +- .../atmospherics/machinery/atmosmachinery.dm | 19 +- .../machinery/components/components_base.dm | 41 +- .../unary_devices/outlet_injector.dm | 17 +- .../components/unary_devices/relief_valve.dm | 4 +- .../components/unary_devices/thermomachine.dm | 3 +- .../atmospherics/machinery/datum_pipeline.dm | 92 +- .../atmospherics/machinery/other/meter.dm | 2 +- .../machinery/pipes/layermanifold.dm | 2 +- .../atmospherics/machinery/pipes/pipes.dm | 6 +- .../portable/portable_atmospherics.dm | 8 +- code/modules/atmospherics/multiz.dm | 2 +- code/modules/awaymissions/away_props.dm | 8 +- code/modules/awaymissions/capture_the_flag.dm | 36 +- code/modules/awaymissions/gateway.dm | 6 + .../modules/awaymissions/super_secret_room.dm | 6 +- code/modules/buildmode/buildmode.dm | 4 + code/modules/buildmode/effects/line.dm | 3 + code/modules/cargo/bounties/reagent.dm | 4 - code/modules/cargo/gondolapod.dm | 5 +- code/modules/cargo/supplypod.dm | 5 +- code/modules/client/preferences.dm | 42 +- code/modules/clothing/head/misc.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 5 + code/modules/clothing/spacesuits/hardsuit.dm | 14 +- code/modules/clothing/suits/toggles.dm | 5 +- code/modules/clothing/under/accessories.dm | 17 +- code/modules/detectivework/detective_work.dm | 2 +- code/modules/economy/selling_pad.dm | 2 +- code/modules/error_handler/error_handler.dm | 2 +- code/modules/events/holiday/halloween.dm | 6 +- code/modules/events/spacevine.dm | 2 +- code/modules/events/wizard/greentext.dm | 3 +- code/modules/fields/fields.dm | 324 - code/modules/fields/turf_objects.dm | 67 - code/modules/fishing/fishing_rod.dm | 2 +- code/modules/flufftext/Hallucination.dm | 5 +- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- .../kitchen_machinery/deep_fryer.dm | 5 + .../kitchen_machinery/grill.dm | 5 +- .../kitchen_machinery/microwave.dm | 2 + code/modules/holodeck/computer.dm | 4 +- code/modules/holodeck/holo_effect.dm | 60 +- code/modules/hydroponics/grown.dm | 3 + code/modules/hydroponics/grown/cotton.dm | 14 +- code/modules/hydroponics/seeds.dm | 19 +- code/modules/instruments/songs/_song.dm | 4 +- code/modules/language/language_holder.dm | 4 +- code/modules/lighting/lighting_atom.dm | 4 +- code/modules/lighting/lighting_object.dm | 2 +- code/modules/lighting/lighting_setup.dm | 2 +- code/modules/lighting/lighting_source.dm | 3 +- code/modules/mapping/map_template.dm | 1 + code/modules/mapping/mapping_helpers.dm | 18 +- code/modules/mining/fulton.dm | 2 +- code/modules/mining/laborcamp/laborstacker.dm | 16 +- .../mining/lavaland/necropolis_chests.dm | 12 + code/modules/mining/machine_processing.dm | 9 +- code/modules/mining/machine_stacking.dm | 20 +- code/modules/mining/minebot.dm | 18 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/mob/dead/dead.dm | 4 + code/modules/mob/dead/new_player/login.dm | 4 +- .../modules/mob/dead/new_player/new_player.dm | 6 +- code/modules/mob/living/blood.dm | 3 +- code/modules/mob/living/brain/brain.dm | 13 +- code/modules/mob/living/brain/brain_item.dm | 3 + .../carbon/alien/humanoid/caste/hunter.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 4 + .../carbon/alien/utilities/structures.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 1 + code/modules/mob/living/carbon/emote.dm | 4 +- .../mob/living/carbon/hologram/hologram.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 1 + .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/human_say.dm | 2 +- .../carbon/human/species_types/golems.dm | 5 +- .../carbon/human/species_types/jellypeople.dm | 107 +- .../carbon/human/species_types/snail.dm | 6 + .../carbon/human/species_types/zombies.dm | 18 - code/modules/mob/living/carbon/life.dm | 6 +- code/modules/mob/living/damage_procs.dm | 2 +- code/modules/mob/living/inhand_holder.dm | 6 + code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 5 +- code/modules/mob/living/living_movement.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 26 +- .../living/silicon/ai/freelook/cameranet.dm | 57 +- .../mob/living/silicon/ai/robot_control.dm | 6 + code/modules/mob/living/silicon/pai/pai.dm | 1 + .../modules/mob/living/silicon/robot/robot.dm | 22 +- code/modules/mob/living/silicon/silicon.dm | 1 + .../mob/living/simple_animal/bot/bot.dm | 4 +- .../mob/living/simple_animal/bot/honkbot.dm | 5 +- .../mob/living/simple_animal/bot/secbot.dm | 5 +- .../mob/living/simple_animal/constructs.dm | 19 +- .../mob/living/simple_animal/friendly/cat.dm | 15 +- .../living/simple_animal/friendly/snake.dm | 4 + .../simple_animal/guardian/types/support.dm | 2 +- .../mob/living/simple_animal/hostile/bees.dm | 3 +- .../simple_animal/hostile/giant_spider.dm | 29 +- .../mob/living/simple_animal/hostile/goose.dm | 15 +- .../living/simple_animal/hostile/hostile.dm | 90 +- .../simple_animal/hostile/jungle/mook.dm | 11 +- .../simple_animal/hostile/mecha_pilot.dm | 4 +- .../hostile/megafauna/bubblegum.dm | 4 +- .../hostile/megafauna/colossus.dm | 15 +- .../hostile/megafauna/hierophant.dm | 4 +- .../hostile/megafauna/wendigo.dm | 2 + .../mob/living/simple_animal/hostile/mimic.dm | 2 +- .../hostile/mining_mobs/basilisk.dm | 3 +- .../hostile/mining_mobs/curse_blob.dm | 5 +- .../hostile/mining_mobs/elites/elite.dm | 15 +- .../mining_mobs/elites/goliath_broodmother.dm | 21 +- .../living/simple_animal/hostile/regalrat.dm | 7 + .../hostile/retaliate/retaliate.dm | 30 +- .../simple_animal/hostile/venus_human_trap.dm | 20 +- .../mob/living/simple_animal/parrot.dm | 125 +- .../mob/living/simple_animal/simple_animal.dm | 21 +- .../mob/living/simple_animal/slime/life.dm | 48 +- .../mob/living/simple_animal/slime/powers.dm | 2 +- .../mob/living/simple_animal/slime/slime.dm | 70 +- code/modules/mob/logout.dm | 4 +- code/modules/mob/mob.dm | 77 +- code/modules/mob/mob_defines.dm | 4 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/mob/mob_lists.dm | 1 - code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/transform_procs.dm | 6 +- .../NTNet/NTNRC/conversation.dm | 29 +- .../computers/machinery/console_presets.dm | 2 - .../file_system/programs/alarm.dm | 20 +- .../file_system/programs/ntnrc_client.dm | 12 +- .../file_system/programs/sm_monitor.dm | 18 +- .../modular_computers/hardware/hard_drive.dm | 2 +- code/modules/ninja/energy_katana.dm | 3 +- code/modules/ninja/suit/suit.dm | 5 + code/modules/overmap/_overmap_datum.dm | 9 +- code/modules/overmap/helm.dm | 50 +- code/modules/overmap/missions.dm | 2 + code/modules/overmap/objects/dynamic_datum.dm | 9 +- code/modules/overmap/overmap_token.dm | 2 +- .../overmap/ships/controlled_ship_datum.dm | 38 +- code/modules/overmap/ships/ship_datum.dm | 2 +- code/modules/pixelshifting/pixelshift.dm | 2 +- .../plumbing/plumbers/grinder_chemical.dm | 5 +- code/modules/power/apc.dm | 17 +- code/modules/power/generator.dm | 2 +- .../power/singularity/containment_field.dm | 24 +- code/modules/power/singularity/narsie.dm | 1 + code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes.dm | 2 - code/modules/power/solar.dm | 5 + code/modules/power/supermatter/supermatter.dm | 4 +- .../projectiles/ammunition/_ammunition.dm | 4 +- .../projectiles/ammunition/energy/portal.dm | 5 +- code/modules/projectiles/gun.dm | 2 + code/modules/projectiles/guns/energy.dm | 7 +- .../projectiles/guns/energy/dueling.dm | 11 +- .../projectiles/guns/energy/laser_gatling.dm | 10 + .../projectiles/guns/energy/special.dm | 4 +- code/modules/projectiles/guns/magic.dm | 3 +- code/modules/projectiles/guns/misc/medbeam.dm | 30 +- code/modules/projectiles/projectile.dm | 31 +- code/modules/projectiles/projectile/magic.dm | 1 + .../projectiles/projectile/special/curse.dm | 4 + .../projectiles/projectile/special/gravity.dm | 6 +- .../projectile/special/hallucination.dm | 2 +- .../projectile/special/wormhole.dm | 8 +- .../reagents/cat2_medicine_reagents.dm | 105 +- .../chemistry/reagents/other_reagents.dm | 10 +- .../chemistry/reagents/toxin_reagents.dm | 2 +- .../chemistry/recipes/cat2_medicines.dm | 24 +- .../reagents/chemistry/recipes/medicine.dm | 4 +- .../chemistry/recipes/pyrotechnics.dm | 4 +- code/modules/reagents/reagent_containers.dm | 16 +- .../reagents/reagent_containers/borghydro.dm | 2 +- .../reagents/reagent_containers/jug.dm | 2 +- .../reagents/reagent_containers/pill.dm | 4 +- .../reagents/reagent_containers/spray.dm | 2 +- code/modules/recycling/conveyor2.dm | 2 +- code/modules/recycling/disposal/bin.dm | 3 +- code/modules/research/designs.dm | 19 +- .../research/nanites/nanite_chamber.dm | 1 - .../nanites/nanite_chamber_computer.dm | 15 +- .../research/nanites/nanite_programs.dm | 3 + .../nanites/nanite_programs/utility.dm | 2 +- .../crossbreeding/_status_effects.dm | 2 +- .../xenobiology/crossbreeding/burning.dm | 8 +- .../research/xenobiology/xenobio_camera.dm | 4 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 3 +- .../ruins/objects_and_mobs/ash_walker_den.dm | 9 + .../ruins/objects_and_mobs/necropolis_gate.dm | 4 +- .../ruins/objects_and_mobs/sin_ruins.dm | 2 +- code/modules/shuttle/docking.dm | 2 + code/modules/shuttle/on_move.dm | 57 +- code/modules/shuttle/shuttle.dm | 150 +- code/modules/shuttle/special.dm | 2 +- code/modules/spells/spell.dm | 25 +- code/modules/spells/spell_types/forcewall.dm | 4 +- code/modules/spells/spell_types/lichdom.dm | 3 + .../spells/spell_types/personality_commune.dm | 4 + code/modules/spells/spell_types/shapeshift.dm | 3 +- .../spells/spell_types/touch_attacks.dm | 6 +- code/modules/surgery/bodyparts/helpers.dm | 1 + .../surgery/bodyparts/robot_bodyparts.dm | 4 +- code/modules/surgery/organs/augments_arms.dm | 148 +- code/modules/tgui/tgui_alert.dm | 2 +- code/modules/unit_tests/README.md | 76 + code/modules/unit_tests/_unit_tests.dm | 65 +- code/modules/unit_tests/anchored_mobs.dm | 4 +- code/modules/unit_tests/bespoke_id.dm | 2 +- code/modules/unit_tests/biome_lists.dm | 18 + code/modules/unit_tests/component_tests.dm | 4 +- code/modules/unit_tests/create_and_destroy.dm | 219 + .../unit_tests/find_reference_sanity.dm | 132 + code/modules/unit_tests/keybinding_init.dm | 2 +- code/modules/unit_tests/open_air.dm | 8 +- code/modules/unit_tests/outfit_sanity.dm | 7 +- code/modules/unit_tests/planet_gen.dm | 19 + code/modules/unit_tests/plantgrowth_tests.dm | 6 +- code/modules/unit_tests/projectiles.dm | 24 +- code/modules/unit_tests/rcd.dm | 3 +- code/modules/unit_tests/reactions.dm | 2 +- code/modules/unit_tests/reagent_id_typos.dm | 2 +- code/modules/unit_tests/reagent_names.dm | 15 + .../unit_tests/reagent_recipe_collisions.dm | 2 +- code/modules/unit_tests/ruin_placement.dm | 53 + code/modules/unit_tests/say.dm | 4 +- .../unit_tests/ship_outpost_placement.dm | 21 +- code/modules/unit_tests/species_unique_id.dm | 14 + code/modules/unit_tests/species_whitelists.dm | 2 +- .../modules/unit_tests/stack_singular_name.dm | 18 + code/modules/unit_tests/subsystem_init.dm | 2 +- .../unit_tests/subsystem_metric_sanity.dm | 12 +- code/modules/unit_tests/supply_pack.dm | 2 +- code/modules/unit_tests/timer_sanity.dm | 4 +- code/modules/unit_tests/unit_test.dm | 82 +- code/modules/vehicles/atv.dm | 42 +- code/modules/vending/_vending.dm | 10 +- code/modules/zombie/organs.dm | 2 +- html/changelogs/AutoChangeLog-pr-63276.yml | 4 + shiptest.dme | 15 +- .../tgui/interfaces/OperatingComputer.js | 3 + tools/build/build.js | 5 +- tools/merge-upstream-pull-request.sh | 10 +- tools/tgs_scripts/PreCompile.sh | 1 - 501 files changed, 33042 insertions(+), 22133 deletions(-) create mode 100644 .github/HARDDEL_GUIDE.md rename _maps/{RandomRuins/LavaRuins => deprecated/Ruins}/lavaland_biodome_beach.dmm (100%) create mode 100644 _maps/deprecated/Ruins/lavaland_surface_syndicate_base1.dmm rename _maps/{shuttles/misc => deprecated/Ships}/infiltrator_advanced.dmm (100%) create mode 100644 code/__DEFINES/atoms.dm delete mode 100644 code/controllers/subsystem/processing/fields.dm create mode 100644 code/datums/components/connect_containers.dm create mode 100644 code/datums/components/connect_range.dm create mode 100644 code/datums/proximity_monitor/field.dm rename code/{modules => datums/proximity_monitor}/fields/gravity.dm (74%) rename code/{modules => datums/proximity_monitor}/fields/peaceborg_dampener.dm (65%) rename code/{modules => datums/proximity_monitor}/fields/timestop.dm (92%) create mode 100644 code/datums/proximity_monitor/proximity_monitor.dm delete mode 100644 code/game/objects/effects/proximity.dm delete mode 100644 code/modules/fields/fields.dm delete mode 100644 code/modules/fields/turf_objects.dm create mode 100644 code/modules/unit_tests/README.md create mode 100644 code/modules/unit_tests/biome_lists.dm create mode 100644 code/modules/unit_tests/create_and_destroy.dm create mode 100644 code/modules/unit_tests/find_reference_sanity.dm create mode 100644 code/modules/unit_tests/planet_gen.dm create mode 100644 code/modules/unit_tests/reagent_names.dm create mode 100644 code/modules/unit_tests/ruin_placement.dm create mode 100644 code/modules/unit_tests/species_unique_id.dm create mode 100644 code/modules/unit_tests/stack_singular_name.dm create mode 100644 html/changelogs/AutoChangeLog-pr-63276.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 64a36fb4c17b..70f333da19f9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -350,6 +350,10 @@ This prevents nesting levels from getting deeper then they need to be. - [tgui/README.md](../tgui/README.md) - [tgui/tutorial-and-examples.md](../tgui/docs/tutorial-and-examples.md) +### Don't create code that hangs references + +This is part of the larger issue of hard deletes, read this file for more info: [Guide to Harddels](HARDDEL_GUIDE.md)) + ### Other Notes - Code should be modular where possible; if you are working on a new addition, then strongly consider putting it in its own file unless it makes sense to put it with similar ones (i.e. a new tool would go in the "tools.dm" file) diff --git a/.github/HARDDEL_GUIDE.md b/.github/HARDDEL_GUIDE.md new file mode 100644 index 000000000000..4790150ea0d2 --- /dev/null +++ b/.github/HARDDEL_GUIDE.md @@ -0,0 +1,265 @@ +# Hard Deletes +1. [What is hard deletion](#What-is-hard-deletion) +2. [Causes of hard deletes](#causes-of-hard-deletes) +3. [Detecting hard deletes](#detecting-hard-deletes) +4. [Techniques for fixing hard deletes](#techniques-for-fixing-hard-deletes) +5. [Help my code is erroring how fix](#help-my-code-is-erroring-how-fix) + +## What is Hard Deletion +Hard deletion is a very expensive operation that basically clears all references to some "thing" from memory. Objects that undergo this process are referred to as hard deletes, or simply harddels + +What follows is a discussion of the theory behind this, why we would ever do it, and the what we do to avoid doing it as often as possible + +I'm gonna be using words like references and garbage collection, but don't worry, it's not complex, just a bit hard to pierce + +### Why do we need to Hard Delete? + +Ok so let's say you're some guy called Jerry, and you're writing a programming language + +You want your coders to be able to pass around objects without doing a full copy. So you'll store the pack of data somewhere in memory + +```dm +/someobject + var/id = 42 + var/name = "some shit" +``` + +Then you want them to be able to pass that object into say a proc, without doing a full copy. So you let them pass in the object's location in memory instead +This is called passing something by reference + +```dm +someshit(someobject) //This isn't making a copy of someobject, it's passing in a reference to it +``` + +This of course means they can store that location in memory in another object's vars, or in a list, or whatever + +```dm +/datum + var/reference + +/proc/someshit(mem_location) + var/datum/some_obj = new() + some_obj.reference = mem_location +``` + +But what happens when you get rid of the object we're passing around references to? If we just cleared it out from memory, everything that holds a reference to it would suddenly be pointing to nowhere, or worse, something totally different! + +So then, you've gotta do something to clean up these references when you want to delete an object + +We could hold a list of references to everything that references us, but god, that'd get really expensive wouldn't it + +Why not keep count of how many times we're referenced then? If an object's ref count is ever 0, nothing whatsoever cares about it, so we can freely get rid of it + +But if something's holding onto a reference to us, we're not gonna have any idea where or what it is + +So I guess you should scan all of memory for that reference? + +```dm +del(someobject) //We now need to scan memory until we find the thing holding a ref to us, and clear it +``` + +This pattern is about how BYOND handles this problem of hanging references, or Garbage Collection + +It's not a broken system, but as you can imagine scanning all of memory gets expensive fast + +What can we do to help that? + +### How we can avoid hard deletes + +If hard deletion is so slow, we're gonna need to clean up all our references ourselves + +In our codebase we do this with `/datum/proc/Destroy()`, a proc called by `qdel()`, whose purpose I will explain later + +This procs only job is cleaning up references to the object it's called on. Nothing more, nothing else. Don't let me catch you giving it side effects + +There's a long long list of things this does, since we use it a TON. So I can't really give you a short description. It will always move the object to nullspace though + +## Causes Of Hard Deletes + +Now that you know the theory, let's go over what can actually cause hard deletes. Some of this is obvious, some of it's much less so. + +The BYOND reference has a list [Here](https://secure.byond.com/docs/ref/#/DM/garbage), but it's not a complete one + +* Stored in a var +* An item in a list, or associated with a list item +* Has a tag +* Is on the map (always true for turfs) +* Inside another atom's contents +* Inside an atom's vis_contents +* A temporary value in a still-running proc +* Is a mob with a key +* Is an image object attached to an atom + +Let's briefly go over the more painful ones yeah? + +### Sleeping procs + +Any proc that calls `sleep()`, `spawn()`, or anything that creates a seperate "thread" (not technically a thread, but it's the same in these terms. Not gonna cause any race conditions tho) will hang references to any var inside it. This includes the usr it started from, the src it was called on, and any vars created as a part of processing + +### Static vars + +`/static` and `/global` vars count for this too, they'll hang references just as well as anything. Be wary of this, these suckers can be a pain to solve + +### Range() and View() like procs + +Some internal BYOND procs will hold references to objects passed into them for a time after the proc is finished doing work, because they cache the returned info to make some code faster. You should never run into this issue, since we wait for what should be long enough to avoid this issue as a part of garbage collection + +This is what `qdel()` does by the by, it literally just means queue deletion. A reference to the object gets put into a queue, and if it still exists after 5 minutes or so, we hard delete it + +### Walk() procs + +Calling `walk()` on something will put it in an internal queue, which it'll remain in until `walk(thing, 0)` is called on it, which removes it from the queue + +This sort is very cheap to harddel, since BYOND prioritizes checking this queue first when it's clearing refs, but it should be avoided since it causes false positives + +You can read more about how BYOND prioritizes these things [Here](https://www.patreon.com/posts/diving-for-35855766) + +## Detecting Hard Deletes + +For very simple hard deletes, simple inspection should be enough to find them. Look at what the object does during `Initialize()`, and see if it's doing anything it doesn't undo later. +If that fails, search the object's typepath, and look and see if anything is holding a reference to it without regard for the object deleting + +BYOND currently doesn't have the capability to give us information about where a hard delete is. Fortunately we can search for most all of then ourselves. +The procs to perform this search are hidden behind compile time defines, since they'd be way too risky to expose to admin button pressing + +If you're having issues solving a harddel and want to perform this check yourself, go to `_compile_options.dm` and uncomment `TESTING`, `REFERENCE_TRACKING`, and `GC_FAILURE_HARD_LOOKUP` + +You can read more about what each of these do in that file, but the long and short of it is if something would hard delete our code will search for the reference (This will look like your game crashing, just hold out) and print information about anything it finds to the runtime log, which you can find inside the round folder inside `/data/logs/year/month/day` + +It'll tell you what object is holding the ref if it's in an object, or what pattern of list transversal was required to find the ref if it's hiding in a list of some sort + +## Techniques For Fixing Hard Deletes + +Once you've found the issue, it becomes a matter of making sure the ref is cleared as a part of Destroy(). I'm gonna walk you through a few patterns and discuss how you might go about fixing them + +### Our Tools + +First and simplest we have `Destroy()`. Use this to clean up after yourself for simple cases + +```dm +/someobject/Initialize() + . = ..() + GLOB.somethings += src //We add ourselves to some global list + +/someobject/Destroy() + GLOB.somethings -= src //So when we Destroy() clean yourself from the list + return ..() +``` + +Next, and slightly more complex, pairs of objects that reference each other + +This is helpful when for cases where both objects "own" each other + +```dm +/someobject + var/someotherobject/buddy + +/someotherobject + var/someobject/friend + +/someobject/Initialize() + if(!buddy) + buddy = new() + buddy.friend = src + +/someotherobject/Initialize() + if(!friend) + friend = new() + friend.buddy = src + +/someobject/Destroy() + if(buddy) + buddy.friend = null //Make sure to clear their ref to you + buddy = null //We clear our ref to them to make sure nothing goes wrong + +/someotherobject/Destroy() + if(friend) + friend.buddy = null //Make sure to clear their ref to you + friend = null //We clear our ref to them to make sure nothing goes wrong +``` + +Something similar can be accomplished with `QDELETED()`, a define that checks to see if something has started being `Destroy()`'d yet, and `QDEL_NULL()`, a define that `qdel()`'s a var and then sets it to null + +Now let's discuss something a bit more complex, weakrefs + +You'll need a bit of context, so let's do that now + +BYOND has an internal bit of behavior that looks like this + +`var/string = "\ref[someobject]"` + +This essentially gets that object's position in memory directly. Unlike normal references, this doesn't count for hard deletes. You can retrieve the object in question by using `locate()` + +`var/someobject/someobj = locate(string)` + +This has some flaws however, since the bit of memory we're pointing to might change, which would cause issues. Fortunately we've developed a datum to handle worrying about this for you, `/datum/weakref` + +You can create one using the `WEAKREF()` proc, and use weakref.resolve() to retrieve the actual object + +This should be used for things that your object doesn't "own", but still cares about + +For instance, a paper bin would own the paper inside it, but the paper inside it would just hold a weakref to the bin + +There's no need to clean these up, just make sure you account for it being null, since it'll return that if the object doesn't exist or has been queued for deletion + +```dm +/someobject + var/datum/weakref/our_coin + +/someobject/proc/set_coin(/obj/item/coin/new_coin) + our_coin = WEAKREF(new_coin) + +/someobject/proc/get_value() + if(!our_coin) + return 0 + + var/obj/item/coin/potential_coin = our_coin.resolve() + if(!potential_coin) + our_coin = null //Remember to clear the weakref if we get nothing + return 0 + return potential_coin.value +``` + +Now, for the worst case scenario + +Let's say you've got a var that's used too often to be weakref'd without making the code too expensive + +You can't hold a paired reference to it because it's not like it would ever care about you outside of just clearing the ref + +So then, we want to temporarily remember to clear a reference when it's deleted + +This is where I might lose you, but we're gonna use signals + +`qdel()`, the proc that sets off this whole deletion business, sends a signal called `COMSIG_PARENT_QDELETING` + +We can listen for that signal, and if we hear it clear whatever reference we may have + +Here's an example + +```dm +/somemob + var/mob/target + +/somemob/proc/set_target(new_target) + if(target) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) //We need to make sure any old signals are cleared + target = new_target + if(target) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_target) //Call clear_target if target is ever qdel()'d + +/somemob/proc/clear_target(datum/source) + SIGNAL_HANDLER + set_target(null) +``` + +This really should be your last resort, since signals have some limitations. If some subtype of somemob also registered for parent_qdeleting on the same target you'd get a runtime, since signals don't support it + +But if you can't do anything else for reasons of conversion ease, or hot code, this will work + +## Help My Code Is Erroring How Fix + +First, do a quick check. + +Are you doing anything to the object in `Initialize()` that you don't undo in `Destroy()`? I don't mean like, setting its name, but are you adding it to any lists, stuff like that + +If this fails, you're just gonna have to read over this doc. You can skip the theory if you'd like, but it's all pretty important for having an understanding of this problem diff --git a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm index d33b5f21f9ef..c0fc2fcfc956 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm @@ -1,75 +1,41 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/tree/jungle{ - icon_state = "tree10" - }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"ab" = ( +/obj/structure/chair{ + dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"af" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"ah" = ( -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, +"ac" = ( +/obj/structure/spacevine, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"ai" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"ag" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) "aj" = ( /turf/open/floor/mineral/plastitanium{ icon_state = "plastitanium_dam2" }, /area/ruin/jungle/starport) -"am" = ( -/obj/structure/flora/junglebush/large, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "an" = ( /obj/structure/door_assembly, /obj/structure/spider/stickyweb, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"ap" = ( -/obj/effect/decal/cleanable/ash, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"aq" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) -"ar" = ( -/obj/machinery/power/floodlight{ - anchored = 1; - state_open = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "0-8" +"as" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/girder/displaced, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "av" = ( /obj/structure/spider/stickyweb, @@ -77,27 +43,18 @@ icon_state = "wood-broken4" }, /area/ruin/jungle/starport) -"ax" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"ay" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"az" = ( +/obj/structure/railing, +/turf/open/floor/plasteel/stairs{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) -"aC" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"aD" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "aF" = ( /obj/structure/girder, @@ -105,12 +62,15 @@ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"aG" = ( +"aH" = ( +/obj/structure/spider/stickyweb, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"aJ" = ( /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) "aK" = ( /obj/structure/spacevine, @@ -123,33 +83,49 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"aS" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ +"aO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"aU" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ +"aP" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"aQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"aW" = ( +"aT" = ( +/obj/effect/decal/cleanable/glass, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"aX" = ( -/obj/structure/spacevine, +"aY" = ( +/obj/structure/railing{ + dir = 4 + }, /obj/structure/spider/stickyweb, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -157,9 +133,10 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/vault, /area/ruin/jungle/starport) -"bb" = ( -/obj/item/stack/sheet/metal, -/turf/open/floor/plating/rust, +"bd" = ( +/turf/open/floor/plasteel/stairs{ + dir = 8 + }, /area/overmap_encounter/planetoid/jungle/explored) "bf" = ( /obj/structure/railing{ @@ -170,40 +147,31 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) +"bh" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) "bi" = ( /obj/machinery/door/airlock/hatch, /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/ruin/jungle/starport) -"bj" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"bk" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland0" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"bo" = ( -/obj/machinery/telecomms/processor, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"bp" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +"bm" = ( +/obj/structure/railing{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"br" = ( -/obj/structure/spacevine, -/obj/structure/flora/grass/jungle, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"bn" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spider/cocoon, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) "bs" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8 @@ -213,71 +181,61 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"bv" = ( -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"bt" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"bw" = ( -/obj/structure/railing{ - dir = 8 +"bu" = ( +/obj/structure/flora/rock/pile, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"bz" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/flora/junglebush, -/turf/open/floor/plating/grass/jungle{ +"by" = ( +/obj/structure/spacevine, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"bB" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 8 +"bA" = ( +/obj/structure/railing{ + dir = 10 }, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 8 +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"bE" = ( -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"bD" = ( +/obj/structure/railing, +/turf/open/floor/plasteel/stairs/old{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) "bF" = ( /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"bG" = ( -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 - }, -/turf/open/floor/concrete/reinforced{ +"bH" = ( +/obj/item/chair, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"bK" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"bI" = ( -/obj/structure/spacevine/dense, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-10" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"bL" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 }, +/obj/structure/spacevine, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "bM" = ( /obj/effect/decal/cleanable/blood/drip, @@ -289,110 +247,115 @@ "bN" = ( /turf/closed/wall/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"bQ" = ( -/obj/structure/girder/displaced, -/turf/open/floor/concrete/slab_1{ +"bP" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"bR" = ( -/turf/closed/wall/concrete/reinforced, -/area/overmap_encounter/planetoid/jungle/explored) -"bS" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 1 +"bT" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/obj/structure/closet/secure_closet/engineering_welding{ - anchored = 1 +/area/overmap_encounter/planetoid/jungle/explored) +"bU" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"cd" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +"bX" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"cg" = ( -/obj/structure/sign/syndicate{ - pixel_x = 32 - }, +"bZ" = ( +/obj/effect/decal/cleanable/vomit/old, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ci" = ( -/obj/effect/decal/cleanable/shreds, -/obj/item/stack/sheet/metal, -/turf/open/floor/plating/grass/jungle{ +"ce" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"cj" = ( -/obj/structure/reagent_dispensers/foamtank, -/turf/open/floor/concrete/slab_1{ +"cn" = ( +/obj/structure/spacevine, +/obj/structure/spider/stickyweb, +/obj/structure/flora/grass/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ck" = ( +"cp" = ( +/obj/structure/spacevine, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"cq" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush/b, /obj/structure/flora/grass/jungle, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"cs" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/concrete/slab_1{ +"cu" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ct" = ( -/obj/structure/railing{ +"cv" = ( +/obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/turf/open/floor/concrete/slab_1{ +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"cy" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old{ + icon_state = "floor5-old" + }, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"cB" = ( -/turf/open/floor/plasteel/stairs{ - dir = 1 +"cz" = ( +/obj/structure/sign/syndicate{ + pixel_x = 32 }, -/area/overmap_encounter/planetoid/jungle/explored) -"cC" = ( /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"cI" = ( -/obj/effect/decal/cleanable/ash/large, +"cE" = ( +/obj/effect/decal/cleanable/shreds, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"cJ" = ( -/obj/structure/spacevine, -/obj/structure/flora/grass/jungle, -/obj/structure/flora/junglebush/b, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"cK" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ - dir = 8 - }, -/turf/open/floor/plating/rust, +"cF" = ( +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"cN" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"cH" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) "cO" = ( /obj/structure/cable{ @@ -400,16 +363,6 @@ }, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"cP" = ( -/obj/structure/table{ - name = "officer's table"; - desc = "A square piece of metal standing on four metal legs. It can not move. This one feels more important than the others" - }, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "cQ" = ( /obj/machinery/shower{ dir = 4; @@ -427,65 +380,92 @@ icon_state = "platingdmg1" }, /area/ruin/jungle/starport) -"cU" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"cV" = ( -/obj/structure/railing/corner, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "cW" = ( /obj/machinery/computer/security{ dir = 4 }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"cY" = ( -/obj/structure/cable{ - icon_state = "4-9" +"cX" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"dk" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, -/turf/open/floor/plasteel, +"da" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland9" + }, /area/overmap_encounter/planetoid/jungle/explored) -"dl" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/grass/jungle, +"dc" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"dd" = ( +/obj/structure/flora/rock/jungle, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"dm" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 - }, +"df" = ( /obj/structure/spacevine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"dg" = ( +/obj/structure/spider/stickyweb, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"dp" = ( -/obj/item/stack/cable_coil/cut/red, -/obj/effect/decal/cleanable/glass, -/obj/structure/girder/displaced, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam2" +"dj" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 4 + }, +/obj/structure/spacevine, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"do" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"dr" = ( +/obj/effect/decal/cleanable/plastic, +/turf/open/floor/concrete{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"dt" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/item/shard, +/turf/open/floor/plasteel/stairs/left, +/area/overmap_encounter/planetoid/jungle/explored) +"du" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/medium{ + dir = 4 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"dv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "dw" = ( @@ -494,11 +474,20 @@ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"dy" = ( -/obj/structure/girder, -/obj/item/stack/sheet/mineral/plastitanium, -/obj/item/stack/sheet/mineral/plastitanium, -/turf/open/floor/plating/rust, +"dx" = ( +/turf/open/floor/plasteel/stairs, +/area/overmap_encounter/planetoid/jungle/explored) +"dz" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/railing, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"dA" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "dB" = ( /obj/structure/table, @@ -511,58 +500,45 @@ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"dE" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"dJ" = ( -/obj/structure/cable{ - icon_state = "6-9" - }, +"dF" = ( /obj/structure/spacevine, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"dP" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/jungle/starport) -"dQ" = ( -/obj/structure/railing{ +"dI" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/medium{ dir = 1 }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"dR" = ( -/turf/open/floor/plasteel/stairs/right, +"dO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"dT" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/junglebush/b, -/turf/open/floor/plating/grass/jungle{ +"dP" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/jungle/starport) +"dS" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"dU" = ( -/obj/effect/decal/cleanable/molten_object, -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 - }, +"dV" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/obj/item/stack/cable_coil/cut/red, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"dY" = ( -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ +"dW" = ( +/obj/effect/turf_decal/arrows, +/obj/structure/spacevine, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -581,90 +557,86 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"ef" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/concrete/slab_1{ +"ec" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ej" = ( -/obj/structure/railing, -/turf/open/water/jungle, +"ed" = ( +/turf/closed/wall, /area/overmap_encounter/planetoid/jungle/explored) -"ek" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle{ +"eh" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/junglebush/c, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"em" = ( -/obj/structure/cable{ - icon_state = "6-9" +"ei" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/spider/stickyweb, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"en" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +/turf/open/floor/plasteel/stairs{ + dir = 4 }, /area/overmap_encounter/planetoid/jungle/explored) -"eo" = ( -/obj/effect/turf_decal/industrial/traffic{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/concrete{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"eq" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"er" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree4" - }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, +"ep" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"es" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/junglebush/large, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"et" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, /area/overmap_encounter/planetoid/jungle/explored) -"eu" = ( -/obj/structure/spider/stickyweb, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "ev" = ( /obj/machinery/light/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) +"ew" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/nurse, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "ex" = ( /obj/structure/curtain, /turf/open/floor/plasteel, /area/ruin/jungle/starport) +"eA" = ( +/obj/structure/flora/junglebush/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "eB" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"eJ" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 4 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"eC" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland7" }, /area/overmap_encounter/planetoid/jungle/explored) +"eG" = ( +/turf/closed/wall/mineral/plastitanium, +/area/overmap_encounter/planetoid/jungle/explored) "eK" = ( /obj/structure/window/plasma/reinforced{ dir = 1 @@ -677,12 +649,18 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport) -"eP" = ( -/obj/structure/railing/corner{ - dir = 8 +"eO" = ( +/obj/structure/railing{ + dir = 1 }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"eQ" = ( +/obj/structure/railing, /obj/structure/spacevine/dense, -/turf/open/floor/concrete/reinforced{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -691,12 +669,54 @@ /obj/item/toy/eightball, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"fb" = ( +"eU" = ( +/obj/structure/spacevine, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/flora/rock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"eV" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland9" + icon_state = "wasteland2" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"eZ" = ( +/obj/item/chair, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"fc" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing{ + dir = 4 }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"fd" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"fg" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "fi" = ( /obj/machinery/door/airlock{ @@ -708,39 +728,45 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/jungle/starport) -"fj" = ( +"fl" = ( +/obj/structure/spacevine, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"fn" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"fp" = ( +/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"fs" = ( -/obj/structure/railing{ - dir = 4 +"ft" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"fu" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) "fv" = ( /obj/machinery/computer/crew{ dir = 4 }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"fw" = ( -/obj/structure/railing{ - dir = 4 +"fx" = ( +/obj/item/geiger_counter, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/concrete{ + light_range = 2 }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ +/area/overmap_encounter/planetoid/jungle/explored) +"fz" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -749,33 +775,41 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"fG" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 10 +"fB" = ( +/obj/machinery/atmospherics/components/binary/valve{ + dir = 1 }, -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, -/turf/open/water/jungle, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"fO" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/reinforced{ +"fC" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"fP" = ( +"fD" = ( /obj/item/chair, -/obj/structure/spider/stickyweb, +/obj/item/stack/cable_coil/cut/red, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"fS" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel/stairs/right{ - dir = 4 +"fE" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"fV" = ( +"fJ" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/donkpockets, /obj/effect/spawner/lootdrop/donkpockets, @@ -783,6 +817,17 @@ /obj/effect/spawner/lootdrop/donkpockets, /turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) +"fL" = ( +/turf/open/floor/plasteel/stairs/left{ + dir = 1 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"fT" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) "fW" = ( /obj/effect/turf_decal/industrial/warning/corner{ dir = 4 @@ -799,160 +844,141 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/ruin/jungle/starport/plasma) -"fX" = ( -/obj/effect/decal/remains/human, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"fY" = ( +"fZ" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, /area/overmap_encounter/planetoid/jungle/explored) -"gb" = ( -/obj/structure/railing{ - dir = 10 +"gf" = ( +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 8 }, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"ge" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" +"gi" = ( +/obj/effect/turf_decal/industrial/traffic/corner{ + dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"gg" = ( -/obj/effect/decal/cleanable/ash/large, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gh" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating/grass{ - desc = "A patch of grass. It looks well manicured"; +"gn" = ( +/obj/structure/spacevine, +/obj/structure/spacevine, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gj" = ( -/obj/structure/railing{ - dir = 6 +"gp" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"gk" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"gl" = ( -/obj/item/chair, -/obj/structure/spider/stickyweb, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"gn" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"go" = ( -/obj/structure/spider/stickyweb, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gs" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/junglebush, +"gv" = ( +/obj/structure/spacevine/dense, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gt" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/spacevine, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"gC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"gw" = ( -/obj/effect/decal/cleanable/ash/large, +"gG" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland4" +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gx" = ( -/obj/effect/decal/cleanable/ash, -/turf/open/floor/plating/rust, +"gN" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"gA" = ( +"gO" = ( /obj/item/ammo_casing/caseless/rocket{ desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/structure/rack, +/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"gE" = ( -/obj/structure/cable{ - icon_state = "2-9" +"gP" = ( +/obj/structure/fluff/fokoff_sign{ + icon_state = "fokrads"; + desc = "A crudely made sign with the universal radiation hazard symbol painted onto it." }, -/turf/open/floor/concrete/reinforced{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gI" = ( -/obj/structure/railing, -/turf/open/floor/plasteel/stairs{ +"gR" = ( +/obj/effect/turf_decal/industrial/stand_clear{ dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"gJ" = ( -/obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 +/obj/structure/railing/corner{ + dir = 4 }, -/turf/open/water/jungle, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"gK" = ( -/obj/structure/railing/corner{ - dir = 8 +"gT" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 }, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gM" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/railing, -/turf/open/floor/concrete/reinforced{ +"gU" = ( +/obj/effect/decal/cleanable/shreds, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"gQ" = ( -/obj/structure/flora/rock, +"gV" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" + icon_state = "wasteland4" }, /area/overmap_encounter/planetoid/jungle/explored) -"gZ" = ( -/obj/structure/chair{ +"gW" = ( +/turf/open/floor/plasteel/stairs/left, +/area/overmap_encounter/planetoid/jungle/explored) +"gX" = ( +/obj/effect/turf_decal/borderfloor{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"ha" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree9" - }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"gY" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" }, /area/overmap_encounter/planetoid/jungle/explored) "hb" = ( @@ -980,56 +1006,40 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"hi" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 8; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = 26 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, +"hf" = ( +/obj/item/stack/sheet/metal, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"hl" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, +"hh" = ( +/obj/structure/spacevine, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"ho" = ( -/obj/structure/girder/displaced, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"hj" = ( +/obj/structure/cable{ + icon_state = "1-6" }, -/area/overmap_encounter/planetoid/jungle/explored) -"hq" = ( -/obj/structure/railing{ - dir = 2 +/obj/structure/cable{ + icon_state = "1-10" }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/slab_1{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"hr" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"hs" = ( -/obj/effect/turf_decal/industrial/warning{ +"hk" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt{ dir = 4 }, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"hp" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, /area/overmap_encounter/planetoid/jungle/explored) "ht" = ( @@ -1039,43 +1049,10 @@ /obj/machinery/light/small/broken/directional/north, /turf/open/floor/plasteel/patterned, /area/ruin/jungle/starport) -"hu" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"hv" = ( +"hy" = ( +/obj/effect/decal/remains/human, /obj/structure/spider/stickyweb, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"hw" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"hB" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plasteel/stairs/left, -/area/overmap_encounter/planetoid/jungle/explored) -"hC" = ( -/obj/item/stack/cable_coil/cut/red, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) "hE" = ( /obj/structure/cable{ @@ -1083,14 +1060,25 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"hG" = ( -/obj/structure/railing{ - dir = 6 +"hF" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"hH" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, +/area/overmap_encounter/planetoid/jungle/explored) +"hI" = ( +/obj/effect/turf_decal/atmos/plasma, /obj/structure/railing/corner{ - pixel_x = -23 + dir = 1 }, -/turf/open/water/jungle, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "hJ" = ( /obj/machinery/vending/games, @@ -1105,32 +1093,35 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/jungle/starport) +"hM" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "hN" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ruin/jungle/starport) -"hP" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 +"hO" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, +/area/overmap_encounter/planetoid/jungle/explored) +"hR" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"hT" = ( -/obj/effect/decal/cleanable/plastic, +"hS" = ( +/obj/structure/spider/stickyweb, /obj/effect/decal/cleanable/glass, /turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"hV" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 8 + icon_state = "panelscorched" }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "hW" = ( /obj/machinery/computer/mech_bay_power_console{ @@ -1138,31 +1129,37 @@ }, /turf/open/floor/vault, /area/ruin/jungle/starport) -"hX" = ( -/obj/structure/flora/junglebush, -/obj/structure/flora/junglebush/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"hY" = ( -/obj/structure/flora/rock/jungle, +"hZ" = ( /obj/structure/spider/stickyweb, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/medium, /area/overmap_encounter/planetoid/jungle/explored) "ib" = ( /obj/item/stack/sheet/metal, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plasteel, /area/ruin/jungle/starport) +"ic" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) "id" = ( /obj/structure/spacevine, /turf/open/floor/mineral/plastitanium{ icon_state = "plastitanium_dam5" }, /area/ruin/jungle/starport) +"if" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) "ig" = ( /obj/effect/decal/cleanable/vomit/old, /obj/machinery/light/directional/east, @@ -1174,153 +1171,77 @@ }, /turf/open/floor/engine/hull, /area/ruin/jungle/starport) -"ij" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/nurse, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"ik" = ( -/obj/effect/decal/cleanable/dirt, +"ii" = ( /obj/structure/spacevine, -/obj/structure/cable{ - icon_state = "2-5" +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/carpet/black{ - name = "Door mat"; - desc = "Don't forget to get the dirt off you before going in!" +/area/overmap_encounter/planetoid/jungle/explored) +"il" = ( +/obj/effect/decal/cleanable/glass/plasma, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"in" = ( -/obj/structure/railing{ - dir = 1 +"io" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland7" }, +/area/overmap_encounter/planetoid/jungle/explored) +"ip" = ( /obj/structure/railing, -/turf/open/floor/plasteel/stairs{ +/obj/effect/turf_decal/industrial/warning{ dir = 8 }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"io" = ( -/turf/closed/wall/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) -"iq" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/structure/railing{ - dir = 1 - }, +"ir" = ( /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"is" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/structure/railing/corner{ - dir = 8; - pixel_x = 23 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"iu" = ( -/obj/structure/table{ - name = "officer's table"; - desc = "A square piece of metal standing on four metal legs. It can not move. This one feels more important than the others" - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "iz" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"iD" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"iE" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 8 - }, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"iH" = ( -/obj/effect/decal/cleanable/glass/plasma, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"iJ" = ( -/obj/structure/railing, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"iL" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 4 - }, -/turf/open/floor/vault, -/area/overmap_encounter/planetoid/jungle/explored) -"iN" = ( -/obj/structure/table/reinforced, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel/dark, -/area/overmap_encounter/planetoid/jungle/explored) -"iO" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"iB" = ( +/obj/effect/decal/cleanable/molten_object/large, +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 }, -/area/overmap_encounter/planetoid/jungle/explored) -"iU" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 }, /area/overmap_encounter/planetoid/jungle/explored) -"iW" = ( -/obj/effect/turf_decal/box/corners{ +"iC" = ( +/obj/structure/railing{ dir = 8 }, -/turf/open/floor/concrete/slab_1{ +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"iX" = ( -/obj/structure/spacevine/dense, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"iM" = ( +/turf/open/floor/plasteel/stairs/left{ + dir = 4 }, /area/overmap_encounter/planetoid/jungle/explored) -"jc" = ( +"je" = ( /obj/structure/railing/corner, -/obj/effect/decal/cleanable/oil, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"jd" = ( /obj/structure/spacevine, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"je" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) "jf" = ( /obj/structure/table, /obj/item/toy/clockwork_watch, @@ -1332,134 +1253,155 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/jungle/starport) -"jl" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, +"ji" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"jn" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 +"jj" = ( +/obj/effect/turf_decal/arrows, +/obj/structure/spacevine/dense, +/turf/open/floor/concrete{ + light_range = 2 }, -/turf/open/floor/concrete/slab_1{ +/area/overmap_encounter/planetoid/jungle/explored) +"jk" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"jo" = ( -/turf/open/floor/plasteel/stairs/right{ - dir = 1 +"jm" = ( +/obj/structure/frame/computer{ + dir = 4 }, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) -"jq" = ( -/obj/structure/spacevine, -/obj/structure/flora/rock/jungle, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"jr" = ( +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug" }, /area/overmap_encounter/planetoid/jungle/explored) -"jt" = ( +"js" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, +/obj/structure/spacevine, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"jw" = ( -/obj/structure/spider/stickyweb, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/plasteel, +"ju" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"jx" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" +"jv" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"jE" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spacevine/dense, +"jx" = ( +/obj/structure/flora/junglebush/c, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"jH" = ( -/turf/open/floor/plasteel/stairs/left, -/area/overmap_encounter/planetoid/jungle/explored) -"jK" = ( -/obj/structure/chair/office{ - dir = 1 +"jy" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"jP" = ( -/obj/structure/table_frame, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"jQ" = ( +"jz" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland3" +/turf/open/floor/plasteel/stairs/right{ + dir = 4 }, /area/overmap_encounter/planetoid/jungle/explored) -"jR" = ( -/obj/structure/chair/office{ - dir = 8 +"jA" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam4" }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"jS" = ( -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" +/area/overmap_encounter/planetoid/jungle/explored) +"jB" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/borderfloor{ + dir = 5 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"jU" = ( +"jJ" = ( +/obj/structure/spacevine/dense, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "5-8" }, -/obj/structure/spacevine, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"jV" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 8 +"jK" = ( +/obj/structure/chair/office{ + dir = 1 }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"jM" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"jX" = ( -/obj/structure/spacevine, -/obj/structure/flora/rock/jungle, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"jN" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"jZ" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plasteel/stairs{ - dir = 4 +"jO" = ( +/obj/structure/spacevine, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"kc" = ( -/obj/effect/turf_decal/arrows{ +"jR" = ( +/obj/structure/chair/office{ dir = 8 }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"jT" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, /area/overmap_encounter/planetoid/jungle/explored) "kf" = ( /turf/open/floor/plating/rust, /area/ruin/jungle/starport) +"kg" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" + }, +/area/overmap_encounter/planetoid/jungle/explored) "kh" = ( /obj/machinery/atmospherics/components/unary/portables_connector{ dir = 4 @@ -1467,109 +1409,115 @@ /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"kl" = ( -/obj/structure/chair{ - dir = 4 +"ki" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plasteel/grimy, -/area/ruin/jungle/starport) -"kn" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, -/area/ruin/jungle/starport) -"ko" = ( /obj/structure/spacevine/dense, -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"kr" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"kC" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"kD" = ( +"kj" = ( /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/obj/structure/spider/cocoon{ + icon_state = "cocoon3" }, -/area/overmap_encounter/planetoid/jungle/explored) -"kE" = ( -/obj/machinery/door/airlock/glass{ - dir = 4; - pixel_y = 0 +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"kF" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" +"kl" = ( +/obj/structure/chair{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"kI" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) +"km" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-9" }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"kN" = ( -/obj/structure/spacevine, -/turf/open/floor/mineral/plastitanium, +"kn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"kO" = ( +"kt" = ( +/obj/effect/decal/remains/human, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"kv" = ( /obj/structure/railing{ - dir = 4 + dir = 1 }, /turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"kQ" = ( -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/obj/effect/decal/cleanable/molten_object, +"kw" = ( +/obj/effect/decal/cleanable/ash/large, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" + icon_state = "wasteland5" }, /area/overmap_encounter/planetoid/jungle/explored) -"kS" = ( -/obj/structure/rack, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/mixed, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plasteel/dark, +"kx" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/item/extinguisher/advanced, +/obj/effect/turf_decal/borderfloor{ + dir = 1 + }, +/obj/item/geiger_counter, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"kV" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 8 +"kz" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/floor/concrete/slab_1{ +/area/overmap_encounter/planetoid/jungle/explored) +"kG" = ( +/obj/structure/spacevine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"kW" = ( +"kH" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/remains/human, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"la" = ( +"kK" = ( +/obj/structure/door_assembly, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"kL" = ( +/obj/effect/turf_decal/number/zero{ + pixel_x = -7; + pixel_y = 32 + }, +/obj/effect/turf_decal/number/three{ + pixel_x = 5; + pixel_y = 32 + }, /obj/structure{ desc = "A devastating strike weapon of times past. The mountings seem broken now."; dir = 4; @@ -1577,50 +1525,52 @@ icon_state = "mecha_missilerack_six"; name = "ancient missile rack"; pixel_x = -26; - pixel_y = -5 + pixel_y = 11 }, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"lf" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"lg" = ( -/obj/machinery/door/airlock{ - dir = 4 - }, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plasteel/tech/techmaint, +"kM" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"lh" = ( -/obj/structure/railing/corner, +"kN" = ( /obj/structure/spacevine, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport) +"kP" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"li" = ( -/obj/structure/door_assembly, +"kX" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"lj" = ( -/obj/structure/railing/corner{ - dir = 8 +"lb" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 6 }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"lk" = ( -/obj/effect/decal/cleanable/insectguts, +"ll" = ( +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/obj/effect/decal/cleanable/molten_object, +/obj/structure/spacevine, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" + icon_state = "wasteland_dug" }, /area/overmap_encounter/planetoid/jungle/explored) "lm" = ( @@ -1630,103 +1580,51 @@ icon_state = "platingdmg1" }, /area/ruin/jungle/starport) +"ln" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "lo" = ( /obj/item/stack/cable_coil/cut/red, /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"lr" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"lt" = ( -/obj/effect/turf_decal/borderfloor/corner{ - dir = 4 - }, -/obj/structure/spacevine, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"lE" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"lF" = ( -/obj/machinery/processor, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"lG" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"lI" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/mineral/plastitanium, -/area/ruin/jungle/starport/tower) -"lL" = ( -/obj/item/rack_parts, -/obj/structure/girder/displaced, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"lO" = ( -/obj/structure/spacevine, -/obj/structure/spider/stickyweb, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ +"lp" = ( +/obj/item/geiger_counter, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"lQ" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 8 - }, -/obj/structure/railing, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"lR" = ( -/obj/structure/mecha_wreckage/ripley/firefighter, +"ls" = ( +/obj/machinery/autolathe, /turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"lS" = ( -/obj/structure/spacevine, -/obj/structure/spider/stickyweb, +"lu" = ( +/obj/structure/flora/junglebush, /obj/structure/flora/grass/jungle, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"lW" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/obj/item/stack/sheet/mineral/plastitanium, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"lX" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ +"lw" = ( +/obj/effect/turf_decal/box/corners{ dir = 8 }, -/turf/open/floor/engine/hull, -/area/overmap_encounter/planetoid/jungle/explored) -"lY" = ( -/obj/machinery/door/airlock/glass, -/turf/open/floor/plasteel/tech/techmaint, -/area/overmap_encounter/planetoid/jungle/explored) -"ma" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/concrete/reinforced{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"mb" = ( -/obj/effect/decal/cleanable/dirt/dust, +"ly" = ( +/obj/structure/spacevine, /obj/structure/cable{ icon_state = "1-2" }, @@ -1734,139 +1632,230 @@ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"md" = ( -/obj/structure/closet/firecloset/full{ - anchored = 1 - }, -/obj/item/extinguisher/advanced, -/obj/structure/railing{ - dir = 10 - }, +"lB" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/glass, /obj/structure/spider/stickyweb, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam2" }, /area/overmap_encounter/planetoid/jungle/explored) -"mh" = ( -/obj/structure/spacevine, -/obj/structure/flora/rock/jungle, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"lD" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" }, -/area/overmap_encounter/planetoid/jungle/explored) -"mi" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel/stairs/medium{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"mn" = ( -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" +"lG" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, -/turf/open/floor/plating/dirt/jungle{ +/area/overmap_encounter/planetoid/jungle/explored) +"lI" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport/tower) +"lM" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"mo" = ( -/obj/machinery/suit_storage_unit/industrial/atmos_firesuit, -/obj/item/watertank/atmos, -/turf/open/floor/vault, +"lU" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"mp" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +"lZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/spacevine, +/obj/structure/cable{ + icon_state = "2-5" + }, +/turf/open/floor/carpet/black{ + name = "Door mat"; + desc = "Don't forget to get the dirt off you before going in!" }, /area/overmap_encounter/planetoid/jungle/explored) -"mr" = ( -/obj/effect/turf_decal/arrows{ +"mc" = ( +/obj/structure/railing{ dir = 8 }, /obj/structure/spacevine, -/turf/open/floor/plating/rust, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"me" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"ms" = ( +"mg" = ( +/obj/structure/spacevine/dense, /obj/structure/flora/rock/jungle, -/obj/structure/flora/grass/jungle, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"mv" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/nurse, -/turf/open/floor/plasteel, -/area/ruin/jungle/starport) +"mj" = ( +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"mk" = ( +/obj/item/rack_parts, +/obj/structure/girder/displaced, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"mq" = ( +/obj/item/shard, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"mu" = ( +/obj/structure/cable{ + icon_state = "4-10" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "mw" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"mB" = ( -/obj/structure/flora/rock/pile, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +"mz" = ( +/obj/machinery/telecomms/processor, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam2" }, /area/overmap_encounter/planetoid/jungle/explored) -"mK" = ( -/obj/structure/railing, -/obj/structure/spacevine, +"mA" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/spacevine/dense, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"mP" = ( -/obj/item/watertank/atmos, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"mD" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"mQ" = ( -/obj/structure/flora/rock/jungle, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"mE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs/medium{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) -"mX" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ +"mF" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 8 }, -/obj/structure/window/plasma/reinforced{ +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"mG" = ( +/obj/machinery/door/airlock/glass{ dir = 4 }, +/obj/structure/barricade/wooden/crude, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"na" = ( -/obj/effect/turf_decal/industrial/traffic/corner{ - dir = 1 +"mI" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, -/turf/open/floor/concrete{ +/area/overmap_encounter/planetoid/jungle/explored) +"mJ" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/obj/item/stack/sheet/mineral/plastitanium, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ng" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 +"mS" = ( +/obj/structure/table, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"mU" = ( +/obj/structure/cable{ + icon_state = "5-10" }, -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 8; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = 26 +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/turf/open/floor/concrete/slab_1{ +/area/overmap_encounter/planetoid/jungle/explored) +"mW" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"nb" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"nc" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"ne" = ( +/obj/structure/spacevine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"nh" = ( -/obj/structure/table, +"nf" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 1 + }, +/obj/structure/closet/secure_closet/engineering_welding{ + anchored = 1 + }, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "ni" = ( @@ -1874,6 +1863,21 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) +"nj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"nk" = ( +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/overmap_encounter/planetoid/jungle/explored) "nm" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -1881,64 +1885,79 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/ruin/jungle/starport) -"np" = ( -/obj/structure/railing{ - dir = 8 +"nq" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/grass/jungle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/plasteel/stairs/old, -/area/overmap_encounter/planetoid/jungle/explored) -"nt" = ( -/obj/structure/door_assembly, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"nz" = ( -/obj/structure/sign/syndicate{ - pixel_y = -32 +"nr" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 }, +/obj/structure/spacevine/dense, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"nD" = ( -/obj/effect/turf_decal/number/zero{ - pixel_x = -7; - pixel_y = 32 +"ns" = ( +/turf/open/floor/plasteel/stairs{ + dir = 1 }, -/obj/effect/turf_decal/number/four{ - pixel_x = 6; - pixel_y = 32 +/area/overmap_encounter/planetoid/jungle/explored) +"nw" = ( +/obj/structure/railing, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 }, -/obj/structure{ - desc = "A devastating strike weapon of times past. The mountings seem broken now."; - dir = 4; - icon = 'icons/mecha/mecha_equipment.dmi'; - icon_state = "mecha_missilerack_six"; - name = "ancient missile rack"; - pixel_x = -26; - pixel_y = 11 +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"ny" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/spider/stickyweb, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"nA" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/area/overmap_encounter/planetoid/jungle/explored) +"nB" = ( +/obj/structure/flora/rock, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, /area/overmap_encounter/planetoid/jungle/explored) "nF" = ( /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"nI" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/toxins, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/wood{ - icon_state = "wood-broken3" - }, -/area/ruin/jungle/starport) -"nK" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +"nG" = ( +/obj/structure/flora/rock/jungle, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"nH" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"nI" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/toxins, +/obj/machinery/light/small/broken/directional/east, +/turf/open/floor/wood{ + icon_state = "wood-broken3" + }, +/area/ruin/jungle/starport) "nM" = ( /obj/structure/chair{ dir = 4 @@ -1946,78 +1965,58 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"nN" = ( -/obj/structure/cable{ - icon_state = "1-10" - }, -/obj/structure/spider/stickyweb, +"nS" = ( /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"nP" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"nT" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/borderfloor{ + dir = 1 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"nQ" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 +"nZ" = ( +/obj/structure/table/reinforced, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"oa" = ( +/obj/effect/turf_decal/industrial/traffic{ + dir = 8 }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"nV" = ( -/obj/effect/decal/cleanable/vomit/old, +"ob" = ( /obj/structure/spider/stickyweb, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/mineral/plastitanium, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, /area/overmap_encounter/planetoid/jungle/explored) -"nW" = ( -/obj/structure/flora/rock/pile, +"oc" = ( +/obj/effect/decal/cleanable/glass, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland4" + icon_state = "wasteland8" }, /area/overmap_encounter/planetoid/jungle/explored) -"nY" = ( -/obj/structure/table/rolling, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 10; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -10; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 2; - pixel_y = 5 +"od" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -6; - pixel_y = 5 +/area/overmap_encounter/planetoid/jungle/explored) +"oe" = ( +/obj/structure/spacevine, +/obj/structure/spider/stickyweb, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) "of" = ( /obj/structure/cable{ @@ -2028,49 +2027,39 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"oj" = ( -/obj/structure/flora/rock, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"og" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"ok" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"oi" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, /area/overmap_encounter/planetoid/jungle/explored) -"on" = ( -/obj/structure/railing, -/turf/open/floor/plasteel/stairs/old{ - dir = 8 - }, +"om" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"oo" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "oq" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/vault, /area/ruin/jungle/starport) -"or" = ( -/obj/structure/railing, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"ot" = ( -/obj/item/stack/ore/salvage/scrapmetal/five, +"os" = ( +/obj/structure/spider/stickyweb, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ou" = ( -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ +"ow" = ( +/obj/effect/turf_decal/arrows, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -2079,31 +2068,27 @@ dir = 1 }, /area/ruin/jungle/starport/tower) -"oz" = ( -/obj/effect/decal/cleanable/molten_object, -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug" +"oy" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "oA" = ( /turf/open/floor/wood, /area/ruin/jungle/starport) -"oC" = ( -/obj/structure/railing/corner, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"oD" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"oF" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree5" +"oH" = ( +/obj/structure/railing/corner, +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -2111,198 +2096,226 @@ /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"oT" = ( -/obj/structure/flora/junglebush, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"oW" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"oK" = ( +/obj/structure/spacevine/dense, +/obj/structure/cable{ + icon_state = "1-2" }, -/area/overmap_encounter/planetoid/jungle/explored) -"oY" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +/obj/structure/cable{ + icon_state = "1-10" }, -/area/overmap_encounter/planetoid/jungle/explored) -"pa" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/spider/stickyweb, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"pf" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ph" = ( -/obj/structure/cable{ - icon_state = "4-10" +"oL" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"pl" = ( -/obj/effect/turf_decal/arrows, +"oN" = ( /obj/structure/spacevine, -/turf/open/floor/concrete{ - light_range = 2 +/obj/effect/turf_decal/weather/dirt{ + dir = 1 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"po" = ( +"oQ" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"oS" = ( +/obj/effect/decal/cleanable/generic, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"px" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 +"oU" = ( +/obj/structure/railing/corner{ + dir = 8 }, +/obj/structure/spider/stickyweb, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"py" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plasteel, +"oV" = ( +/turf/open/floor/plasteel/stairs/right{ + dir = 4 + }, /area/overmap_encounter/planetoid/jungle/explored) -"pB" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"oX" = ( +/obj/structure/railing{ + dir = 6 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"pC" = ( +"pb" = ( /obj/effect/turf_decal/industrial/stand_clear{ dir = 4 }, -/obj/structure/spacevine, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"pE" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"pe" = ( +/obj/machinery/computer/mech_bay_power_console{ + dir = 4 }, +/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"pG" = ( -/obj/machinery/atmospherics/components/unary/shuttle/heater{ +"pi" = ( +/obj/effect/turf_decal/industrial/traffic{ dir = 4 }, -/obj/structure/window/plasma/reinforced{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating, -/area/ruin/jungle/starport) -"pI" = ( -/obj/structure/table, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"pJ" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/floor/plating/grass/jungle{ +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"pK" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken2" +"pk" = ( +/obj/structure/cable{ + icon_state = "6-9" }, -/area/ruin/jungle/starport) -"pL" = ( -/obj/effect/decal/cleanable/ash/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland3" +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"pM" = ( +"pn" = ( +/obj/structure/table, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"pr" = ( /obj/structure/table, /turf/open/floor/plating, -/area/ruin/jungle/starport) -"pP" = ( +/area/overmap_encounter/planetoid/jungle/explored) +"pu" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland6" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"pv" = ( /obj/structure/spacevine, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam3" +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/area/ruin/jungle/starport) -"pT" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) -"qb" = ( -/obj/structure/flora/junglebush/b, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ +"pz" = ( +/obj/structure/railing/corner, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qf" = ( -/obj/effect/turf_decal/industrial/warning{ +"pG" = ( +/obj/machinery/atmospherics/components/unary/shuttle/heater{ dir = 4 }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/obj/structure/window/plasma/reinforced{ + dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"qh" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating, +/area/ruin/jungle/starport) +"pH" = ( +/obj/effect/turf_decal/industrial/traffic/corner, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qi" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"pK" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/ruin/jungle/starport) +"pM" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/ruin/jungle/starport) +"pO" = ( +/obj/effect/turf_decal/atmos/plasma, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"qm" = ( -/obj/structure/railing{ - dir = 4 +"pP" = ( +/obj/structure/spacevine, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam3" + }, +/area/ruin/jungle/starport) +"pQ" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland3" }, +/area/overmap_encounter/planetoid/jungle/explored) +"pS" = ( +/obj/effect/decal/cleanable/dirt/dust, /obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"pU" = ( +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qn" = ( -/obj/structure/railing{ - dir = 4 +"pY" = ( +/obj/structure/chair, +/obj/item/stack/sheet/metal, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"pZ" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"qa" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, +/area/overmap_encounter/planetoid/jungle/explored) +"qc" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/grass/jungle, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qs" = ( -/obj/structure/railing, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"qd" = ( +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"qk" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"qq" = ( +/obj/structure/cable{ + icon_state = "2-5" }, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) "qt" = ( /obj/structure/door_assembly, @@ -2332,34 +2345,18 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"qz" = ( -/obj/structure/spacevine, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"qC" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, -/turf/open/floor/plating, +"qD" = ( +/obj/item/chair, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"qE" = ( -/obj/effect/decal/cleanable/shreds, +"qG" = ( +/obj/item/stack/cable_coil/cut/red, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/stairs/medium{ - dir = 1 - }, -/area/overmap_encounter/planetoid/jungle/explored) "qI" = ( /obj/structure/closet, /turf/open/floor/plating{ @@ -2374,20 +2371,48 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"qK" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" +"qL" = ( +/obj/effect/turf_decal/number/zero{ + pixel_x = -7; + pixel_y = 32 + }, +/obj/effect/turf_decal/number/four{ + pixel_x = 6; + pixel_y = 32 + }, +/obj/structure{ + desc = "A devastating strike weapon of times past. The mountings seem broken now."; + dir = 4; + icon = 'icons/mecha/mecha_equipment.dmi'; + icon_state = "mecha_missilerack_six"; + name = "ancient missile rack"; + pixel_x = -26; + pixel_y = 11 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"qO" = ( -/obj/structure/railing/corner{ - dir = 8 +"qM" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 8; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = 26 }, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"qN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland4" + }, +/area/overmap_encounter/planetoid/jungle/explored) "qP" = ( /obj/structure/rack, /obj/item/ammo_casing/caseless/rocket{ @@ -2410,41 +2435,63 @@ }, /turf/open/floor/vault, /area/ruin/jungle/starport) -"qR" = ( -/obj/effect/decal/cleanable/shreds, -/turf/closed/wall, +"qQ" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"qT" = ( -/obj/structure/railing{ - dir = 10 +"qS" = ( +/obj/structure/chair{ + dir = 8 }, -/obj/structure/spacevine/dense, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"qW" = ( +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"qX" = ( +/obj/effect/decal/cleanable/plastic, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"qY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/spacevine, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "ra" = ( /obj/item/stack/cable_coil/cut/red, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"rb" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 1 - }, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"rc" = ( -/obj/item/chair, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "rd" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 }, /turf/open/floor/vault, /area/ruin/jungle/starport) +"rf" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "rh" = ( /obj/structure/spider/stickyweb, /obj/effect/decal/cleanable/dirt/dust, @@ -2452,22 +2499,9 @@ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"ri" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rj" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/railing/corner, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, +"rk" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) "rl" = ( /obj/structure/spider/stickyweb, @@ -2479,92 +2513,36 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating, /area/ruin/jungle/starport) -"rn" = ( -/obj/structure/table_frame, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "ro" = ( /obj/structure/curtain, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"rq" = ( -/obj/structure/railing/corner{ - dir = 4 +"ru" = ( +/obj/effect/turf_decal/industrial/traffic/corner{ + dir = 8 }, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/spacevine, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"rr" = ( -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"rt" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland3" - }, -/area/overmap_encounter/planetoid/jungle/explored) "rv" = ( /obj/structure/chair{ dir = 4 }, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"ry" = ( -/obj/structure/railing, +"rE" = ( /obj/structure/railing{ - dir = 4 - }, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rz" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rA" = ( -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/obj/effect/decal/cleanable/molten_object/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rB" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rG" = ( -/obj/item/stack/cable_coil/cut/red, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"rH" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 1 + dir = 8 }, -/turf/open/floor/concrete{ +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"rI" = ( -/obj/structure/railing, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/overmap_encounter/planetoid/jungle/explored) "rJ" = ( /obj/structure/chair{ dir = 1 @@ -2572,54 +2550,42 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"rK" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/telecomms/receiver, -/turf/open/floor/plating/dirt/jungle/wasteland, -/area/overmap_encounter/planetoid/jungle/explored) -"rM" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"rV" = ( -/obj/structure/railing{ - dir = 4 +"rO" = ( +/obj/structure{ + desc = "A devastating strike weapon of times past. The mountings seem broken now."; + dir = 4; + icon = 'icons/mecha/mecha_equipment.dmi'; + icon_state = "mecha_missilerack_six"; + name = "ancient missile rack"; + pixel_x = -26; + pixel_y = -5 }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"rX" = ( -/obj/structure/sink/kitchen{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"rY" = ( -/obj/structure/spider/stickyweb, +"rR" = ( +/obj/structure/bed/pod, +/obj/structure/curtain, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) +"rS" = ( /obj/structure/flora/grass/jungle/b, +/obj/structure/flora/junglebush, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"rZ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"rT" = ( +/obj/structure/mecha_wreckage/ripley/firefighter, +/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"sc" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/concrete{ - light_range = 2 - }, +"sb" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) "sd" = ( /obj/structure/table/reinforced, @@ -2630,271 +2596,242 @@ /obj/structure/closet, /turf/open/floor/wood, /area/ruin/jungle/starport) -"si" = ( -/obj/structure/railing{ - dir = 2 - }, -/obj/effect/turf_decal/industrial/warning{ +"sf" = ( +/obj/effect/turf_decal/industrial/stand_clear{ dir = 8 }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/obj/structure/railing/corner, +/obj/structure/railing/corner{ + dir = 8 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"sr" = ( -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"st" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/dirt/jungle{ +"sg" = ( +/obj/structure/flora/tree/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"su" = ( -/obj/structure/railing{ - dir = 2 +"sh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland3" }, -/obj/structure/spacevine, +/area/overmap_encounter/planetoid/jungle/explored) +"sj" = ( +/obj/structure/rack, +/obj/item/mecha_parts/mecha_equipment/extinguisher, +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"sk" = ( +/obj/structure/spacevine/dense, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"sv" = ( -/obj/effect/decal/cleanable/shreds, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ +"sl" = ( +/obj/structure/spider/stickyweb, +/obj/machinery/light/broken/directional/south, +/mob/living/simple_animal/hostile/poison/giant_spider/nurse, +/turf/open/floor/plasteel, +/area/ruin/jungle/starport) +"sm" = ( +/obj/structure/cable{ + icon_state = "5-10" + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"sy" = ( -/obj/structure/railing, -/obj/structure/railing{ +"sn" = ( +/obj/structure/railing/corner{ dir = 8 }, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"sC" = ( -/obj/structure/cable{ - icon_state = "4-8" +"sp" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, -/obj/structure/cable{ - icon_state = "4-8" +/area/overmap_encounter/planetoid/jungle/explored) +"sz" = ( +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 +/obj/effect/decal/cleanable/molten_object, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug" }, -/turf/open/floor/concrete/reinforced{ +/area/overmap_encounter/planetoid/jungle/explored) +"sA" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland3" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"sB" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/suit/fire/atmos, +/obj/item/clothing/mask/gas/atmos, +/obj/item/clothing/head/hardhat/atmos, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"sD" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"sE" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) "sF" = ( /obj/structure/closet/wardrobe/black, /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/ruin/jungle/starport) +"sH" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "sK" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/donkpockets, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"sL" = ( -/obj/structure/door_assembly, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"sM" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"sP" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree8" +"sN" = ( +/obj/structure/closet/emcloset/anchored, +/obj/structure/railing{ + dir = 10 }, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"sQ" = ( -/obj/structure/railing{ - dir = 4 +"sS" = ( +/obj/machinery/telecomms/broadcaster, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam2" }, -/obj/effect/turf_decal/borderfloor{ - dir = 5 +/area/overmap_encounter/planetoid/jungle/explored) +"tb" = ( +/obj/structure/table/reinforced, +/obj/item/binoculars, +/obj/item/pen/fountain, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"td" = ( +/obj/structure/window/plasma/reinforced{ + dir = 4 }, +/obj/machinery/suit_storage_unit/open, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"sT" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"sU" = ( -/obj/structure/flora/rock, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +"te" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/stairs/medium{ + dir = 4 }, /area/overmap_encounter/planetoid/jungle/explored) -"sW" = ( -/obj/structure/sign/syndicate{ - pixel_x = -32 - }, +"tj" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"sX" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"tm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland9" }, /area/overmap_encounter/planetoid/jungle/explored) -"sY" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"tn" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland7" }, /area/overmap_encounter/planetoid/jungle/explored) -"tb" = ( -/obj/structure/table/reinforced, -/obj/item/binoculars, -/obj/item/pen/fountain, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"tc" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 4; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = -26 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"tf" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/spacevine, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"tg" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"th" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"tk" = ( -/obj/structure/rack, -/obj/item/mecha_parts/mecha_equipment/extinguisher, -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, -/turf/open/floor/vault, -/area/overmap_encounter/planetoid/jungle/explored) "to" = ( /obj/structure/chair/comfy/brown, /turf/open/floor/wood, /area/ruin/jungle/starport) -"tr" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/glass, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"tt" = ( -/obj/structure/cable{ - icon_state = "6-8" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"tp" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"tv" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"tx" = ( -/obj/structure/flora/rock/pile, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" +"ts" = ( +/obj/structure/railing{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"tz" = ( -/obj/structure/spider/stickyweb, +/obj/structure/spacevine, /turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"tA" = ( -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"tw" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"tB" = ( +"ty" = ( /obj/structure/spacevine, /obj/effect/turf_decal/weather/dirt{ - dir = 9 + dir = 6 }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"tC" = ( -/obj/structure/railing/corner, -/obj/structure/spacevine, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/concrete/slab_1{ +"tD" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"tE" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"tF" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"tI" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/mineral/plastitanium, +"tH" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "tJ" = ( /obj/item/stack/ore/salvage/scrapmetal/five, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"tL" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plasteel, +"tK" = ( +/obj/structure/railing, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "tM" = ( /obj/structure/cable{ @@ -2907,90 +2844,77 @@ icon_state = "plastitanium_dam2" }, /area/ruin/jungle/starport) -"tN" = ( -/obj/structure/flora/junglebush, -/obj/structure/flora/junglebush/b, -/obj/structure/flora/junglebush/large, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"tP" = ( +/obj/structure/rack, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"tT" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"tO" = ( +"tV" = ( /obj/structure/spacevine, /turf/open/floor/plating{ - icon_state = "platingdmg2" + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"tQ" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 1 - }, -/obj/effect/turf_decal/industrial/warning{ - dir = 1 - }, +"ua" = ( /obj/structure/railing/corner{ - dir = 8 + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"tR" = ( -/obj/effect/radiation{ - rad_power = 180; - rad_range = 2 - }, -/obj/effect/decal/cleanable/molten_object/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 +"ub" = ( +/obj/structure/railing{ + dir = 6 }, -/area/overmap_encounter/planetoid/jungle/explored) -"tW" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ud" = ( +"uf" = ( +/obj/item/stack/cable_coil/cut/red, /obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ue" = ( +"um" = ( /obj/effect/turf_decal/weather/dirt{ - dir = 10 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"uh" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/junglebush/large, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"ui" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland9" + dir = 9 }, -/area/overmap_encounter/planetoid/jungle/explored) -"uk" = ( -/obj/structure/spacevine/dense, /obj/effect/turf_decal/weather/dirt{ dir = 5 }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"uq" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/cocoon, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"un" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 4 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "ur" = ( @@ -3010,6 +2934,14 @@ /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) +"uy" = ( +/obj/structure/flora/tree/jungle/small{ + icon_state = "tree3" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "uz" = ( /obj/structure/window/plasma/reinforced{ dir = 8 @@ -3017,19 +2949,6 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"uA" = ( -/obj/structure/railing, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"uB" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) "uC" = ( /obj/structure/spider/stickyweb, /obj/structure/spacevine, @@ -3037,44 +2956,65 @@ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"uD" = ( -/obj/structure/spacevine/dense, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"uJ" = ( +"uE" = ( /obj/structure/railing{ dir = 10 }, -/turf/open/floor/plating, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"uL" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland5" +"uK" = ( +/obj/structure/chair{ + dir = 4 }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"uN" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/grass/jungle, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ +"uO" = ( +/obj/effect/turf_decal/industrial/traffic{ + dir = 8 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"uP" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) "uQ" = ( /obj/structure/cable, /obj/structure/spider/stickyweb, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) "uR" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/overmap_encounter/planetoid/jungle/explored) -"uT" = ( -/obj/machinery/shower{ - dir = 4; - desc = "An old shower. It looks rusted." - }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"uS" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"uT" = ( +/obj/machinery/shower{ + dir = 4; + desc = "An old shower. It looks rusted." + }, /obj/structure/mirror{ pixel_y = 30 }, @@ -3082,111 +3022,91 @@ /obj/machinery/light/floor, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"uW" = ( +"uU" = ( +/obj/structure/spacevine/dense, /obj/structure/spider/stickyweb, -/obj/structure/spider/cocoon{ - icon_state = "cocoon3" +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"uY" = ( +"vc" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/spacevine, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"vf" = ( -/obj/structure/flora/tree/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, +"vd" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plasteel/stairs/medium, /area/overmap_encounter/planetoid/jungle/explored) -"vi" = ( +"ve" = ( /obj/structure/railing{ - dir = 8 + dir = 1 }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +/turf/open/floor/plasteel/stairs{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) -"vj" = ( -/obj/structure/frame/machine, -/turf/open/floor/plating/dirt/jungle/wasteland, -/area/overmap_encounter/planetoid/jungle/explored) -"vk" = ( -/obj/effect/decal/cleanable/ash, +"vg" = ( +/obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"vm" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 +"vl" = ( +/obj/structure/railing/corner{ + dir = 8 }, -/turf/open/water/jungle, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) -"vo" = ( -/obj/structure/spacevine, -/obj/structure/spacevine, -/turf/open/floor/concrete{ +"vn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"vp" = ( -/obj/effect/turf_decal/industrial/warning/corner{ +"vr" = ( +/obj/structure/chair/comfy/shuttle{ + name = "Grav Couch"; dir = 8 }, -/turf/open/floor/concrete{ - light_range = 2 - }, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) -"vq" = ( -/obj/structure/flora/rock/pile, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland7" +"vs" = ( +/obj/effect/turf_decal/industrial/traffic/corner{ + dir = 1 }, -/area/overmap_encounter/planetoid/jungle/explored) -"vt" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland4" +/turf/open/floor/concrete{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"vu" = ( -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/stack/cable_coil/cut/red, -/obj/effect/decal/cleanable/glass, +"vv" = ( /obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"vw" = ( +"vx" = ( /obj/structure/spider/stickyweb, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam5" - }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"vz" = ( -/obj/effect/decal/cleanable/ash/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" - }, +"vA" = ( +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) -"vB" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 8; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = 26 - }, -/turf/open/floor/concrete/slab_1{ +"vC" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -3199,54 +3119,48 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"vG" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ +"vE" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"vK" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"vH" = ( +/obj/structure/spider/stickyweb, +/obj/structure/cable{ + icon_state = "1-2" }, +/turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"vL" = ( +"vJ" = ( /obj/structure/spacevine, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"vM" = ( -/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"vQ" = ( -/obj/effect/turf_decal/arrows{ - dir = 8 +"vK" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, +/area/ruin/jungle/starport) +"vT" = ( /obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"vR" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ +"vU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -3255,6 +3169,26 @@ /obj/effect/decal/remains/human, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) +"vW" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plasteel/stairs/left, +/area/overmap_encounter/planetoid/jungle/explored) +"vX" = ( +/obj/structure/railing, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"vZ" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "wa" = ( /obj/structure/chair{ dir = 8 @@ -3262,14 +3196,6 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"wb" = ( -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "wc" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3285,103 +3211,104 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"we" = ( -/obj/structure/chair{ - dir = 8 +"wf" = ( +/obj/item/rack_parts, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"wo" = ( +/obj/structure/railing, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"wg" = ( +"wr" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/spacevine, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"wi" = ( -/obj/effect/turf_decal/atmos/plasma, -/obj/effect/turf_decal/industrial/warning{ - dir = 1 +"wt" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 }, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"wk" = ( -/obj/structure/chair{ - dir = 4 +/obj/effect/turf_decal/weather/dirt{ + dir = 9 }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/rust, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"wl" = ( -/obj/structure/spacevine, -/turf/closed/wall/concrete/reinforced, +"wv" = ( +/obj/structure/rack, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/obj/item/reagent_containers/food/snacks/canned/beans, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"wm" = ( -/obj/structure/flora/rock, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"ww" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"ws" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/obj/item/stack/sheet/mineral/plastitanium, -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"wx" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland3" }, /area/overmap_encounter/planetoid/jungle/explored) "wy" = ( /obj/structure/spider/stickyweb, /turf/open/floor/wood, /area/ruin/jungle/starport) -"wA" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "wB" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"wE" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/structure/spider/stickyweb, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"wG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/stairs/medium{ - dir = 4 +"wC" = ( +/obj/structure/flora/tree/jungle/small, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "wH" = ( /obj/structure/girder/displaced, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"wJ" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, +"wI" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"wK" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave, -/turf/open/floor/plasteel/dark, +"wM" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"wN" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 4 +"wO" = ( +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 8; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = 26 }, -/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/concrete/slab_1{ light_range = 2 }, @@ -3392,62 +3319,31 @@ /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /turf/closed/wall/r_wall/syndicate/nodiagonal, /area/ruin/jungle/starport) -"wQ" = ( -/obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"wT" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +"wR" = ( +/obj/effect/turf_decal/industrial/warning{ dir = 4 }, -/turf/open/floor/plasteel/stairs/medium{ - dir = 8 +/obj/structure/spacevine, +/obj/structure/railing, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"wW" = ( -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" - }, -/obj/structure/rack, -/turf/open/floor/vault, +"wY" = ( +/obj/structure/frame/machine, +/turf/open/floor/plating/dirt/jungle/wasteland, /area/overmap_encounter/planetoid/jungle/explored) -"wX" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/structure/flora/rock/pile, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" +"xd" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/arrows{ + dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"wZ" = ( -/obj/structure/flora/rock/pile, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"xb" = ( -/obj/structure/spacevine, +"xf" = ( +/obj/structure/railing, /obj/structure/spacevine, /turf/open/floor/plating/dirt/jungle{ light_range = 2 @@ -3460,36 +3356,17 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"xi" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/obj/effect/turf_decal/weather/dirt{ - dir = 9 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"xj" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland5" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"xl" = ( -/obj/structure/chair{ - dir = 1 +"xh" = ( +/obj/structure/cable{ + icon_state = "4-9" }, +/obj/structure/spacevine, /obj/structure/spider/stickyweb, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"xm" = ( -/obj/machinery/light/broken/directional/west, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"xn" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plasteel, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "xo" = ( /obj/structure/spider/stickyweb, @@ -3506,17 +3383,13 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) -"xr" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland9" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"xt" = ( -/obj/structure/spacevine, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"xs" = ( +/obj/item/radio/intercom/directional/north{ + pixel_y = 24 }, -/area/overmap_encounter/planetoid/jungle/explored) +/obj/item/stack/sheet/metal, +/turf/open/floor/plasteel, +/area/ruin/jungle/starport) "xu" = ( /obj/structure/cable{ icon_state = "0-4" @@ -3525,40 +3398,119 @@ icon_state = "wood-broken4" }, /area/ruin/jungle/starport) -"xA" = ( -/obj/effect/turf_decal/atmos/plasma, -/obj/structure/spacevine, +"xw" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) +"xz" = ( +/obj/structure/spider/stickyweb, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel, +/area/ruin/jungle/starport) +"xC" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"xD" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "xE" = ( /obj/structure/bed/pod, /obj/structure/curtain, /obj/item/stack/sheet/metal, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"xI" = ( +"xF" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"xG" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"xH" = ( +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 11 + }, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"xL" = ( +/obj/structure/railing/corner, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"xM" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/spider/stickyweb, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"xO" = ( /obj/structure/spacevine, /obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"xJ" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/rust, +"xP" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 4; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = -26 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"xQ" = ( -/obj/effect/decal/cleanable/shreds, +"xS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/stairs/medium, +/area/overmap_encounter/planetoid/jungle/explored) +"xT" = ( +/obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"xU" = ( +/obj/effect/decal/cleanable/ash, +/obj/structure/spacevine, /turf/open/floor/plating{ - icon_state = "panelscorched" + icon_state = "platingdmg3" }, /area/overmap_encounter/planetoid/jungle/explored) -"xZ" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ +"xX" = ( +/obj/structure/railing, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -3569,175 +3521,127 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport/tower) -"yb" = ( +"yf" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 1 + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"ym" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/plastitanium, +/area/overmap_encounter/planetoid/jungle/explored) +"yr" = ( +/obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ - icon_state = "4-9" + icon_state = "1-2" }, -/obj/structure/spacevine, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"yc" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/cocoon, +"ys" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"yd" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old{ - icon_state = "floor5-old" - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"yh" = ( -/obj/item/stack/cable_coil/cut/red, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"yi" = ( -/obj/structure/spider/stickyweb, -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"yu" = ( +/obj/structure/girder/displaced, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"yj" = ( -/obj/item/stack/ore/salvage/scrapmetal/five, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ +"yx" = ( +/obj/structure/spacevine, +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"yp" = ( -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"yq" = ( -/obj/structure/chair, -/obj/item/stack/sheet/metal, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"yt" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"yv" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"yw" = ( -/obj/item/chair, -/obj/machinery/light/directional/west, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"yx" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/vault, -/area/overmap_encounter/planetoid/jungle/explored) "yA" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/jungle/starport) -"yD" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/water/jungle, +"yI" = ( +/obj/item/chair, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"yH" = ( -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"yO" = ( +/obj/effect/decal/cleanable/molten_object/large, +/obj/effect/radiation{ + rad_power = 180; + rad_range = 3 }, -/area/overmap_encounter/planetoid/jungle/explored) -"yJ" = ( -/obj/structure/chair{ - dir = 8 +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 }, -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"yM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine, +"yP" = ( +/obj/structure/flora/rock, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" + icon_state = "wasteland9" }, /area/overmap_encounter/planetoid/jungle/explored) "yQ" = ( /obj/structure/table/rolling, /turf/open/floor/vault, /area/ruin/jungle/starport) -"yY" = ( -/obj/structure/flora/rock, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland4" +"yU" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/concrete{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"zc" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plasteel/dark, +"yV" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"yW" = ( +/obj/effect/turf_decal/atmos/plasma, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"ze" = ( +"za" = ( /obj/structure/railing{ - dir = 10 + dir = 5 }, -/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"zi" = ( -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 4; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = -26 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"zd" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland5" }, /area/overmap_encounter/planetoid/jungle/explored) -"zk" = ( +"zg" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/glass/plasma, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"zn" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 +"zj" = ( +/obj/structure/chair{ + dir = 4 }, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/jungle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"zo" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"zl" = ( +/obj/structure/spacevine, +/obj/structure/spacevine, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"zm" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) "zr" = ( /obj/machinery/shower{ dir = 4; @@ -3749,6 +3653,12 @@ /obj/machinery/light/floor, /turf/open/floor/plasteel/patterned, /area/ruin/jungle/starport) +"zt" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "zu" = ( /obj/machinery/door/airlock{ dir = 4 @@ -3760,29 +3670,41 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/jungle/starport) -"zw" = ( -/obj/structure/spacevine, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"zv" = ( +/obj/effect/decal/cleanable/molten_object, +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug" }, /area/overmap_encounter/planetoid/jungle/explored) -"zG" = ( -/turf/open/floor/plating/rust, +"zB" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"zI" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/spacevine, +"zD" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"zJ" = ( -/obj/structure/railing{ - dir = 4 +"zF" = ( +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, +/area/overmap_encounter/planetoid/jungle/explored) +"zG" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"zH" = ( /obj/structure/spider/stickyweb, /turf/open/floor/concrete/reinforced{ light_range = 2 @@ -3800,94 +3722,77 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport) -"zT" = ( -/obj/structure/spacevine, -/turf/open/floor/plating, +"zL" = ( +/obj/structure/frame/machine, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"zM" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"zN" = ( +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"zQ" = ( +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) "zV" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/broken/directional/north, /turf/open/floor/plating, /area/ruin/jungle/starport) -"zZ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"Aa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "Ab" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"Ae" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"Af" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Ai" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) -"Aj" = ( -/obj/structure/railing, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Ak" = ( -/turf/open/floor/plasteel/stairs{ - dir = 8 +"Ac" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"Am" = ( -/obj/structure/railing{ - dir = 1 +"Ah" = ( +/obj/structure/flora/tree/jungle/small{ + icon_state = "tree1" }, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"Aq" = ( -/obj/machinery/telecomms/broadcaster, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam2" +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"As" = ( -/obj/structure/sign/syndicate{ - anchored = 0 - }, -/turf/open/floor/concrete/slab_1{ +"Al" = ( +/obj/structure/spacevine, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"At" = ( -/obj/structure/railing, -/obj/structure/spacevine, +"An" = ( /obj/structure/railing{ dir = 4 }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +/turf/open/floor/plasteel/stairs/right, /area/overmap_encounter/planetoid/jungle/explored) -"Av" = ( -/obj/effect/decal/cleanable/ash/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland5" +"Ap" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ax" = ( +"Aw" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-8" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) "Az" = ( /obj/structure/cable{ @@ -3898,60 +3803,83 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"AB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +"AA" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/shreds, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"AD" = ( -/obj/effect/decal/cleanable/molten_object, +"AE" = ( +/obj/structure/spacevine/dense, /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"AF" = ( -/obj/structure/spacevine/dense, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +"AK" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"AG" = ( -/obj/machinery/autolathe, -/turf/open/floor/vault, +"AL" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam5" + }, /area/overmap_encounter/planetoid/jungle/explored) -"AH" = ( -/obj/structure/rack, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/obj/item/reagent_containers/food/snacks/canned/beans, -/turf/open/floor/plating/rust, +"AM" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plasteel/stairs/old, /area/overmap_encounter/planetoid/jungle/explored) -"AO" = ( -/turf/open/floor/plasteel/stairs{ - dir = 4 +"AP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "AQ" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"AR" = ( +"AS" = ( +/obj/structure/sign/syndicate{ + anchored = 0 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"AT" = ( /obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"AU" = ( +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 + }, +/obj/effect/decal/cleanable/molten_object/large, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland7" + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"AV" = ( +/obj/structure/spacevine, +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "AX" = ( @@ -3961,137 +3889,245 @@ }, /turf/open/floor/plasteel, /area/ruin/jungle/starport) +"AY" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "AZ" = ( /obj/structure/closet, /obj/structure/spider/stickyweb, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"Bg" = ( -/obj/structure/railing{ - dir = 10 +"Ba" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 }, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bi" = ( +"Bb" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "6-8" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Bk" = ( +"Bc" = ( /obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ +/obj/machinery/light/directional/west, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bm" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, +"Bd" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Be" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/obj/item/stack/sheet/mineral/plastitanium, +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bp" = ( -/obj/structure/railing, -/obj/structure/spacevine, -/turf/open/floor/concrete/slab_1{ +"Bf" = ( +/obj/effect/decal/remains/human, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Bo" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bs" = ( +"Bq" = ( +/obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland5" +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Bu" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bt" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland9" +"Bw" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/item/extinguisher/advanced, +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "Bx" = ( /turf/closed/wall/rust, /area/ruin/jungle/starport) -"By" = ( -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungle{ +"BA" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Bz" = ( -/obj/structure/flora/rock, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"BB" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland4" }, /area/overmap_encounter/planetoid/jungle/explored) -"BC" = ( -/obj/item/rack_parts, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) "BD" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/jungle/starport/tower) -"BF" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/borderfloor{ - dir = 1 +"BE" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"BH" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 6 +"BG" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) +"BJ" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/north{ + pixel_y = 24 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) "BK" = ( /obj/structure/bed, /obj/structure/curtain/cloth/fancy, /turf/open/floor/wood, /area/ruin/jungle/starport) +"BL" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree8" + }, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "BM" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/jungle/starport/plasma) -"BN" = ( +"BT" = ( /obj/item/stack/sheet/mineral/plastitanium, /obj/item/stack/sheet/mineral/plastitanium, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"BU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/spacevine/dense, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"BQ" = ( -/turf/open/floor/plasteel/stairs/right{ - dir = 4 +"BV" = ( +/obj/structure/girder, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"BX" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"BR" = ( +"Cb" = ( +/obj/effect/decal/cleanable/shreds, /obj/effect/decal/cleanable/dirt/dust, +/obj/structure/spacevine/dense, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"Cc" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree9" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "Cd" = ( /obj/machinery/door/airlock/glass, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"Ce" = ( +"Cg" = ( +/obj/structure/flora/tree/jungle/small{ + icon_state = "tree4" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Cj" = ( /obj/structure/spacevine/dense, +/obj/structure/flora/grass/jungle, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Ck" = ( /obj/effect/turf_decal/weather/dirt{ - dir = 6 + dir = 10 }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) +"Cl" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/glass, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Cm" = ( +/obj/item/stack/cable_coil/cut/red, +/obj/effect/decal/cleanable/glass, +/obj/structure/girder/displaced, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam2" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Cn" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "Co" = ( /obj/structure/closet, /obj/item/clothing/under/syndicate/aclfgrunt, @@ -4102,34 +4138,55 @@ icon_state = "platingdmg2" }, /area/ruin/jungle/starport) -"Cp" = ( -/obj/structure/railing/corner{ - dir = 4 +"Cq" = ( +/obj/structure/railing{ + dir = 10 }, -/obj/structure/spider/stickyweb, +/obj/structure/spacevine/dense, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Cu" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" +"Cx" = ( +/obj/structure/table{ + name = "officer's table"; + desc = "A square piece of metal standing on four metal legs. It can not move. This one feels more important than the others" }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"Cv" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 4 +"CA" = ( +/obj/structure/railing, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"CB" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Cy" = ( +"CC" = ( /obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, /area/overmap_encounter/planetoid/jungle/explored) -"Cz" = ( -/obj/effect/decal/cleanable/plastic, -/turf/open/floor/concrete{ +"CD" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"CE" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -4141,18 +4198,31 @@ icon_state = "plastitanium_dam3" }, /area/ruin/jungle/starport) -"CG" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +"CK" = ( +/obj/structure/railing/corner, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 +/area/overmap_encounter/planetoid/jungle/explored) +"CL" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"CO" = ( -/obj/structure/flora/junglebush, -/turf/open/floor/plating/grass/jungle{ +"CM" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"CN" = ( +/obj/item/watertank/atmos, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -4163,16 +4233,22 @@ }, /turf/open/floor/plasteel, /area/ruin/jungle/starport) +"CQ" = ( +/obj/structure/spacevine, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "CR" = ( /obj/effect/decal/cleanable/blood/drip, /obj/machinery/light/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"CS" = ( -/obj/effect/decal/remains/human, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"CU" = ( +/obj/structure/spacevine, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "CV" = ( @@ -4183,65 +4259,17 @@ icon_state = "wood-broken4" }, /area/ruin/jungle/starport) -"CW" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/plating/rust, -/area/ruin/jungle/starport) -"CZ" = ( -/obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"Da" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"De" = ( -/obj/structure/flora/rock, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Df" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Dg" = ( -/obj/structure/frame/computer{ - dir = 4 +"Dl" = ( +/obj/structure/railing{ + dir = 10 }, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) -"Dh" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/obj/structure/sign/syndicate{ + pixel_y = 32 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Dj" = ( -/obj/structure/frame/computer, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Dk" = ( -/obj/structure/door_assembly/door_assembly_eng, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "Dm" = ( /obj/machinery/atmospherics/pipe/manifold/orange{ dir = 8 @@ -4250,21 +4278,6 @@ /obj/structure/spider/cocoon, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Dn" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland7" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Dq" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) "Dr" = ( /obj/effect/turf_decal/industrial/warning{ dir = 8 @@ -4278,36 +4291,25 @@ /obj/item/stack/sheet/metal, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"Dw" = ( -/obj/item/chair, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"Dz" = ( -/obj/structure/railing, +"Dt" = ( +/obj/effect/decal/cleanable/dirt/dust, /obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"DA" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree3" +"Dy" = ( +/obj/effect/radiation{ + rad_power = 66; + rad_range = 2 }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/obj/effect/decal/cleanable/molten_object, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"DD" = ( -/obj/structure/railing, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"DG" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing{ - dir = 1 - }, +"DF" = ( +/obj/effect/decal/cleanable/ash/large, /obj/structure/spacevine, /turf/open/floor/plating/dirt/jungle{ light_range = 2 @@ -4318,50 +4320,27 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"DI" = ( -/turf/open/floor/plasteel/stairs, -/area/overmap_encounter/planetoid/jungle/explored) -"DL" = ( -/obj/structure/rack, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/turf/open/floor/plasteel/dark, -/area/overmap_encounter/planetoid/jungle/explored) -"DM" = ( -/obj/structure/railing{ - dir = 8 +"DJ" = ( +/obj/structure/cable{ + icon_state = "6-9" }, /obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"DO" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "1-2" +"DK" = ( +/obj/structure/flora/rock/pile, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland5" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"DQ" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +"DN" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "DR" = ( /obj/structure/toilet{ @@ -4370,23 +4349,23 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plasteel/patterned, /area/ruin/jungle/starport) -"DU" = ( -/obj/structure/flora/junglebush/large, -/turf/open/floor/plating/grass/jungle{ +"DS" = ( +/obj/effect/decal/cleanable/ash, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"DX" = ( -/obj/structure/flora/rock/jungle, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +"DV" = ( +/obj/machinery/light/broken/directional/west, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"DY" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland3" - }, +"DZ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "Ea" = ( /obj/structure/railing{ @@ -4396,20 +4375,17 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"Eb" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Ed" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland4" }, /area/overmap_encounter/planetoid/jungle/explored) -"Ef" = ( -/obj/effect/turf_decal/borderfloor/corner{ - dir = 4 +"Ee" = ( +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "Eg" = ( /obj/structure/window/plasma/reinforced{ @@ -4418,6 +4394,12 @@ /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) +"Eh" = ( +/obj/machinery/power/shuttle/engine/fueled/plasma{ + dir = 8 + }, +/turf/open/floor/engine/hull, +/area/overmap_encounter/planetoid/jungle/explored) "Ei" = ( /obj/structure/sink{ pixel_y = 17 @@ -4427,81 +4409,106 @@ }, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"El" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Em" = ( -/obj/effect/turf_decal/weather/dirt{ +"Ej" = ( +/obj/effect/turf_decal/industrial/traffic/corner{ dir = 4 }, -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"En" = ( -/obj/effect/turf_decal/arrows, -/obj/effect/decal/cleanable/glass, /turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Eq" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland6" +"Ek" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree10" }, -/area/overmap_encounter/planetoid/jungle/explored) -"Eu" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 1 +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/obj/structure/railing{ - dir = 4 +/area/overmap_encounter/planetoid/jungle/explored) +"Es" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"ED" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/plasteel, +"Et" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, /area/overmap_encounter/planetoid/jungle/explored) -"EE" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/grass/jungle, +"Ev" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +/obj/structure/cable{ + icon_state = "4-10" + }, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"EG" = ( -/obj/effect/decal/cleanable/oil, +"Ey" = ( +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 10; + pixel_y = 5 + }, +/obj/structure/table/rolling, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -10; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -6; + pixel_y = 5 + }, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"EH" = ( -/obj/structure/table, -/obj/structure/spacevine, -/turf/open/floor/vault, -/area/ruin/jungle/starport) -"EI" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating/dirt/jungle{ +"EA" = ( +/obj/structure/cable{ + icon_state = "1-10" + }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"EJ" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland4" +"EB" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"EK" = ( -/obj/effect/decal/cleanable/glass, -/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) +"EH" = ( +/obj/structure/table, +/obj/structure/spacevine, +/turf/open/floor/vault, +/area/ruin/jungle/starport) "EM" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -4516,215 +4523,301 @@ /obj/item/clothing/under/syndicate/combat, /turf/open/floor/plating, /area/ruin/jungle/starport) -"EN" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"EQ" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/poison/giant_spider/nurse, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"ET" = ( -/obj/effect/decal/cleanable/glass, +"EP" = ( +/obj/structure/rack, /turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) -"EU" = ( -/obj/effect/turf_decal/industrial/stand_clear{ - dir = 4 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "EV" = ( /obj/structure/table, /obj/item/toy/cards/deck/syndicate, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) +"EX" = ( +/turf/open/floor/plasteel/stairs/right, +/area/overmap_encounter/planetoid/jungle/explored) +"EY" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"EZ" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Fa" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) "Fb" = ( /obj/machinery/light/directional/north, /obj/machinery/suit_storage_unit/inherit/industrial, /turf/open/floor/vault, /area/ruin/jungle/starport) -"Fc" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" +"Fe" = ( +/obj/structure/railing, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plasteel/stairs{ +/area/overmap_encounter/planetoid/jungle/explored) +"Ff" = ( +/obj/effect/turf_decal/arrows{ dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Fg" = ( -/obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Fk" = ( -/obj/item/stack/sheet/metal, -/obj/item/stack/sheet/metal, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +"Fh" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Fq" = ( -/obj/structure/rack, -/obj/item/stack/sheet/metal/twenty, -/obj/item/stack/sheet/metal/twenty, -/obj/item/stack/sheet/glass/twenty, -/obj/item/stack/sheet/glass/twenty, -/turf/open/floor/plasteel/dark, +"Fl" = ( +/obj/machinery/atmospherics/pipe/manifold/orange{ + dir = 8 + }, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Fs" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle{ +"Fm" = ( +/obj/structure/table/rolling, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 10; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 6; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -10; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"Fn" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, +/obj/structure/spacevine, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"Fr" = ( +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" + }, +/area/overmap_encounter/planetoid/jungle/explored) "Ft" = ( /obj/machinery/door/poddoor{ id = "jbs3" }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"Fx" = ( -/obj/structure/spider/stickyweb, +"Fu" = ( /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/glass/plasma, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"FA" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam4" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"FK" = ( -/obj/item/shard, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, +"Fv" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/telecomms/receiver, +/turf/open/floor/plating/dirt/jungle/wasteland, /area/overmap_encounter/planetoid/jungle/explored) -"FM" = ( -/obj/machinery/light/broken/directional/west, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"Fw" = ( +/obj/structure/railing{ + dir = 6 }, -/area/overmap_encounter/planetoid/jungle/explored) -"FP" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/obj/structure/railing/corner{ + pixel_x = -23 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"FQ" = ( +"Fy" = ( +/obj/effect/decal/cleanable/oil, /obj/structure/spacevine/dense, -/obj/structure/flora/rock/jungle, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"FY" = ( -/obj/structure/flora/rock, +"Fz" = ( /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland9" + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"Gb" = ( -/obj/structure/spacevine, +"FB" = ( /obj/effect/turf_decal/weather/dirt{ - dir = 1 + dir = 9 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Gc" = ( -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 +"FG" = ( +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/jungle/starport) -"Gh" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/spacevine/dense, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, -/turf/open/floor/wood, -/area/ruin/jungle/starport) -"Gj" = ( -/obj/structure/railing{ +/area/overmap_encounter/planetoid/jungle/explored) +"FI" = ( +/obj/structure/rack, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"FL" = ( +/obj/structure/reagent_dispensers/foamtank, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"FR" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"FS" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 4 + }, +/obj/structure/spacevine, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"FU" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"FX" = ( +/obj/machinery/atmospherics/pipe/manifold/orange{ dir = 8 }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/spacevine/dense, -/turf/open/floor/concrete/reinforced{ +/obj/structure/spacevine, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"Ga" = ( +/obj/structure/railing/corner, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Gl" = ( -/obj/effect/turf_decal/industrial/traffic{ +"Gc" = ( +/obj/structure/frame/computer{ + anchored = 1; dir = 8 }, -/turf/open/floor/concrete{ +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport) +"Gd" = ( +/obj/effect/turf_decal/box/corners, +/obj/structure/spacevine, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Gm" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/rust, +"Ge" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"Gr" = ( -/obj/structure/railing{ - dir = 9 +"Gh" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/wood, +/area/ruin/jungle/starport) +"Gi" = ( +/obj/structure/cable{ + icon_state = "2-9" + }, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Gs" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/suit/fire/atmos, -/obj/item/clothing/mask/gas/atmos, -/obj/item/clothing/head/hardhat/atmos, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +"Gk" = ( +/obj/structure/spacevine/dense, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Gt" = ( -/obj/structure/barricade/wooden/crude, +"Gn" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree6" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Go" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Gx" = ( -/obj/structure/spacevine/dense, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ +"Gp" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"Gq" = ( +/obj/structure/cable{ + icon_state = "4-9" + }, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Gy" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/junglebush/b, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"Gu" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, /area/overmap_encounter/planetoid/jungle/explored) -"Gz" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/concrete{ +"Gv" = ( +/turf/open/floor/plating/grass{ + desc = "A patch of grass. It looks well manicured"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -4734,6 +4827,14 @@ icon_state = "wood-broken7" }, /area/ruin/jungle/starport) +"GB" = ( +/obj/effect/decal/cleanable/shreds, +/turf/closed/wall, +/area/overmap_encounter/planetoid/jungle/explored) +"GC" = ( +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) "GD" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 4 @@ -4743,243 +4844,226 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"GH" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/item/shard, -/turf/open/floor/plasteel/stairs/left, -/area/overmap_encounter/planetoid/jungle/explored) -"GI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "4-10" - }, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"GE" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 1 }, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"GJ" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/turf/open/water/jungle, +"GM" = ( +/obj/effect/decal/cleanable/ash, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"GK" = ( +"GO" = ( +/obj/structure/bed/pod, +/obj/structure/curtain, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) +"GQ" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/spacevine/dense, +/obj/structure/spacevine, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"GL" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plasteel/stairs{ - dir = 8 +"GR" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"GP" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "GS" = ( /obj/effect/decal/remains/human, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"GT" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/power/floodlight{ - anchored = 1; - state_open = 1 +"GU" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, +/area/overmap_encounter/planetoid/jungle/explored) +"GV" = ( +/obj/structure/catwalk/over/plated_catwalk, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/spider/stickyweb, +/obj/structure/spacevine, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 4 }, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"GX" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"Ha" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"Hc" = ( +/obj/structure/railing{ + dir = 1 }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"GY" = ( +"Hd" = ( /obj/structure/spacevine/dense, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"GZ" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 +"He" = ( +/obj/structure/flora/rock/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Hk" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush/c, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, +/area/overmap_encounter/planetoid/jungle/explored) +"Hm" = ( /obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/slab_1{ +/obj/structure/railing/corner, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ha" = ( -/obj/structure/chair/office{ - dir = 4 +"Hs" = ( +/obj/structure/table, +/obj/item/wallframe/apc, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"Hh" = ( -/obj/machinery/atmospherics/pipe/manifold/orange{ +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) +"Ht" = ( +/obj/structure/railing/corner{ dir = 8 }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/structure/spacevine/dense, -/obj/structure/spacevine, -/turf/open/floor/plating, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"Hi" = ( +"Hu" = ( +/obj/effect/decal/cleanable/vomit/old, +/obj/structure/spider/stickyweb, /obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/mineral/plastitanium, +/area/overmap_encounter/planetoid/jungle/explored) +"Hw" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/grass{ + desc = "A patch of grass. It looks well manicured"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Hy" = ( +/obj/structure/railing, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Hj" = ( +"HD" = ( /obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/power/floodlight{ + anchored = 1; + state_open = 1 + }, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, +/obj/structure/spider/stickyweb, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 4 }, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Ho" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"Hp" = ( -/obj/structure/spacevine, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"Hq" = ( -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/obj/effect/decal/cleanable/molten_object/large, +"HE" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Hr" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"Hs" = ( -/obj/structure/table, -/obj/item/wallframe/apc, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/grimy, -/area/ruin/jungle/starport) -"Hv" = ( -/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"HG" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/directional/east, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"HH" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland0" }, /area/overmap_encounter/planetoid/jungle/explored) -"Hx" = ( +"HK" = ( +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/metal, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/girder/displaced, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Hz" = ( -/obj/effect/turf_decal/industrial/traffic/corner{ - dir = 8 - }, -/turf/open/floor/concrete{ +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"HB" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"HO" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland0" }, /area/overmap_encounter/planetoid/jungle/explored) -"HF" = ( +"HR" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"HS" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-10" }, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"HG" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom/directional/east, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"HI" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ +"HU" = ( +/obj/effect/turf_decal/industrial/traffic{ + dir = 4 + }, +/turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"HM" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"HT" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"HV" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) "HW" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"HX" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +"HY" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 + }, +/obj/structure/railing, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "HZ" = ( @@ -4990,76 +5074,70 @@ /obj/structure/chair, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"Ie" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"Ig" = ( +/obj/structure/spider/stickyweb, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"Ii" = ( +"Ik" = ( +/obj/structure/flora/junglebush, /obj/structure/flora/junglebush/b, -/obj/structure/flora/junglebush/c, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ij" = ( -/obj/effect/turf_decal/industrial/traffic/corner{ +"Io" = ( +/obj/structure/chair/comfy/shuttle{ + name = "Grav Couch"; dir = 4 }, -/turf/open/floor/concrete{ +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport) +"Is" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ik" = ( -/turf/closed/wall/rust, +"Iv" = ( +/obj/item/chair, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"Il" = ( -/obj/structure/railing/corner, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"Iw" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Im" = ( +"Ix" = ( /obj/structure/railing{ - dir = 5 + dir = 4 }, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Io" = ( -/obj/structure/chair/comfy/shuttle{ - name = "Grav Couch"; - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/jungle/starport) -"Iq" = ( -/obj/structure/flora/rock/pile, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland5" +"Iz" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"It" = ( +"IB" = ( /obj/structure/spacevine/dense, -/obj/structure/flora/junglebush/large, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Iy" = ( -/obj/effect/turf_decal/arrows, +"IC" = ( /obj/structure/spacevine/dense, -/turf/open/floor/concrete{ +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5067,24 +5145,9 @@ /obj/item/stack/ore/salvage/scrapmetal/five, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"IF" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/ash, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"IG" = ( -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"II" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/dirt/jungle{ +"IH" = ( +/obj/machinery/light/broken/directional/east, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5095,150 +5158,126 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/ruin/jungle/starport) -"IN" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) -"IQ" = ( -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"IR" = ( -/turf/open/floor/mineral/plastitanium, +"IM" = ( +/obj/structure{ + desc = "A devastating strike weapon of times past. The mountings seem broken now."; + dir = 4; + icon = 'icons/mecha/mecha_equipment.dmi'; + icon_state = "mecha_missilerack_six"; + name = "ancient missile rack"; + pixel_x = -26; + pixel_y = -5 + }, +/obj/effect/decal/remains/human, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"IU" = ( +"IO" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"IW" = ( -/obj/structure/cable{ - icon_state = "2-4" +"IP" = ( +/obj/effect/decal/cleanable/molten_object/large, +/obj/effect/radiation{ + rad_power = 99; + rad_range = 3 }, -/obj/structure/cable{ - icon_state = "1-2" +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +/area/overmap_encounter/planetoid/jungle/explored) +"IT" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" }, /area/overmap_encounter/planetoid/jungle/explored) "IY" = ( /obj/structure/table/rolling, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"IZ" = ( -/obj/structure/spacevine, -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, +"Ja" = ( +/obj/structure/table/reinforced, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) -"Jd" = ( -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"Jb" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Je" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/structure/sign/syndicate{ - pixel_y = 32 +/obj/effect/turf_decal/weather/dirt{ + dir = 6 }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"Jc" = ( +/obj/structure/frame/computer, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Jj" = ( -/turf/open/floor/plasteel/stairs/left{ - dir = 8 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Jn" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +"Jf" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Jo" = ( -/obj/structure/spacevine, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"Js" = ( -/obj/structure/flora/tree/jungle/small, -/obj/structure/flora/grass/jungle/b, +"Jh" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree4" + }, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Jt" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +"Jm" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plating/rust, +/area/ruin/jungle/starport) +"Jw" = ( +/obj/structure/railing{ + dir = 10 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Ju" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 +/obj/structure/railing/corner{ + dir = 8; + pixel_x = 23 }, -/turf/open/floor/plating, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) -"JA" = ( -/obj/structure/chair/comfy/shuttle{ - name = "Grav Couch"; - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, +"Jx" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) -"JB" = ( -/obj/effect/turf_decal/industrial/warning/corner, +"Jz" = ( +/obj/effect/turf_decal/arrows, /turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"JC" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"JG" = ( -/obj/effect/turf_decal/borderfloor/corner{ - dir = 1 +"JD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "1-8" }, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"JH" = ( -/obj/structure{ - desc = "A devastating strike weapon of times past. The mountings seem broken now."; - dir = 4; - icon = 'icons/mecha/mecha_equipment.dmi'; - icon_state = "mecha_missilerack_six"; - name = "ancient missile rack"; - pixel_x = -26; - pixel_y = -5 +/obj/structure/cable{ + icon_state = "1-6" }, -/obj/effect/decal/remains/human, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"JI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland3" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"JK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine/dense, +"JE" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5246,53 +5285,54 @@ /obj/machinery/atmospherics/components/unary/portables_connector, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"JN" = ( -/obj/structure/spacevine, -/obj/structure/flora/rock/jungle, +"JM" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/junglebush/b, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"JO" = ( -/obj/structure/railing{ - dir = 4 +"JS" = ( +/obj/structure/railing/corner{ + dir = 8 }, /obj/structure/spacevine, /turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"JP" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-6" +"JV" = ( +/obj/structure/railing, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +/area/overmap_encounter/planetoid/jungle/explored) +"JW" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spider/cocoon, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"JQ" = ( -/obj/effect/decal/cleanable/ash/large, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland0" +"JX" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport/tower) +"JY" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"JR" = ( -/obj/item/radio/intercom/directional/north{ - pixel_y = 24 +"Ka" = ( +/obj/structure/spider/stickyweb, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/obj/item/stack/sheet/metal, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel, -/area/ruin/jungle/starport) -"JT" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) -"JU" = ( +"Kc" = ( /obj/effect/turf_decal/industrial/traffic/corner{ dir = 8 }, @@ -5300,62 +5340,66 @@ icon_state = "platingdmg2" }, /area/overmap_encounter/planetoid/jungle/explored) -"JX" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/mineral/plastitanium, -/area/ruin/jungle/starport/tower) -"Kb" = ( -/obj/effect/turf_decal/industrial/traffic{ - dir = 4 +"Kd" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" }, -/turf/open/floor/concrete{ - light_range = 2 +/area/overmap_encounter/planetoid/jungle/explored) +"Kh" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, /area/overmap_encounter/planetoid/jungle/explored) -"Km" = ( +"Ki" = ( +/obj/effect/decal/remains/human, /obj/structure/spider/stickyweb, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ko" = ( -/obj/structure/closet/firecloset/full{ - anchored = 1 +"Kk" = ( +/obj/structure/spacevine, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/obj/item/extinguisher/advanced, -/obj/effect/turf_decal/borderfloor{ +/area/overmap_encounter/planetoid/jungle/explored) +"Kl" = ( +/obj/structure/railing{ dir = 1 }, -/obj/item/geiger_counter, -/turf/open/floor/plating, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"Kq" = ( -/obj/effect/turf_decal/industrial/stand_clear{ +"Kn" = ( +/obj/structure/flora/junglebush, +/obj/structure/flora/junglebush/b, +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Kw" = ( +/obj/structure/railing{ dir = 8 }, /obj/structure/spacevine/dense, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"Ks" = ( -/obj/structure/railing/corner, -/obj/structure/spacevine, /turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Kv" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 +"Kx" = ( +/obj/item/clothing/under/syndicate/aclfgrunt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, /area/overmap_encounter/planetoid/jungle/explored) -"Kw" = ( -/obj/structure/girder, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) "Kz" = ( /obj/machinery/atmospherics/components/unary/portables_connector{ dir = 4 @@ -5365,22 +5409,62 @@ /obj/machinery/light/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/plasma) +"KB" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/light/broken/directional/north, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"KC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"KD" = ( +/obj/structure/sign/syndicate{ + pixel_y = -32 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "KE" = ( /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"KJ" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 8 +"KF" = ( +/obj/effect/turf_decal/industrial/warning/corner, +/turf/open/floor/concrete{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"KM" = ( -/obj/effect/turf_decal/box/corners, -/obj/structure/spacevine, -/turf/open/floor/concrete/slab_1{ +"KG" = ( +/obj/machinery/processor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"KL" = ( +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/item/stack/cable_coil/cut/red, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"KN" = ( +/obj/item/stack/cable_coil/cut/red, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5391,61 +5475,70 @@ /obj/item/wallframe/apc, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"KP" = ( -/obj/structure/door_assembly, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"KQ" = ( +/obj/structure/spacevine, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt, +/area/overmap_encounter/planetoid/jungle/explored) +"KR" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"KS" = ( -/obj/effect/turf_decal/industrial/stand_clear{ +"KX" = ( +/obj/structure/railing/corner{ dir = 8 }, -/obj/structure/spacevine/dense, +/obj/machinery/light/directional/west, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"KT" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +"KY" = ( +/turf/closed/wall/concrete/reinforced, /area/overmap_encounter/planetoid/jungle/explored) -"KU" = ( +"La" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/ruin/jungle/starport) +"Lb" = ( /obj/structure/flora/rock/pile, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland6" + icon_state = "wasteland2" }, /area/overmap_encounter/planetoid/jungle/explored) -"KW" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland7" +"Lf" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"La" = ( -/turf/open/floor/wood{ - icon_state = "wood-broken7" +"Lh" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 }, -/area/ruin/jungle/starport) -"Ld" = ( -/turf/open/floor/plasteel/stairs/left{ - dir = 1 +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Lj" = ( +"Li" = ( /obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt{ - dir = 10 +/obj/structure/flora/rock/jungle, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Ll" = ( -/obj/structure/railing/corner, -/turf/open/floor/concrete/slab_1{ +"Lk" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5458,20 +5551,22 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"Lr" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "1-2" +"Lq" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +/obj/structure/railing, +/turf/open/floor/plasteel/stairs{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) -"Lt" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/cocoon, -/turf/open/floor/plating/rust, +"Lu" = ( +/obj/structure/flora/tree/jungle/small{ + icon_state = "tree5" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "Lv" = ( /obj/structure/railing{ @@ -5480,15 +5575,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"Lz" = ( -/obj/item/weldingtool, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"Lx" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) -"LA" = ( -/obj/structure/flora/junglebush/b, -/turf/open/floor/plating/grass/jungle{ +"Ly" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -5496,30 +5591,36 @@ /obj/structure/tank_dispenser/oxygen, /turf/open/floor/vault, /area/ruin/jungle/starport) -"LD" = ( -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"LF" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, /area/overmap_encounter/planetoid/jungle/explored) -"LG" = ( -/obj/structure/railing/corner{ - dir = 8 +"LJ" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"LH" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"LI" = ( -/obj/machinery/atmospherics/pipe/manifold/orange{ - dir = 8 +"LK" = ( +/obj/machinery/suit_storage_unit/industrial/atmos_firesuit, +/obj/item/watertank/atmos, +/turf/open/floor/vault, +/area/overmap_encounter/planetoid/jungle/explored) +"LL" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "LM" = ( /obj/structure/closet, @@ -5532,11 +5633,11 @@ icon_state = "wood-broken2" }, /area/ruin/jungle/starport) -"LO" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland6" - }, +"LN" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/spider/stickyweb, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "LP" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -5544,174 +5645,140 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport) -"LT" = ( -/obj/structure/railing, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"LU" = ( -/obj/item/geiger_counter, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/concrete{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"LV" = ( -/obj/structure/table, +"LY" = ( /obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"LW" = ( -/obj/structure/closet/emcloset/anchored, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/concrete/reinforced{ +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"LX" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"Ma" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/junglebush/large, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Mc" = ( -/obj/structure/railing, -/obj/effect/decal/cleanable/oil, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Mg" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" }, -/area/overmap_encounter/planetoid/jungle/explored) -"Mf" = ( -/obj/structure/spacevine, -/obj/machinery/light/directional/west, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Mh" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/plasteel/grimy, -/area/ruin/jungle/starport) "Mi" = ( /obj/machinery/light/broken/directional/west, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"Mq" = ( -/turf/open/floor/concrete{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Mr" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/ruin/jungle/starport) -"Mu" = ( -/obj/effect/decal/remains/human, +"Mk" = ( /obj/structure/spider/stickyweb, /turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) -"Mz" = ( +"Ml" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/spacevine, -/turf/open/floor/plating/rust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland0" + }, /area/overmap_encounter/planetoid/jungle/explored) -"MC" = ( +"Mp" = ( +/obj/structure/table{ + name = "officer's table"; + desc = "A square piece of metal standing on four metal legs. It can not move. This one feels more important than the others" + }, /obj/structure/spider/stickyweb, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/stairs/medium, -/area/overmap_encounter/planetoid/jungle/explored) -"MD" = ( /obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"MG" = ( -/obj/effect/turf_decal/arrows{ - dir = 4 +"Mr" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/ruin/jungle/starport) +"Mt" = ( +/obj/structure/railing/corner{ + dir = 8 }, +/obj/machinery/light/broken/directional/west, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"MI" = ( +"Mv" = ( +/obj/effect/decal/cleanable/oil, /obj/structure/railing, -/obj/item/stack/ore/salvage/scrapmetal/five, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"MJ" = ( -/obj/structure/railing/corner, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Mx" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport/plasma) +"ME" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland9" }, /area/overmap_encounter/planetoid/jungle/explored) -"MK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ +"MF" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"MN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +"MH" = ( +/turf/open/floor/plasteel/stairs{ + dir = 4 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "MQ" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"MR" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +"MS" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/obj/item/stack/sheet/mineral/plastitanium, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"MT" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/jungle{ +"MU" = ( +/obj/structure/railing, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"MW" = ( +/obj/structure/railing, +/turf/open/floor/plasteel/stairs{ + dir = 4 + }, +/area/overmap_encounter/planetoid/jungle/explored) "MX" = ( /obj/structure/curtain, /obj/structure/spider/stickyweb, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"MY" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland0" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Na" = ( -/obj/effect/decal/remains/human, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, +"MZ" = ( +/obj/item/chair, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Nc" = ( +"Nb" = ( /obj/structure/spacevine, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/turf/open/floor/concrete/reinforced{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "Nd" = ( @@ -5719,11 +5786,17 @@ /obj/structure/spacevine, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"Ng" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 4 +"Ne" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plating/rust, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Nf" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/vault, /area/overmap_encounter/planetoid/jungle/explored) "Nh" = ( /obj/structure/filingcabinet, @@ -5732,18 +5805,50 @@ /obj/item/ammo_box/magazine/m10mm, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"Nl" = ( -/obj/structure/railing{ +"Nj" = ( +/obj/effect/turf_decal/borderfloor{ dir = 1 }, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"Nk" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"Nn" = ( +/obj/effect/turf_decal/box/corners, +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Nm" = ( -/obj/structure/table/reinforced, -/obj/structure/spider/stickyweb, -/turf/open/floor/plasteel/dark, +"No" = ( +/obj/effect/decal/cleanable/insectguts, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Nq" = ( +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Nr" = ( +/obj/structure/spacevine, +/obj/structure/flora/grass/jungle, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "Nt" = ( /obj/structure/cable{ @@ -5752,71 +5857,72 @@ /obj/machinery/power/rtg/geothermal, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Nx" = ( -/obj/effect/decal/cleanable/molten_object/large, -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 +"Nw" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 }, -/area/overmap_encounter/planetoid/jungle/explored) -"NB" = ( -/obj/effect/turf_decal/arrows, -/turf/open/floor/concrete{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"NC" = ( -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"NE" = ( -/obj/structure/railing{ - dir = 10 - }, +"NA" = ( /obj/effect/turf_decal/weather/dirt{ - dir = 6 + dir = 8 }, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"NL" = ( -/obj/structure/cable{ - icon_state = "1-2" +"ND" = ( +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/turf/open/floor/plasteel/stairs/medium, /area/overmap_encounter/planetoid/jungle/explored) -"NM" = ( -/obj/item/stack/cable_coil/cut/red, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/concrete/reinforced{ +"NF" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"NN" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/grass{ - desc = "A patch of grass. It looks well manicured"; - light_range = 2 +"NK" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"NO" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"NU" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/junglebush, -/turf/open/floor/plating/grass/jungle{ +"NW" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 4; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = -26 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"NZ" = ( -/obj/structure/railing{ - dir = 10 +"NX" = ( +/obj/structure/table, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +/area/overmap_encounter/planetoid/jungle/explored) +"Oa" = ( +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) "Ob" = ( @@ -5828,20 +5934,44 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) +"Oc" = ( +/obj/item/stack/sheet/metal, +/obj/item/stack/sheet/metal, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "Od" = ( /obj/structure/girder/displaced, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Oi" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 5 +"Oe" = ( +/obj/structure/cable{ + icon_state = "5-8" }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"Oj" = ( -/obj/structure/reagent_dispensers/watertank, /obj/structure/spider/stickyweb, -/turf/open/floor/vault, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Og" = ( +/obj/structure/flora/tree/jungle{ + icon_state = "tree2" + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Oh" = ( +/obj/structure/railing/corner, +/obj/structure/spacevine, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "Ok" = ( /obj/structure/spacevine/dense, @@ -5850,71 +5980,67 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"On" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, -/turf/open/floor/plasteel, +"Om" = ( +/obj/structure/rack, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/glass/twenty, +/obj/item/stack/sheet/glass/twenty, +/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) -"Op" = ( -/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, -/obj/structure/spider/cocoon, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 +"Or" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/turf/open/floor/plating, -/area/ruin/jungle/starport) -"Ou" = ( -/obj/structure/table, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Ox" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom/wideband/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"Oz" = ( -/obj/effect/turf_decal/industrial/traffic/corner{ - dir = 2 - }, -/turf/open/floor/concrete{ +"Os" = ( +/obj/structure/door_assembly, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"OA" = ( +"Ow" = ( +/obj/structure/catwalk/over/plated_catwalk, /obj/structure/cable{ - icon_state = "5-10" + icon_state = "4-8" }, -/obj/structure/spider/stickyweb, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 }, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"OC" = ( -/obj/structure/flora/grass/jungle, -/obj/structure/flora/junglebush/c, -/turf/open/floor/plating/grass/jungle{ +"Ox" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/wideband/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"OB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/remains/human, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"OG" = ( -/obj/structure/rack, -/turf/open/floor/vault, -/area/overmap_encounter/planetoid/jungle/explored) "OI" = ( /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"OJ" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/railing, +"OK" = ( +/obj/structure/sign/syndicate{ + pixel_x = -32 + }, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"OL" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "OM" = ( /obj/machinery/power/shuttle/engine/fueled/plasma{ dir = 4 @@ -5922,24 +6048,23 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/engine/hull, /area/ruin/jungle/starport) -"ON" = ( -/obj/structure/cable{ - icon_state = "1-2" +"OQ" = ( +/obj/structure/flora/grass/jungle, +/obj/structure/flora/tree/jungle{ + icon_state = "tree10" }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle{ +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"OT" = ( -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 - }, -/obj/effect/decal/cleanable/molten_object, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug" - }, +"OR" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"OU" = ( +/obj/item/stack/cable_coil/cut/red, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) "OW" = ( /obj/item/stack/ore/salvage/scrapmetal/five, @@ -5949,12 +6074,20 @@ /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"Pb" = ( +"Pa" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/dirt, +/area/overmap_encounter/planetoid/jungle/explored) +"Pc" = ( /obj/structure/spacevine/dense, /turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" + icon_state = "wasteland6" }, /area/overmap_encounter/planetoid/jungle/explored) +"Pe" = ( +/obj/item/stack/sheet/mineral/plastitanium, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) "Pf" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -5972,16 +6105,54 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Pi" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +"Pk" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" }, /area/overmap_encounter/planetoid/jungle/explored) -"Pq" = ( -/obj/effect/decal/cleanable/ash, +"Pl" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/nurse, /turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) +"Pm" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Pn" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Po" = ( +/turf/open/floor/plasteel/stairs/left{ + dir = 8 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Pr" = ( +/obj/structure/girder/displaced, +/turf/open/floor/mineral/plastitanium, +/area/overmap_encounter/planetoid/jungle/explored) +"Ps" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs, +/area/overmap_encounter/planetoid/jungle/explored) +"Pv" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) "Pw" = ( /obj/structure/table/reinforced, /obj/item/pen{ @@ -5995,6 +6166,9 @@ /obj/structure/spacevine/dense, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) +"Py" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/overmap_encounter/planetoid/jungle/explored) "Pz" = ( /obj/structure/railing{ dir = 8 @@ -6003,6 +6177,16 @@ /obj/structure/chair, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) +"PA" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"PB" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) "PC" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/structure/window/plasma/reinforced{ @@ -6015,75 +6199,45 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) +"PI" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/overmap_encounter/planetoid/jungle/explored) "PJ" = ( /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"PL" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +"PN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland0" }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"PO" = ( -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 10; - pixel_y = 5 - }, -/obj/structure/table/rolling, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -10; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher"; - pixel_x = -6; - pixel_y = 5 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"PP" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 }, -/area/overmap_encounter/planetoid/jungle/explored) -"PS" = ( +/obj/item/extinguisher/advanced, +/obj/item/geiger_counter, /obj/structure/railing{ - dir = 10 + dir = 6 }, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"PT" = ( +"PQ" = ( /obj/effect/turf_decal/weather/dirt{ - dir = 9 - }, -/obj/effect/turf_decal/weather/dirt{ - dir = 10 + dir = 1 }, +/obj/effect/turf_decal/weather/dirt, /turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"PU" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/stairs{ - dir = 4 - }, +"PR" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/dirt, /area/overmap_encounter/planetoid/jungle/explored) "PV" = ( /obj/structure/closet, @@ -6097,49 +6251,86 @@ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"PW" = ( -/obj/structure/chair{ - dir = 8 +"PX" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, +/area/overmap_encounter/planetoid/jungle/explored) +"PY" = ( +/obj/structure/flora/rock, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"PZ" = ( -/obj/structure/railing/corner, -/turf/open/water/jungle, +"Qa" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"Qc" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam4" +"Qb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, /area/overmap_encounter/planetoid/jungle/explored) -"Qe" = ( +"Qg" = ( +/obj/structure/railing, +/obj/structure/spacevine, /obj/structure/railing{ - dir = 1 + dir = 4 }, -/obj/structure/spacevine/dense, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Qh" = ( +"Qj" = ( +/obj/structure/spider/stickyweb, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland0" +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"Qk" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Qi" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree2" +"Ql" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel/tech/techmaint, +/area/overmap_encounter/planetoid/jungle/explored) +"Qo" = ( +/obj/machinery/power/floodlight{ + anchored = 1; + state_open = 1 }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) +"Qp" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 }, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "Qq" = ( /obj/machinery/atmospherics/components/unary/tank/toxins{ @@ -6147,88 +6338,96 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Qr" = ( -/obj/structure/window/plasma/reinforced{ - dir = 4 +"Qy" = ( +/obj/structure/railing{ + dir = 8 }, -/obj/machinery/suit_storage_unit/open, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Qs" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/jungle/starport/plasma) -"Qv" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/machinery/light/broken/directional/south, -/turf/open/floor/plasteel/dark, -/area/overmap_encounter/planetoid/jungle/explored) -"Qw" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel/stairs/medium, -/area/overmap_encounter/planetoid/jungle/explored) -"Qx" = ( -/obj/effect/turf_decal/atmos/plasma, -/obj/structure/railing/corner{ - dir = 1 +"QC" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/spacevine, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"QB" = ( -/obj/item/rack_parts, -/obj/structure/rack, -/turf/open/floor/plasteel/dark, +"QD" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spider/cocoon, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "QE" = ( /turf/closed/wall/mineral/plastitanium, /area/ruin/jungle/starport) -"QK" = ( -/obj/effect/turf_decal/arrows{ - dir = 4 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"QM" = ( -/obj/structure/spacevine, -/obj/structure/flora/junglebush/b, -/obj/structure/flora/grass/jungle, +"QF" = ( +/obj/structure/flora/tree/jungle/small, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"QJ" = ( +/obj/structure/spider/stickyweb, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"QL" = ( +/obj/structure/railing, +/obj/effect/decal/cleanable/oil, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"QN" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "QO" = ( /obj/machinery/suit_storage_unit/industrial/atmos_firesuit, /obj/item/watertank/atmos, /obj/machinery/light/broken/directional/south, /turf/open/floor/vault, /area/ruin/jungle/starport) -"QP" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 +"QS" = ( +/obj/structure/girder/displaced, +/obj/structure/spider/stickyweb, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"QQ" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +"QT" = ( +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 4; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = -26 }, -/area/overmap_encounter/planetoid/jungle/explored) -"QR" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 6 +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 +/area/overmap_encounter/planetoid/jungle/explored) +"QU" = ( +/obj/machinery/door/airlock{ + dir = 4 }, -/turf/open/water/jungle, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plasteel/tech/techmaint, /area/overmap_encounter/planetoid/jungle/explored) "QV" = ( /obj/machinery/power/apc/auto_name/directional/east{ @@ -6237,8 +6436,18 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"QX" = ( -/obj/effect/decal/cleanable/generic, +"QW" = ( +/obj/structure/spider/stickyweb, +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"QY" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, @@ -6248,17 +6457,6 @@ /obj/item/stack/ore/salvage/scrapmetal/five, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"Ra" = ( -/obj/structure/flora/junglebush/c, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Rb" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) "Rc" = ( /obj/structure/closet, /obj/effect/decal/cleanable/dirt/dust, @@ -6267,27 +6465,49 @@ /obj/item/clothing/under/syndicate/combat, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Rj" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/item/stack/ore/salvage/scrapmetal/five, +"Rd" = ( +/obj/effect/radiation{ + rad_power = 180; + rad_range = 2 + }, +/obj/effect/decal/cleanable/molten_object/large, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland_dug"; + light_color = "#a0ad20"; + light_range = 3 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Rf" = ( +/obj/structure/railing, +/turf/open/floor/plating/dirt, +/area/overmap_encounter/planetoid/jungle/explored) +"Rg" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland8" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"Rh" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing{ + dir = 1 + }, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"Ri" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) "Rn" = ( /obj/structure/table/reinforced, /obj/item/folder, /obj/item/paper_bin, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"Rp" = ( -/obj/structure/table, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/overmap_encounter/planetoid/jungle/explored) "Rq" = ( /obj/machinery/power/smes, /obj/structure/cable{ @@ -6295,229 +6515,71 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"Rs" = ( -/obj/structure/fluff/fokoff_sign{ - icon_state = "fokrads"; - desc = "A crudely made sign with the universal radiation hazard symbol painted onto it." - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Rt" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Rw" = ( +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" }, -/area/overmap_encounter/planetoid/jungle/explored) -"Ry" = ( -/obj/structure/flora/rock/jungle, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"RB" = ( -/obj/structure/cable{ - icon_state = "2-5" - }, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"RF" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"RH" = ( -/obj/machinery/light/broken/directional/east, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"RL" = ( -/obj/effect/decal/cleanable/ash, -/obj/structure/spacevine, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"RM" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"RN" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"RT" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, +"Rx" = ( +/obj/structure/railing, /obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 - }, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"RX" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/arrows{ - dir = 8 - }, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Sc" = ( -/obj/effect/turf_decal/industrial/stand_clear{ +"Rz" = ( +/obj/structure/railing{ dir = 8 }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) -"Sd" = ( -/obj/structure/closet, -/obj/machinery/light/broken/directional/east, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/gloves/color/black, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/ruin/jungle/starport) -"Se" = ( -/turf/open/floor/plasteel, -/area/ruin/jungle/starport) -"Sf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/engineering{ - name = "Power Shack" - }, -/turf/open/floor/plating, -/area/ruin/jungle/starport) -"Sg" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/concrete/slab_1{ +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Sh" = ( -/obj/structure/spacevine, -/turf/open/floor/concrete{ +"RC" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/grass/jungle/b, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Si" = ( -/obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Sl" = ( +"RG" = ( +/obj/item/rack_parts, /obj/structure/rack, -/turf/open/floor/vault, -/area/ruin/jungle/starport) -"Sq" = ( -/obj/effect/turf_decal/number/zero{ - pixel_x = -7; - pixel_y = 32 - }, -/obj/effect/turf_decal/number/three{ - pixel_x = 5; - pixel_y = 32 - }, -/obj/structure{ - desc = "A devastating strike weapon of times past. The mountings seem broken now."; - dir = 4; - icon = 'icons/mecha/mecha_equipment.dmi'; - icon_state = "mecha_missilerack_six"; - name = "ancient missile rack"; - pixel_x = -26; - pixel_y = 11 - }, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"St" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plasteel/stairs/right, -/area/overmap_encounter/planetoid/jungle/explored) -"Su" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, +/turf/open/floor/plasteel/dark, /area/overmap_encounter/planetoid/jungle/explored) -"Sv" = ( -/turf/open/floor/vault, -/area/ruin/jungle/starport) -"Sw" = ( -/obj/effect/decal/cleanable/plastic, +"RI" = ( +/obj/effect/decal/cleanable/shreds, /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/ash, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Sx" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"RP" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spacevine, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Sy" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"SA" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"SC" = ( -/obj/structure/flora/tree/jungle/small{ - icon_state = "tree1" +"RQ" = ( +/obj/machinery/power/shuttle/engine/fueled/plasma{ + dir = 8; + anchored = 0 }, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, -/area/overmap_encounter/planetoid/jungle/explored) -"SD" = ( -/turf/open/floor/mineral/plastitanium{ - icon_state = "plastitanium_dam5" - }, -/area/ruin/jungle/starport) -"SF" = ( +/area/overmap_encounter/planetoid/jungle/explored) +"RR" = ( /obj/structure/cable{ - icon_state = "5-10" + icon_state = "6-9" + }, +/obj/structure/cable{ + icon_state = "4-9" }, /obj/structure/spider/stickyweb, /turf/open/floor/plating/dirt/dark{ @@ -6526,42 +6588,101 @@ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"SK" = ( -/obj/structure/catwalk/over/plated_catwalk, +"RU" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"RV" = ( +/obj/structure/spacevine/dense, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"RZ" = ( +/obj/structure/railing, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"Sd" = ( +/obj/structure/closet, +/obj/machinery/light/broken/directional/east, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/gloves/color/black, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/ruin/jungle/starport) +"Se" = ( +/turf/open/floor/plasteel, +/area/ruin/jungle/starport) +"Sf" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/spacevine, +/obj/machinery/door/airlock/engineering{ + name = "Power Shack" + }, +/turf/open/floor/plating, +/area/ruin/jungle/starport) +"Sl" = ( +/obj/structure/rack, +/turf/open/floor/vault, +/area/ruin/jungle/starport) +"Sm" = ( +/turf/closed/wall/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Ss" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 4 }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/jungle/starport/plasma) +"Sv" = ( +/turf/open/floor/vault, +/area/ruin/jungle/starport) +"Sz" = ( +/obj/effect/turf_decal/borderfloor{ + dir = 8 + }, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"SL" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"SB" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"SN" = ( -/obj/structure/railing{ - dir = 2 +"SD" = ( +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam5" }, +/area/ruin/jungle/starport) +"SG" = ( /obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure/flora/grass/jungle, +/obj/structure/flora/junglebush/b, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"SQ" = ( -/obj/structure/railing, -/turf/open/floor/plasteel/stairs{ - dir = 4 +"SH" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"SM" = ( +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" }, /area/overmap_encounter/planetoid/jungle/explored) "SS" = ( @@ -6569,40 +6690,28 @@ /obj/structure/curtain, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"ST" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"SU" = ( -/obj/structure/railing, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"SY" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 4 +"SX" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/spacevine, -/obj/structure/railing, -/turf/open/floor/concrete/slab_1{ +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"SZ" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Ta" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plasteel/grimy, +/area/ruin/jungle/starport) +"Tb" = ( +/obj/structure/spacevine, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Tc" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) "Td" = ( /obj/machinery/atmospherics/components/binary/valve{ @@ -6618,104 +6727,48 @@ icon_state = "plastitanium_dam4" }, /area/ruin/jungle/starport) -"Tf" = ( -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Tg" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/obj/item/stack/cable_coil/cut/red, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Tj" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/structure{ - desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; - dir = 4; - icon = 'icons/obj/turrets.dmi'; - icon_state = "syndie_off"; - name = "defunct laser cannon"; - pixel_x = -26 - }, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Tk" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Tm" = ( -/obj/structure/railing, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "Tn" = ( /obj/machinery/washing_machine, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Tp" = ( -/obj/item/chair, -/obj/item/stack/cable_coil/cut/red, -/turf/open/floor/plating/rust, +"To" = ( +/obj/item/weldingtool, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "Tr" = ( /obj/structure/spider/stickyweb, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"Ts" = ( -/obj/machinery/door/airlock/external, +"Tt" = ( +/obj/effect/turf_decal/arrows{ + dir = 8 + }, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Tv" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/dirt, -/area/overmap_encounter/planetoid/jungle/explored) -"Tw" = ( +"Tu" = ( /obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Tx" = ( -/obj/effect/decal/cleanable/molten_object/large, -/obj/effect/radiation{ - rad_power = 99; - rad_range = 3 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 + dir = 10 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Tz" = ( +"TA" = ( +/obj/structure/flora/grass/jungle, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/concrete/reinforced{ +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"TC" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"TD" = ( +/obj/structure/railing, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "TF" = ( @@ -6725,35 +6778,39 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"TL" = ( -/obj/structure/railing, -/obj/structure/closet/secure_closet/engineering_welding{ - anchored = 1 - }, -/turf/open/floor/concrete/reinforced{ +"TK" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"TM" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle{ +"TN" = ( +/obj/structure/railing/corner, +/obj/effect/decal/cleanable/oil, +/obj/structure/spider/stickyweb, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"TQ" = ( -/obj/effect/decal/cleanable/insectguts, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"TO" = ( +/obj/structure/chair{ + dir = 1 }, +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"TV" = ( -/obj/effect/decal/cleanable/molten_object, -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 +"TT" = ( +/obj/structure/railing/corner, +/obj/machinery/light/broken/directional/east, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" +/area/overmap_encounter/planetoid/jungle/explored) +"TU" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "TW" = ( @@ -6761,15 +6818,23 @@ /obj/item/stack/sheet/metal, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"Ub" = ( -/obj/item/stack/sheet/metal, -/obj/item/stack/sheet/metal, +"TY" = ( +/obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"TZ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/dark, +/area/overmap_encounter/planetoid/jungle/explored) +"Ua" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) "Uc" = ( /obj/structure/spacevine, /obj/structure/salvageable/autolathe, @@ -6781,82 +6846,50 @@ icon_state = "plastitanium_dam4" }, /area/ruin/jungle/starport) -"Uf" = ( -/obj/structure/girder/displaced, -/turf/open/floor/mineral/plastitanium, -/area/overmap_encounter/planetoid/jungle/explored) "Ug" = ( /obj/structure/chair{ dir = 8 }, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"Uh" = ( -/obj/effect/decal/cleanable/ash, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland2" - }, -/area/overmap_encounter/planetoid/jungle/explored) "Uj" = ( /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"Uk" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +"Up" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/area/overmap_encounter/planetoid/jungle/explored) -"Ul" = ( -/obj/structure/table, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/turf/open/floor/plasteel/stairs{ + dir = 4 }, /area/overmap_encounter/planetoid/jungle/explored) -"Um" = ( +"Ur" = ( +/obj/structure/railing{ + dir = 1 + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"Uo" = ( -/obj/structure/railing, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 +/turf/open/floor/plasteel/stairs{ + dir = 8 }, -/turf/open/water/jungle, -/area/overmap_encounter/planetoid/jungle/explored) -"Uq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Uu" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"Us" = ( +/obj/effect/turf_decal/borderfloor/corner{ + dir = 1 }, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"Uv" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-4" +"Ut" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland5" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 9 +/area/overmap_encounter/planetoid/jungle/explored) +"Uw" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "Ux" = ( /obj/structure/spider/stickyweb, @@ -6869,18 +6902,14 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/ruin/jungle/starport) -"UA" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, +"UB" = ( +/obj/structure/spacevine, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"UD" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, +"UC" = ( +/obj/item/chair, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) "UE" = ( /turf/template_noop, @@ -6890,111 +6919,111 @@ /obj/mecha/working/ripley/firefighter, /turf/open/floor/vault, /area/ruin/jungle/starport) -"UH" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/obj/item/stack/sheet/mineral/plastitanium, -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +"UI" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland6" }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"UJ" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 +"UL" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"UM" = ( -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"UO" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree6" +"UQ" = ( +/obj/structure/railing{ + dir = 9 }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"UR" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/grass/jungle/b, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"UP" = ( +"US" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/jungle/wasteland{ icon_state = "wasteland1" }, /area/overmap_encounter/planetoid/jungle/explored) -"UY" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +"UT" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"UZ" = ( -/obj/effect/decal/cleanable/ash/large, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/dirt/jungle{ +"UX" = ( +/obj/structure/spacevine, +/obj/structure/spacevine, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Va" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, +"Vd" = ( +/obj/machinery/light/broken/directional/west, /turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"Vb" = ( +"Vf" = ( /obj/effect/decal/cleanable/glass, -/turf/open/floor/concrete{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Vg" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland1" - }, +/obj/structure/spider/stickyweb, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) "Vh" = ( /obj/item/stack/sheet/metal, /turf/open/floor/plasteel, /area/ruin/jungle/starport) -"Vi" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "Vl" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 4 }, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/plasma) -"Vo" = ( -/obj/effect/radiation{ - rad_power = 66; - rad_range = 2 +"Vm" = ( +/turf/open/floor/plasteel/stairs/right{ + dir = 1 }, -/obj/effect/decal/cleanable/molten_object, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug" +/area/overmap_encounter/planetoid/jungle/explored) +"Vp" = ( +/obj/structure/sign/syndicate{ + pixel_y = -32 + }, +/turf/open/floor/concrete/slab_1{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Vq" = ( -/obj/structure/railing{ - dir = 8 +"Vs" = ( +/obj/structure/cable{ + icon_state = "4-8" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/dirt/dark{ name = "beaten path"; desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Vu" = ( -/obj/structure/frame/machine, -/turf/open/floor/vault, +"Vt" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, /area/overmap_encounter/planetoid/jungle/explored) -"Vw" = ( -/turf/open/floor/plating/grass{ - desc = "A patch of grass. It looks well manicured"; +"Vv" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -7003,94 +7032,82 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/plating/rust, /area/ruin/jungle/starport) -"VA" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "VB" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /turf/open/floor/plating, /area/ruin/jungle/starport) -"VC" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland8" - }, +"VF" = ( +/obj/structure/spider/stickyweb, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"VD" = ( -/obj/item/clothing/under/syndicate/aclfgrunt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +"VJ" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"VI" = ( +"VN" = ( /obj/structure/spacevine, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/concrete/reinforced{ +/obj/structure/flora/junglebush/b, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"VL" = ( -/obj/effect/turf_decal/atmos/plasma, +"VT" = ( +/obj/structure/table, +/obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) -"VM" = ( -/turf/open/floor/plasteel/stairs/left{ - dir = 4 +"VV" = ( +/obj/structure/chair{ + dir = 8 }, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"VO" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/cocoon{ - icon_state = "cocoon3" +"VW" = ( +/obj/structure/railing{ + dir = 8 }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"VQ" = ( -/obj/structure/cable{ - icon_state = "4-8" +"Wd" = ( +/obj/structure/chair{ + dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"We" = ( +/obj/structure/spacevine/dense, +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"VS" = ( +"Wg" = ( /obj/structure/flora/grass/jungle, -/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/junglebush, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Wb" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, +"Wi" = ( +/obj/structure/table_frame, +/turf/open/floor/plasteel, /area/overmap_encounter/planetoid/jungle/explored) -"Wf" = ( -/obj/structure/closet/firecloset/full{ - anchored = 1 - }, -/obj/item/extinguisher/advanced, -/obj/item/geiger_counter, -/obj/structure/railing{ - dir = 6 +"Wk" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 }, -/turf/open/floor/concrete/reinforced{ +/obj/structure/spacevine, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -7103,105 +7120,87 @@ }, /turf/open/floor/plasteel/patterned, /area/ruin/jungle/starport) -"Wn" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) "Wo" = ( /turf/closed/wall, /area/ruin/jungle/starport) -"Wq" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/concrete/reinforced{ +"Wp" = ( +/obj/effect/turf_decal/atmos/plasma, +/obj/structure/spacevine, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"Wt" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/ash, +/obj/item/stack/ore/salvage/scrapmetal/five, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Wr" = ( -/obj/structure/cable{ - icon_state = "1-10" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"Wu" = ( +/obj/structure/spider/stickyweb, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ws" = ( -/obj/structure/spacevine, -/obj/effect/turf_decal/weather/dirt{ - dir = 4 +"Wv" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland7" }, -/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Wy" = ( -/turf/open/floor/plasteel/stairs/right{ +"Ww" = ( +/obj/effect/turf_decal/industrial/traffic{ dir = 8 }, -/area/overmap_encounter/planetoid/jungle/explored) -"Wz" = ( -/obj/structure/flora/rock/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"WE" = ( -/obj/structure/cable{ - icon_state = "1-6" - }, /obj/structure/cable{ - icon_state = "1-10" + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"WF" = ( -/obj/item/chair, -/obj/machinery/light/directional/north, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"WG" = ( -/obj/structure/flora/rock/jungle, -/obj/structure/flora/grass/jungle, +"Wx" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"WI" = ( -/turf/open/floor/plasteel, +"WA" = ( +/obj/effect/decal/cleanable/ash/large, +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"WK" = ( -/obj/effect/turf_decal/weather/dirt{ +"WD" = ( +/obj/structure/girder, +/obj/item/stack/sheet/mineral/plastitanium, +/obj/item/stack/sheet/mineral/plastitanium, +/turf/open/floor/plating/rust, +/area/overmap_encounter/planetoid/jungle/explored) +"WH" = ( +/obj/structure/railing{ dir = 10 }, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 - }, -/turf/open/water/jungle, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"WM" = ( -/obj/item/geiger_counter, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/concrete/slab_1{ +"WJ" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"WN" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt, +"WO" = ( +/obj/structure/door_assembly, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "WQ" = ( /obj/machinery/door/airlock/hatch, @@ -7214,11 +7213,9 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"WS" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, +"WT" = ( +/obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "WU" = ( /obj/machinery/door/airlock/glass{ @@ -7241,22 +7238,18 @@ /obj/item/stack/sheet/metal, /turf/open/floor/plasteel/grimy, /area/ruin/jungle/starport) -"Xc" = ( +"Xb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/generic, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Xd" = ( -/obj/effect/turf_decal/industrial/traffic{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland3" }, -/turf/open/floor/concrete/reinforced{ +/area/overmap_encounter/planetoid/jungle/explored) +"Xe" = ( +/obj/structure/door_assembly, +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -7267,44 +7260,14 @@ icon_state = "wood-broken5" }, /area/ruin/jungle/starport) -"Xi" = ( -/obj/structure/spacevine, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Xj" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 1 - }, -/obj/structure/sign/warning/gasmask{ - pixel_y = 32 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/overmap_encounter/planetoid/jungle/explored) "Xk" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/ruin/jungle/starport) -"Xl" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/vault, -/area/overmap_encounter/planetoid/jungle/explored) -"Xn" = ( -/obj/structure/spacevine, -/obj/structure/spacevine, -/turf/open/floor/concrete/reinforced{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Xo" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 4 - }, -/turf/open/floor/concrete{ +"Xm" = ( +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -7319,22 +7282,14 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Xs" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/structure/flora/grass/jungle/b, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Xu" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/cable{ - icon_state = "4-8" +"Xw" = ( +/obj/machinery/atmospherics/components/unary/shuttle/heater{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/structure/window/plasma/reinforced{ dir = 4 }, -/turf/open/floor/plating, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) "Xz" = ( /obj/structure/table, @@ -7350,18 +7305,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"XB" = ( -/obj/effect/decal/cleanable/molten_object/large, -/obj/effect/radiation{ - rad_power = 180; - rad_range = 3 - }, -/turf/open/floor/plating/dirt/jungle/wasteland{ - icon_state = "wasteland_dug"; - light_color = "#a0ad20"; - light_range = 3 - }, -/area/overmap_encounter/planetoid/jungle/explored) "XC" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/vomit/old, @@ -7370,41 +7313,39 @@ /obj/item/clothing/shoes/combat, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport/tower) -"XF" = ( -/obj/structure/sign/syndicate{ - pixel_y = -32 - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/concrete/slab_1{ +"XN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/flora/junglebush, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"XM" = ( +"XP" = ( /obj/structure/railing, +/obj/structure/closet/secure_closet/engineering_welding{ + anchored = 1 + }, /turf/open/floor/concrete/reinforced{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"XT" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/concrete/slab_1{ - light_range = 2 +"XR" = ( +/turf/open/floor/plasteel/stairs/right{ + dir = 8 }, /area/overmap_encounter/planetoid/jungle/explored) -"XU" = ( -/obj/effect/turf_decal/industrial/traffic/corner{ - dir = 8 +"XV" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/spacevine, -/turf/open/floor/concrete{ - light_range = 2 +/obj/structure/cable{ + icon_state = "1-2" }, -/area/overmap_encounter/planetoid/jungle/explored) -"XW" = ( -/obj/effect/turf_decal/borderfloor{ - dir = 1 +/turf/open/floor/plating/dirt/dark{ + name = "beaten path"; + desc = "Upon closer examination, it's dirt, compacted down by much walking"; + light_range = 2 }, -/turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "XX" = ( /obj/structure/closet, @@ -7416,89 +7357,63 @@ icon_state = "platingdmg1" }, /area/ruin/jungle/starport) -"XY" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/obj/structure/spider/stickyweb, -/turf/open/floor/concrete/slab_1{ - light_range = 2 - }, +"Ya" = ( +/obj/structure/spacevine/dense, +/turf/open/water/jungle, /area/overmap_encounter/planetoid/jungle/explored) -"Yb" = ( -/obj/item/chair, +"Yh" = ( +/obj/structure/spacevine, /obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"Yc" = ( -/obj/structure/flora/junglebush, -/obj/structure/flora/grass/jungle, -/turf/open/floor/plating/grass/jungle{ - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Yf" = ( -/obj/structure/girder/displaced, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Yj" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating, -/area/ruin/jungle/starport) -"Yl" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/north{ - pixel_y = 24 - }, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/plasteel/grimy, -/area/ruin/jungle/starport) -"Yp" = ( -/obj/structure/cable{ - icon_state = "6-9" - }, -/obj/structure/cable{ - icon_state = "4-9" - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 - }, -/area/overmap_encounter/planetoid/jungle/explored) -"Yr" = ( -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/jungle/starport/tower) -"Ys" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"Yi" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Yu" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree10" +"Yj" = ( +/obj/structure/spider/stickyweb, +/turf/open/floor/plating, +/area/ruin/jungle/starport) +"Ym" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 }, -/turf/open/floor/plating/grass/jungle{ +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Yv" = ( -/obj/structure/railing{ - dir = 5 +"Yn" = ( +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/effect/decal/cleanable/glass, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"Yo" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/mineral/plastitanium, +/area/overmap_encounter/planetoid/jungle/explored) +"Yr" = ( +/obj/structure/table/reinforced, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/jungle/starport/tower) +"Yw" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +/turf/open/floor/plating/grass{ + desc = "A patch of grass. It looks well manicured"; + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) "Yx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7506,30 +7421,46 @@ /obj/structure/spacevine, /turf/open/floor/mineral/plastitanium, /area/ruin/jungle/starport) -"Yy" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/turf/open/water/jungle, +"Yz" = ( +/obj/effect/decal/cleanable/glass, +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, +/turf/open/floor/mineral/plastitanium, /area/overmap_encounter/planetoid/jungle/explored) "YA" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) -"YB" = ( -/obj/structure/flora/rock/pile, +"YC" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 8 + }, +/turf/open/floor/concrete{ + light_range = 2 + }, +/area/overmap_encounter/planetoid/jungle/explored) +"YD" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/spacevine, /turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) "YE" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) -"YG" = ( -/obj/machinery/power/shuttle/engine/fueled/plasma{ - dir = 8; - anchored = 0 +/obj/effect/decal/cleanable/shreds, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/grass/jungle{ + light_range = 2 }, -/turf/open/floor/concrete/slab_1{ +/area/overmap_encounter/planetoid/jungle/explored) +"YH" = ( +/obj/effect/decal/cleanable/shreds, +/obj/item/stack/sheet/metal, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) @@ -7540,139 +7471,204 @@ icon_state = "panelscorched" }, /area/ruin/jungle/starport) -"YM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 4 - }, -/turf/open/floor/concrete/reinforced{ - light_range = 2 +"YL" = ( +/obj/structure/spacevine, +/turf/closed/wall/concrete/reinforced, +/area/overmap_encounter/planetoid/jungle/explored) +"YN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland5" }, /area/overmap_encounter/planetoid/jungle/explored) -"YO" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/concrete/slab_1{ +"YP" = ( +/obj/structure/flora/grass/jungle/b, +/obj/structure/flora/grass/jungle, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"YQ" = ( +/obj/structure/table, +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/overmap_encounter/planetoid/jungle/explored) "YR" = ( /obj/structure/closet, /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/ruin/jungle/starport) -"YT" = ( -/obj/structure/flora/tree/jungle{ - icon_state = "tree4" +"YS" = ( +/obj/structure/spider/stickyweb, +/obj/structure/spider/cocoon{ + icon_state = "cocoon3" }, +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"YV" = ( +/obj/structure/flora/junglebush/large, /turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"YU" = ( -/obj/structure/cable{ - icon_state = "5-8" - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"YW" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/plating/grass/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"YZ" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/rust, +"YX" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/spacevine, +/turf/open/floor/concrete/slab_1{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) -"Zc" = ( -/obj/structure/cable{ - icon_state = "6-9" +"Zd" = ( +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 4 }, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +/obj/structure/spacevine/dense, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Ze" = ( -/obj/structure/railing{ - dir = 8 +"Zg" = ( +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland4" }, -/obj/structure/railing{ +/area/overmap_encounter/planetoid/jungle/explored) +"Zi" = ( +/obj/effect/turf_decal/industrial/warning/corner{ dir = 4 }, -/turf/open/floor/plasteel/stairs, -/area/overmap_encounter/planetoid/jungle/explored) -"Zf" = ( -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/concrete{ + light_range = 2 }, -/turf/open/floor/concrete/reinforced{ +/area/overmap_encounter/planetoid/jungle/explored) +"Zl" = ( +/obj/structure/flora/rock, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Zh" = ( +"Zn" = ( +/obj/structure/table_frame, /obj/structure/spider/stickyweb, -/turf/open/floor/plating/dirt, +/turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) -"Zk" = ( -/obj/structure/spacevine/dense, -/obj/structure/cable{ - icon_state = "5-8" - }, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; +"Zp" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Zo" = ( -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/plasteel, -/area/overmap_encounter/planetoid/jungle/explored) "Zr" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating, /area/ruin/jungle/starport) -"Zs" = ( -/obj/structure/cable{ - icon_state = "2-9" +"Zw" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 }, -/turf/open/floor/plating/dirt/jungle{ +/obj/structure{ + desc = "A formerly deadly laser cannon, now stuck rusting on a fightercraft."; + dir = 8; + icon = 'icons/obj/turrets.dmi'; + icon_state = "syndie_off"; + name = "defunct laser cannon"; + pixel_x = 26 + }, +/turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"Zw" = ( -/obj/machinery/door/airlock/glass, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating/rust, -/area/overmap_encounter/planetoid/jungle/explored) -"Zz" = ( -/obj/effect/decal/cleanable/vomit/old, +"Zx" = ( +/obj/structure/railing, /turf/open/floor/concrete/slab_1{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ZC" = ( -/obj/effect/turf_decal/box/corners, -/obj/structure/spacevine/dense, -/turf/open/floor/concrete/slab_1{ +"ZA" = ( +/obj/structure/spider/stickyweb, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) -"ZJ" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/poison/giant_spider/hunter, +"ZB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland9" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"ZE" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"ZF" = ( +/obj/structure/spacevine/dense, /turf/open/floor/concrete{ light_range = 2 }, /area/overmap_encounter/planetoid/jungle/explored) +"ZH" = ( +/obj/item/ammo_casing/caseless/rocket{ + desc = "An 84mm high explosive rocket. Looks like they'd fit into a launcher" + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"ZM" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel, +/area/overmap_encounter/planetoid/jungle/explored) +"ZN" = ( +/obj/structure/spider/cocoon, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, +/turf/open/floor/plating, +/area/ruin/jungle/starport) +"ZO" = ( +/obj/item/stack/cable_coil/cut/red, +/turf/open/floor/mineral/plastitanium{ + icon_state = "plastitanium_dam4" + }, +/area/overmap_encounter/planetoid/jungle/explored) +"ZP" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/water/jungle, +/area/overmap_encounter/planetoid/jungle/explored) +"ZR" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/dirt/jungle/wasteland{ + icon_state = "wasteland1" + }, +/area/overmap_encounter/planetoid/jungle/explored) "ZS" = ( -/turf/closed/wall, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/dirt/jungle{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) "ZT" = ( /obj/structure/window/plasma/reinforced/plastitanium, @@ -7682,16 +7678,25 @@ }, /turf/open/floor/plating, /area/ruin/jungle/starport/tower) -"ZU" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/dirt/dark{ - name = "beaten path"; - desc = "Upon closer examination, it's dirt, compacted down by much walking"; - light_range = 2 +"ZX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, /area/overmap_encounter/planetoid/jungle/explored) -"ZW" = ( -/turf/open/water/jungle, +"ZY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 4 + }, +/turf/open/floor/concrete/reinforced{ + light_range = 2 + }, /area/overmap_encounter/planetoid/jungle/explored) (1,1,1) = {" @@ -7726,8 +7731,8 @@ UE UE UE UE -dY -dY +Ee +Ee UE UE UE @@ -7744,13 +7749,13 @@ UE UE UE UE -dY -yH -wg -wg -wg -wg -wg +Ee +Xm +ir +ir +ir +ir +ir UE UE UE @@ -7765,11 +7770,11 @@ UE UE UE UE -wg -wg -Yc -wg -wg +ir +ir +lu +ir +ir "} (2,1,1) = {" UE @@ -7802,11 +7807,11 @@ UE UE UE UE -TM -tW -dY -dl -yH +ce +Ap +Ee +vT +Xm UE UE UE @@ -7820,15 +7825,15 @@ UE UE UE UE -dY -jd -TM -wg -PT -wg -wg -wg -wg +Ee +jO +ce +ir +FB +ir +ir +ir +ir UE UE UE @@ -7840,13 +7845,13 @@ UE UE UE UE -wg -wg -wg -dY -Yc -Yc -wg +ir +ir +ir +Ee +lu +lu +ir "} (3,1,1) = {" UE @@ -7868,23 +7873,23 @@ UE UE UE UE -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ue -TM -TM -qh -TM -tW -DU +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +Ck +ce +ce +zt +ce +Ap +YV UE UE UE @@ -7895,17 +7900,17 @@ UE UE UE UE -dY -jd -tW -TM -wg -PL -ZW -GJ -GJ -ue -wg +Ee +jO +Ap +ce +ir +SH +zN +NA +NA +Ck +ir UE UE UE @@ -7916,14 +7921,14 @@ UE UE UE UE -wg -wg -yH -er -uh -yH -SC -wg +ir +ir +Xm +Cg +Es +Xm +Ah +ir "} (4,1,1) = {" UE @@ -7942,27 +7947,27 @@ UE UE UE UE -Jo -ZW -ZW -ZW -ZW -ZW -ZW -ZW -uB -uB -uB -uB -ZW -ZW -GJ -ue -TM -wg -TM -tW -yH +fl +zN +zN +zN +zN +zN +zN +zN +gC +gC +gC +gC +zN +zN +NA +Ck +ce +ir +ce +Ap +Xm UE UE UE @@ -7970,37 +7975,37 @@ UE UE UE UE -oT -dE -tW -TM -wg -wg -PL -ZW -ZW -ZW -ZW -sr -wg -wg -wg +jk +sD +Ap +ce +ir +ir +SH +zN +zN +zN +zN +PB +ir +ir +ir UE -wg -wg -wg -wg -wg -wg -wg -wm -dY -dY -dY -ad -yH -dE -wg +ir +ir +ir +ir +ir +ir +ir +qQ +Ee +Ee +Ee +OQ +Xm +sD +ir "} (5,1,1) = {" UE @@ -8016,68 +8021,68 @@ UE UE UE UE -ZW -ZW -Jo -Ws -uB -uB -uB -uB -uB -uB -BH -wg -wg -wg -wg -Oi -uB -ZW -ZW -GJ -ue -wg -TM -tW +zN +zN +fl +hk +gC +gC +gC +gC +gC +gC +cv +ir +ir +ir +ir +Ua +gC +zN +zN +NA +Ck +ir +ce +Ap UE UE UE UE UE -yH -oT -oT -TM -TM -wg -wg -PL -ZW -ZW -ZW -ZW -ZW -ZW -GJ -ue -wg -wg -wg -PL -GJ -GJ -GJ -GJ -ue -wg -wg -wg -yH -dE -es -yH -wg +Xm +jk +jk +ce +ce +ir +ir +SH +zN +zN +zN +zN +zN +zN +NA +Ck +ir +ir +ir +SH +NA +NA +NA +NA +Ck +ir +ir +ir +Xm +sD +rf +Xm +ir "} (6,1,1) = {" UE @@ -8092,69 +8097,69 @@ UE UE UE UE -ZW -ZW -uB -Fg -qh -qh +zN +zN +gC +ty +zt +zt dP QE QE QE dP -wg +ir dP QE QE QE dP -wg -Oi -uB -ZW -sr -wg -Rs -tW -yH -OC -yH -yH -yH -DU -CO -wg -wg -PL -GJ -GJ -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -GJ -GJ -GJ -ZW -ZW -ZW -ZW -ZW -ZW -ue -wg -wg -yH -Js -dE -wg -wg +ir +Ua +gC +zN +PB +ir +gP +Ap +Xm +Hk +Xm +Xm +Xm +YV +YW +ir +ir +SH +NA +NA +zN +zN +zN +zN +zN +zN +zN +zN +zN +NA +NA +NA +zN +zN +zN +zN +zN +zN +Ck +ir +ir +Xm +QF +sD +ir +ir "} (7,1,1) = {" UE @@ -8167,13 +8172,13 @@ UE UE UE UE -ZW -ZW -ZW -sr -qh -qh -qh +zN +zN +zN +PB +zt +zt +zt dP QE qP @@ -8187,50 +8192,50 @@ yQ qP QE dP -wg -wg -vm -ZW -ue -wg -wg -yH -dY -dY -OC -tW -TM -wg -wg -PL -ZW -ZW -ZW -ZW -ZW -ZW -ZW -uB -uB -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ue -wg -wg -yH -wg -wg +ir +ir +ju +zN +Ck +ir +ir +Xm +Ee +Ee +Hk +Ap +ce +ir +ir +SH +zN +zN +zN +zN +zN +zN +zN +gC +gC +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +Ck +ir +ir +Xm +ir +ir UE "} (8,1,1) = {" @@ -8244,13 +8249,13 @@ UE UE UE UE -ZW -ZW -ZW -sr -TM -oF -yH +zN +zN +zN +PB +ce +Lu +Xm QE aZ bF @@ -8264,49 +8269,49 @@ bF SD Sv QE -wg -wg -vm -ZW -sr -wg -wg -TM -TM -TM -TM -TM -wg -wg -PL -ZW -uB -uB -uB -uB -uB -uB -BH -wg -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ue -wg -wg -wg +ir +ir +ju +zN +PB +ir +ir +ce +ce +ce +ce +ce +ir +ir +SH +zN +gC +gC +gC +gC +gC +gC +cv +ir +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +Ck +ir +ir +ir UE UE "} @@ -8319,15 +8324,15 @@ UE UE UE UE -ZW -ZW -ZW -ZW -ZW -BH -TM -tW -TM +zN +zN +zN +zN +zN +cv +ce +Ap +ce QE Fb bF @@ -8341,48 +8346,48 @@ Te bF QO QE -wg -TM -Oi -ZW -ZW -GJ -GJ -GJ -wQ -wQ -wQ -GJ -GJ -GJ -ZW -BH -qh -qh -wg -wg -wg -wg -wg -Rs -PL -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -WK -wg +ir +ce +Ua +zN +zN +NA +NA +NA +nb +nb +nb +NA +NA +NA +zN +cv +zt +zt +ir +ir +ir +ir +ir +gP +SH +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +ZP +ir UE UE UE @@ -8396,15 +8401,15 @@ UE UE UE UE -ZW -ZW -ZW -ZW -BH -wg -wg -wg -wg +zN +zN +zN +zN +cv +ir +ir +ir +ir QE Sl bF @@ -8418,48 +8423,48 @@ aj bF wP QE -wg -tW -TM -Oi -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -uB -BH -wg -TM -TM -qh -UD -yH -yH -YT -dE -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg -wg +ir +Ap +ce +Ua +zN +zN +zN +zN +zN +zN +zN +zN +gC +cv +ir +ce +ce +zt +KR +Xm +Xm +Jh +sD +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir +ir UE UE UE @@ -8472,16 +8477,16 @@ UE UE UE UE -ZW -ZW -ZW -uB -BH -wg -wg -wg -OT -xr +zN +zN +zN +gC +cv +ir +ir +ir +sz +da dP QE LC @@ -8495,49 +8500,49 @@ rd UG QE dP -wg -DA -tW -TM -Oi -uB -uB -uB -uB -uB -uB -BH -wg -wg -wg -wg -TM -TM -yH -yH -yH -yH -dE -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ue -wg -wm +ir +uy +Ap +ce +Ua +gC +gC +gC +gC +gC +gC +cv +ir +ir +ir +ir +ce +ce +Xm +Xm +Xm +Xm +sD +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +Ck +ir +qQ UE UE "} @@ -8548,18 +8553,18 @@ UE UE UE UE -ZW -ZW -uB -BH -wg -wg -wg -wg -yH -NC -wg -wg +zN +zN +gC +cv +ir +ir +ir +ir +Xm +Fz +ir +ir dP QE QE @@ -8571,50 +8576,50 @@ QE QE QE dP -qh -qh -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -yH -yH -TM -br -br -qz -am -dE -TM -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg -wg +zt +zt +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +Xm +Xm +ce +Nr +Nr +CQ +UR +sD +ce +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir +ir UE UE "} @@ -8624,74 +8629,74 @@ UE UE UE UE -ZW -PZ -hG -Rt -Rt -Rt -Rt -Rt -Rt -Rt -bw -Rt -Rt -Wq -NZ -wg -uA -RM -AB -Bk -zI -Il -hu -vR -Eb -Gj -Gj -Rt -Rt -Rt -Rt -Eb -Eb -Eb -NZ -wg -wg -yH -tW -yH -yH -yH -yH -Qi -jd -jd -yH -TM -wg -vm -ZW -ZW -ZW -uB -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ue -wg +zN +xL +Fw +Rz +Rz +Rz +Rz +Rz +Rz +Rz +EZ +Rz +Rz +sn +nH +ir +Hy +IB +tF +Nb +PX +kz +ub +JS +iC +Kw +Kw +Rz +Rz +Rz +Rz +iC +iC +iC +nH +ir +ir +Xm +Ap +Xm +Xm +Xm +Xm +Og +jO +jO +Xm +ce +ir +ju +zN +zN +zN +gC +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +Ck +ir UE UE "} @@ -8700,75 +8705,75 @@ UE UE UE UE -ZW -ZW -ej -Tf -MJ -kO -bR -bR -bR -bR -bR -bR -bR -Ju -Ef -XM -wg -uA -Tf -Bi -Tf -Nl -qs -Bk -Ks -JO -bR -bR -bR -bR -bR -bR -bR -Ng -lt -vR -NZ -wg -wg -yH -tW -tW -yH -yH -yH -UD -dl -jd -TM -PL -ZW -uB -ZW -sr -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg +zN +zN +RZ +qW +pz +WJ +KY +KY +KY +KY +KY +KY +KY +GR +fT +MU +ir +Hy +qW +Nk +qW +eO +vX +Nb +CK +ts +KY +KY +KY +KY +KY +KY +KY +gX +dj +JS +nH +ir +ir +Xm +Ap +Ap +Xm +Xm +Xm +KR +vT +jO +ce +SH +zN +gC +zN +PB +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir UE UE "} @@ -8776,244 +8781,244 @@ UE UE UE UE -wg -vm -ZW -ej -Tf -XM -cC -FM -cC -cC -cg -cC -Su -gK -PS -XW -XM -wg -uA -pB -AB -Tf -Nl -qs -Xn -Mc -lh -Mf -cC -cC -cg -cC -EG -oW -PS -XW -Tf -XM -TM -tW -yH -yH -wg -QM -cJ -Gy -uN -yH -TM -wg -vm -sr -wg -vm -BH -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg +ir +ju +zN +RZ +qW +MU +ND +DV +ND +ND +cz +ND +dg +Mt +bA +yf +MU +ir +Hy +Jf +tF +qW +eO +vX +UX +QL +je +Bc +ND +ND +cz +ND +Or +KX +bA +yf +qW +MU +ce +Ap +Xm +Xm +ir +VN +SG +cq +Cj +Xm +ce +ir +ju +PB +ir +ju +cv +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir UE UE "} (16,1,1) = {" UE -wg -TM -wg -vm -ZW -ej -Tf -XM -cC -GZ -cC -cC +ir +ce +ir +ju +zN +RZ +qW +MU +ND +ft +ND +ND QE -cC -Su -HT -iJ -rb -XM -wg -qs -RM -Um -Tf -cV -hu -Tf -TL -xt -jn -EG -cC +ND +dg +uR +Zx +GE +MU +ir +vX +IB +UL +qW +oH +ub +qW +XP +CU +oL +Or +ND QE -cC -cC -iW -iJ -rb -Bk -Tm -wg -wg -wg -wg -wg -yH -yH -dT -qb -jd -TM -PL -ZW -BH -wg -QR -wg -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg +ND +ND +lw +Zx +GE +Nb +tK +ir +ir +ir +ir +ir +Xm +Xm +JM +qc +jO +ce +SH +zN +cv +ir +lb +ir +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir UE UE "} (17,1,1) = {" -TM -wg -DY -wg -vm -ZW -ej -Tf -XM -cC -cC -cC +ce +ir +sA +ir +ju +zN +RZ +qW +MU +ND +ND +ND ih QE OM -EG -Su -SU -BF -Wq -NZ -qs -Tf -Um -RM -th -Tf -Tf -Wf -cC -cC -cC +Or +dg +TD +nT +sn +nH +vX +qW +UL +IB +Rh +qW +qW +PP +ND +ND +ND ih QE ih -cC -cC -iJ -XW -Tf -rI -wg -wg -UP -tx -wg -yH -yH -UO -yH -dY -wg -vm -sr -wg -TM -wg -wg -PL -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -uB -uB -BH -wg +ND +ND +Zx +yf +qW +CA +ir +ir +hp +ZR +ir +Xm +Xm +Gn +Xm +Ee +ir +ju +PB +ir +ce +ir +ir +SH +zN +zN +zN +zN +zN +zN +zN +zN +zN +zN +gC +gC +cv +ir UE UE "} (18,1,1) = {" -wg -DY -DY -wg -vm -ZW -ej -Tf -gM -cC +ir +sA +sA +ir +ju +zN +RZ +qW +dz +ND QE dP pG @@ -9021,19 +9026,19 @@ QE pG dP QE -XY -GH -fO -Wq -Rt -Tf -ar -HI -Tf -fO -Tf -Ld -cC +QN +dt +CE +sn +Rz +qW +Qo +sp +qW +CE +qW +fL +ND QE dP pG @@ -9041,193 +9046,193 @@ QE pG dP QE -iJ -XW -Tf -LT -wg -NC -oz -DY -wg -wg -yH -wg -wg -wg -PL -ZW -BH -TM -TM -wg -wg -vm -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -ZW -sr -wg -wg -wg -wg +Zx +yf +qW +wo +ir +Fz +zv +sA +ir +ir +Xm +ir +ir +ir +SH +zN +cv +ce +ce +ir +ir +ju +zN +zN +zN +zN +zN +zN +zN +zN +zN +PB +ir +ir +ir +ir UE UE "} (19,1,1) = {" -Eq -oz -kF -wg -vm -ZW -ej -Tf -XM -cC -zi +pu +zv +IT +ir +ju +zN +RZ +qW +MU +ND +QT QE -Op +ZN Dm IL rm -Tj -go -MC -pa -HX -HX -Sy -Hh -HX -HX -HX -HX -qH -XT -tc +NW +Wu +hZ +LN +qk +qk +hR +FX +qk +qk +qk +qk +dI +fz +xP VB Ph Xr LP QE -zi -iJ -XW -Tf -Tm -wg -bk -NC -wg -wg -yH -wg -wg -PL -GJ -ZW -BH -wg -TM -dY -wg -wg -Gb -ZW -ZW -ZW -ZW -ZW -ZW -uB -ZW -ZW -sr -wg -wg +QT +Zx +yf +qW +tK +ir +HO +Fz +ir +ir +Xm +ir +ir +SH +NA +zN +cv +ir +ce +Ee +ir +ir +oN +zN +zN +zN +zN +zN +zN +gC +zN +zN +PB +ir +ir UE UE UE UE "} (20,1,1) = {" -Eq -KW -wg -wg -vm -ZW -ej -Tf -XM -cC -cC +pu +tn +ir +ir +ju +zN +RZ +qW +MU +ND +ND QE dP Qq dP QE -FK -jc -St -Tf -MJ -kO -xA -SK -VL -Tf -Tf -Tf -jo -cC -YO +mq +TN +An +qW +pz +WJ +Wp +GV +yW +qW +qW +qW +Vm +ND +hO QE dP Qq dP QE -EG -iJ -rb -Tf -or -TM -wg -wg -wg -yH -wg -wg -PL -ZW -ZW -BH -wg -wg -tW -dY -ha -wg -gJ -Ws -uB -uB -uB -uB -BH -wg -vm -ZW -sr -wg +Or +Zx +GE +qW +Fe +ce +ir +ir +ir +Xm +ir +ir +SH +zN +zN +cv +ir +ir +Ap +Ee +Cc +ir +aD +hk +gC +gC +gC +gC +cv +ir +ju +zN +PB +ir UE UE UE @@ -9235,77 +9240,77 @@ UE UE "} (21,1,1) = {" -wg -TM -wg -wg -vm -ZW -ej -Tf -XM -cC -cC -la +ir +ce +ir +ir +ju +zN +RZ +qW +MU +ND +ND +rO QE EM QE -Sq -cC -iJ -Ko -MJ -pE -qs -Uu -Xu -Tf -iq -Tf -Tf -LW -cC -Lz -JH +kL +ND +Zx +kx +pz +CB +vX +Cn +Mg +qW +ln +qW +qW +sN +ND +To +IM QE EM QE -nD -cC -iJ -XW -Tf -XM -TM -dE -qz -wg -wg -wg -PL -ZW -ZW -BH -wg -wg -yH -qz -VS -dE -wg -wg -TM -TM -wg -wg -wg -wg -TM -gJ -Jo -sr -wg -wg +qL +ND +Zx +yf +qW +MU +ce +sD +CQ +ir +ir +ir +SH +zN +zN +cv +ir +ir +Xm +CQ +tD +sD +ir +ir +ce +ce +ir +ir +ir +ir +ce +aD +fl +PB +ir +ir UE UE UE @@ -9315,75 +9320,75 @@ UE UE UE UE -wg -vm -ZW -ej -Tf -XM -cC -cC -cC +ir +ju +zN +RZ +qW +MU +ND +ND +ND QE MQ Zr -np -gb -iJ -bS -XM -wg -qs -Bk -RT -Uu -DG -Bg -Tf -XM -cC -PO -cC +AM +WH +Zx +nf +MU +ir +vX +Nb +vc +Cn +YD +uE +qW +MU +ND +Ey +ND QE MQ Zr -np -uJ -iJ -XW -Tf -XM -wg -wg -TM -wg -xi -Em -ZW -ZW -BH -wg -wg -yH -sP -dE -It -wg -wg -wg -yH -TM -TM -wg -LA -Rs -TM -TM -gJ -ZW -ue -wg -wg +AM +Tu +Zx +yf +qW +MU +ir +ir +ce +ir +wt +Qp +zN +zN +cv +ir +ir +Xm +BL +sD +Ma +ir +ir +ir +Xm +ce +ce +ir +eA +gP +ce +ce +aD +zN +Ck +ir +ir UE UE UE @@ -9391,1516 +9396,1516 @@ UE (23,1,1) = {" UE UE -TM -wg -vm -ZW -ej -Tf -XM -cC -EG -nz +ce +ir +ju +zN +RZ +qW +MU +ND +Or +Vp QE Io QE -Je -on -iJ -rb -XM -wg -mK -Tf -hP -Tf -zI -qs -Tf -XM -cC -cC -XF +Dl +bD +Zx +GE +MU +ir +xf +qW +Ow +qW +PX +vX +qW +MU +ND +ND +KD QE Io QE -Je -on -iJ -XW -Tf -XM -wg -wg -qz -TM -wg -II -Oi -BH -wg -wg -yH -yH -dY -DU -dl -wg -xj -wg -yH -vf -yH -wg -wg -CO -wg -wg -wg -Oi -ZW -ue -wg +Dl +bD +Zx +yf +qW +MU +ir +ir +CQ +ce +ir +Bo +Ua +cv +ir +ir +Xm +Xm +Ee +YV +vT +ir +Ut +ir +Xm +sg +Xm +ir +ir +YW +ir +ir +ir +Ua +zN +Ck +ir UE UE UE "} (24,1,1) = {" UE -TM -TM -wg -vm -ZW -Uo -Tf -XM -cC -cC -cC +ce +ce +ir +ju +zN +nw +qW +MU +ND +ND +ND VB Gc VB -cC -cC -iJ -XW -Aj -wg -mK -Tf -vM -RM -Nl -qs -Tf -XM -cC -cC -cC +ND +ND +Zx +yf +mI +ir +xf +qW +ki +IB +eO +vX +qW +MU +ND +ND +ND VB Gc VB -cC -cC -Dz -XW -Tf -XM -wg -II -wg -TM -dE -wg -wg -wg -TM -tW -jd -jd -dY -UD -dl -wg -kQ -wg -wg -yH -UD -UD -wg -LA -wg -dY -wg -wg -vm -sr -wg -wg +ND +ND +eQ +yf +qW +MU +ir +Bo +ir +ce +sD +ir +ir +ir +ce +Ap +jO +jO +Ee +KR +vT +ir +Dy +ir +ir +Xm +KR +KR +ir +eA +ir +Ee +ir +ir +ju +PB +ir +ir UE UE "} (25,1,1) = {" -wg -TM -wg -PL -ZW -BH -hu -Tf -XM -cC -px -cC +ir +ce +ir +SH +zN +cv +ub +qW +MU +ND +Lh +ND VB VB VB -EG -cs -iJ -XW -XM -wg -qs -Tf -vM -RM -zI -mK -Tf -XM -cC -nQ -cC +Or +lU +Zx +yf +MU +ir +vX +qW +ki +IB +PX +xf +qW +MU +ND +UT +ND VB VB VB -cC -ZC -Dz -rb -Tf -XM -wg -wg -wg -TM -qz -dE -zw -TM -gs -dY -uh -TM -wg -qh -dY -wg -UP -vq -wg -yH -yH -UD -UD -yH -dY -Yu -yH -TM -Oi -ZW -ue -wg +ND +Nn +eQ +GE +qW +MU +ir +ir +ir +ce +CQ +sD +by +ce +Wg +Ee +Es +ce +ir +zt +Ee +ir +hp +eC +ir +Xm +Xm +KR +KR +Xm +Ee +Ek +Xm +ce +Ua +zN +Ck +ir UE UE "} (26,1,1) = {" -wg -PL -GJ -ZW -BH -wg -cB -hV -lQ -cC -MG -eJ -MG -MG -MG -eJ -MG -iJ -rb -XM -wg -mK -Kq -Xu -hV -Qe -mK -Tf -XM -cC -MG -eJ -MG -MG -MG -EU -QK -iJ -rb -Sc -bB -Ze -wg -II -wg -II -yH -wg -dY -dY -wg -wg -wg -wg -wg -wg -wg -wg -wg -Tf -Tf -Tf -wg -wg -DU -NU -dE -qz -qz -wg -vm -sr -wg +ir +SH +NA +zN +cv +ir +ns +JY +HY +ND +Nw +un +Nw +Nw +Nw +un +Nw +Zx +GE +MU +ir +xf +SB +Mg +JY +mA +xf +qW +MU +ND +Nw +un +Nw +Nw +Nw +Zd +nr +Zx +GE +gR +sf +Ps +ir +Bo +ir +Bo +Xm +ir +Ee +Ee +ir +ir +ir +ir +ir +ir +ir +ir +ir +qW +qW +qW +ir +ir +YV +rS +sD +CQ +CQ +ir +ju +PB +ir UE UE "} (27,1,1) = {" -wg -vm -PZ -bR -bR -Tw -Ie -Ak -gI -jV -jV -jV -jV -jV -jV -jV -jV -si -Eu -pE -Tw -ry -Jj -wT -Wy -Yv -At -kO -pE -jV -jV -jV -jV -jV -jV -Nc -zG -MI -sQ -GL -gI -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -in -Tw -Tw -Tw -Tw -Tw -Tw -qh -UD -wg -vm -sr -wg +ir +ju +xL +KY +KY +fC +fc +bd +az +mF +mF +mF +mF +mF +mF +mF +mF +ip +Nj +CB +fC +Yi +Po +mE +XR +ZS +Qg +WJ +CB +mF +mF +mF +mF +mF +mF +tV +mj +JV +jB +ve +az +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +Lq +fC +fC +fC +fC +fC +fC +zt +KR +ir +ju +PB +ir UE UE "} (28,1,1) = {" -GJ -PZ -gj -Tf -Tf -Mq -Hz -Gl -Gl -na -Sh -Sh -Sh -Mq -Mq -Sh -Mq -Mq -Mq -Mq -Mq -XU -Gl -bG -Gl -na -Sh -Sh -Mq -Mq -Mq -Mq -Mq -Mq -Hi -uY -TM -jx -JU -eo -eo -na -Mq -Mq -Mq -Mq -Mq -Mq -wg -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -vp -Gl -rH -Mq -Mq -Mq -Mq -Mq -wg -UD -wg -vm -sr -wg -wg +NA +xL +oX +qW +qW +pU +gi +oa +oa +vs +Al +Al +Al +pU +pU +Al +pU +pU +pU +pU +pU +ru +oa +Ww +oa +vs +Al +Al +pU +pU +pU +pU +pU +pU +Oa +UB +ce +pZ +Kc +uO +uO +vs +pU +pU +pU +pU +pU +pU +ir +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +YC +oa +gT +pU +pU +pU +pU +pU +ir +KR +ir +ju +PB +ir +ir UE "} (29,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Sh -uY -Mq -Mq -Mq -Sh -Mq -Mq -Mq -Mq -Sh -Sh -Mq -YM -Mq -Sh -Sh -Sh -Sh -Mq -Mq -Mq -Mq -Sh -Nc -TM -wg -wg -wg -JC -je -En -Mq -Mq -Sh -Mq -Mq -wg -kQ -NB -Mq -Mq -Mq -Mq -Mq -Mq -Mq -NB -Mq -Mq -Mq -Mq -Mq -Mq -Mq -NB -Mq -wg -dY -qh -Oi -ZW -ue -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +Al +UB +pU +pU +pU +Al +pU +pU +pU +pU +Al +Al +pU +Is +pU +Al +Al +Al +Al +pU +pU +pU +pU +Al +tV +ce +ir +ir +ir +Ac +Pv +ow +pU +pU +Al +pU +pU +ir +Dy +Jz +pU +pU +pU +pU +pU +pU +pU +Jz +pU +pU +pU +pU +pU +pU +pU +Jz +pU +ir +Ee +zt +Ua +zN +Ck +ir UE "} (30,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Sh -Sh -qh -qh -uY -Sh -Sh -Mq -Sh -Sh -Sh -Sh -Sh -Mq -YM -Mq -Mq -Sh -Sh -Sh -Sh -Mq -Mq -Sh -Nc -wg -wg -Av -xj -sU -wg -ek -TC -Vb -LU -Mq -Sh -Mq -wg -wg -NB -Mq -Gz -Gz -Gz -Mq -Mq -Mq -NB -Mq -Mq -Mq -Mq -Mq -Mq -Mq -NB -Mq -TM -dY -qh -wg -vm -sr -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +Al +Al +zt +zt +UB +Al +Al +pU +Al +Al +Al +Al +Al +pU +Is +pU +pU +Al +Al +Al +Al +pU +pU +Al +tV +ir +ir +kw +Ut +od +ir +vE +Bd +yU +fx +pU +Al +pU +ir +ir +Jz +pU +ZF +ZF +ZF +pU +pU +pU +Jz +pU +pU +pU +pU +pU +pU +pU +Jz +pU +ce +Ee +zt +ir +ju +PB +ir UE "} (31,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Sh -uY -Vo -TM -Sh -Sh -Mq -Mq -Sh -Sh -Sh -Sh -Mq -YM -Mq -Mq -Mq -Mq -Sh -Sh -Mq -Mq -Mq -SA -wg -wg -Eq -KW -UP -yd -UZ -zG -Vb -Mq -Mq -Sh -Sh -Mq -Mq -Mq -Gz -Gz -ZJ -Gz -Sh -Mq -Mq -Mq -Mq -Sh -Sh -Sh -Mq -Mq -Sh -Sh -Sh -TM -jd -TM -wg -vm -sr -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +Al +UB +ll +ce +Al +Al +pU +pU +Al +Al +Al +Al +pU +Is +pU +pU +pU +pU +Al +Al +pU +pU +pU +if +ir +ir +pu +tn +hp +cy +Pn +mj +yU +pU +pU +Al +Al +pU +pU +pU +ZF +ZF +lM +ZF +Al +pU +pU +pU +pU +Al +Al +Al +pU +pU +Al +Al +Al +ce +jO +ce +ir +ju +PB +ir UE "} (32,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Sh -Sh -Bz -uY -Sh -Mq -Mq -Mq -Sh -Sh -Sh -Sh -Mq -sC -Mq -Mq -Mq -Mq -Sh -Sh -Mq -Mq -Mq -jx -wg -KU -Eq -Tx -UP -mB -wg -TC -Vb -Mq -Sh -Sh -Sh -Gz -Mq -NB -Gz -Sh -Sh -Gz -Sh -Mq -Mq -NB -Mq -Mq -Sh -Sh -Gz -Sh -Sh -pl -Mq -wg -yH -TM -PL -ZW -BH -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +Al +Al +Zl +UB +Al +pU +pU +pU +Al +Al +Al +Al +pU +ZY +pU +pU +pU +pU +Al +Al +pU +pU +pU +pZ +ir +UI +pu +IP +hp +Lb +ir +Bd +yU +pU +Al +Al +Al +ZF +pU +Jz +ZF +Al +Al +ZF +Al +pU +pU +Jz +pU +pU +Al +Al +ZF +Al +Al +dW +pU +ir +Xm +ce +SH +zN +cv +ir UE "} (33,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Mq -Sh -uY -Sh -Mq -Mq -Mq -Mq -Sh -Sh -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Sh -Mq -Mq -Sh -Xi -TM -wg -Eq -DY -bk -gg -wg -je -Gz -Mq -Sh -Sh -Sh -Gz -Gz -Mq -Gz -Sh -Sh -Sh -Sh -Mq -Mq -Mq -Mq -Mq -Sh -Sh -Gz -Sh -Sh -Mq -Mq -wg -TM -PL -ZW -sr -wg -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +pU +Al +UB +Al +pU +pU +pU +pU +Al +Al +pU +pU +pU +Is +pU +pU +pU +pU +pU +Al +pU +pU +Al +Kk +ce +ir +pu +sA +HO +Zp +ir +Pv +ZF +pU +Al +Al +Al +ZF +ZF +pU +ZF +Al +Al +Al +Al +pU +pU +pU +pU +pU +Al +Al +ZF +Al +Al +pU +pU +ir +ce +SH +zN +PB +ir +ir UE "} (34,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Sh -Mq -SA -TM -wg -pL -wg -wg -qh -zG -Gz -Sh -Sh -Sh -Sh -Sh -Gz -Mq -Mq -Sh -Sh -Sh -Mq -Mq -wg -wg -wg -Mq -Mq -Sh -Gz -Sh -Mq -Mq -Mq -wg -TM -vm -ZW -sr -wg -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Is +pU +pU +pU +pU +pU +pU +pU +pU +Al +pU +if +ce +ir +pQ +ir +ir +zt +mj +ZF +Al +Al +Al +Al +Al +ZF +pU +pU +Al +Al +Al +pU +pU +ir +ir +ir +pU +pU +Al +ZF +Al +pU +pU +pU +ir +ce +ju +zN +PB +ir +ir UE "} (35,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -JC -uY -wg -TM -TM -jx -YZ -Iy -Gz -Sh -Gz -Sh -Sh -Sh -Sh -Iy -Mq -Sh -vo -Sh -Mq -Mq -wg -NC -wg -wg -Mq -Mq -Gz -Mq -Mq -NB -Mq -wg -PL -ZW -uB -BH -wg +zN +KY +qW +qW +qW +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Is +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Ac +UB +ir +ce +ce +pZ +yV +jj +ZF +Al +ZF +Al +Al +Al +Al +jj +pU +Al +gn +Al +pU +pU +ir +Fz +ir +ir +pU +pU +ZF +pU +pU +Jz +pU +ir +SH +zN +gC +cv +ir UE UE "} (36,1,1) = {" -ZW -bR -Tf -Tf -Tf -Mq -zG -zG -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -TM -uY -uY -uY -Xi -Sh -Gz -Sh -Sh -Gz -Sh -Sh -Sh -Sh -Gz -Mq -Sh -Sh -Sh -Mq -wg -wg -yY -wg -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -wg -vm -sr -wg -wg -xb +zN +KY +qW +qW +qW +pU +mj +mj +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Is +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +ce +UB +UB +UB +Kk +Al +ZF +Al +Al +ZF +Al +Al +Al +Al +ZF +pU +Al +Al +Al +pU +ir +ir +Ed +ir +pU +pU +pU +pU +pU +pU +pU +pU +ir +ju +PB +ir +ir +dF UE UE "} (37,1,1) = {" -ZW -bR -Tf -Tf -Tf -zG -wg -wg -zG -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -zG -zG -Mq -Sh -Sh -pl -Sh -Mq -Gz -Sh -Sh -Sh -Mq -Iy -Mq -Mq -Mq -Mq -Mq -Mq -wg -wg -wg -Mq -Mq -Mq -sc -Mq -Mq -NB -Mq -wg -vm -BH -TM -TM -TM -wg +zN +KY +qW +qW +qW +mj +ir +ir +mj +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Is +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +mj +mj +pU +Al +Al +dW +Al +pU +ZF +Al +Al +Al +pU +jj +pU +pU +pU +pU +pU +pU +ir +ir +ir +pU +pU +pU +BA +pU +pU +Jz +pU +ir +ju +cv +ce +ce +ce +ir UE "} (38,1,1) = {" -ZW -bR -Tf -Tf -Tf -wg -OT -DY -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Sh -Sh -Mq -Mq -Mq -Mq -Mq -Mq -YM -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Cz -Sh -Sh -pl -Mq -Mq -Gz -Gz -Sh -Sh -Sh -Iy -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -NB -Mq -wg -yt -wg -EJ -wg -qh -wg +zN +KY +qW +qW +qW +ir +sz +sA +pU +pU +pU +pU +pU +pU +pU +Al +Al +pU +pU +pU +pU +pU +pU +Is +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +dr +Al +Al +dW +pU +pU +ZF +ZF +Al +Al +Al +jj +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Jz +pU +ir +me +ir +Zg +ir +zt +ir UE "} (39,1,1) = {" -Oi -LG -NE -Tf -Tf -wg -wg -Kb -Kb -Ij -Mq -Mq -Mq -Mq -Sh -Sh -Gz -Sh -Mq -Mq -Mq -Oz -Kb -Xd -Kb -Ij -Mq -Mq -Mq -Mq -Mq -Mq -Sh -Mq -SA -cU -Gm -hT -MR -zG -Kb -Ij -Mq -Mq -Gz -Sh -vo -Sh -Sh -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -Mq -JB -Kb -Xo -Mq -Mq -Mq -Mq -Mq -wg -yt -wg -bk -EJ -Pb -qh +Ua +xF +tT +qW +qW +ir +ir +HU +HU +Ej +pU +pU +pU +pU +Al +Al +ZF +Al +pU +pU +pU +pH +HU +pi +HU +Ej +pU +pU +pU +pU +pU +pU +Al +pU +if +CC +DN +nk +LF +mj +HU +Ej +pU +pU +ZF +Al +gn +Al +Al +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +KF +HU +Zi +pU +pU +pU +pU +pU +ir +me +ir +HO +Zg +Pk +zt UE "} (40,1,1) = {" -wg -QR -qO -bR -bR -wg -hu -AO -SQ -qf -qf -qf -qf -wN -wN -hs -hs -SY -Ho -Rt -eq -Bg -BQ -wG -VM -Gr -sy -Rt -NZ -qf -qf -wN -wN -Nc -JC -rZ -Sw -wb -ST -IG -zG -eq -aS -aS -vi -aS -aS -aS -eq -eq -eq -eq -eq -eq -eq -eq -eq -eq -eq -eq -jZ -eq -eq -eq -eq -eq -eq -wg -yt -wg -Tx -NC -kF -qh +ir +lb +Lf +KY +KY +ir +ub +MH +MW +gp +gp +gp +gp +Wk +Wk +MF +MF +wR +Qy +Rz +VW +uE +oV +du +iM +UQ +Vv +Rz +nH +gp +gp +Wk +Wk +tV +Ac +aQ +qX +RI +DZ +zF +mj +VW +mc +mc +cu +mc +mc +mc +VW +VW +VW +VW +VW +VW +VW +VW +VW +VW +VW +VW +en +VW +VW +VW +VW +VW +VW +ir +me +ir +IP +Fz +IT +zt UE "} (41,1,1) = {" -wg -wg -wg -wg -wg -wg -cB -Tf -XM -cC -kc -kV -kc -dm -vQ -KS -vQ -Bp -IQ -XM -qh -uA -Cv -SK -pC -Nl -qs -Tf -XM -cC -RX -eJ -mr -RL -TM -TM -IF -BR -Uq -BR -TM -uY -tW -yH -yH -Tk -tW -tW -yH -wg -wg -wg -wg -wg -wg -wg -wg -wg -wg -Tf -Tf -Tf -wg -wg -wg -wg -yH -GJ -sr -EJ -NC -gQ -wg -qh -qh +ir +ir +ir +ir +ir +ir +ns +qW +MU +ND +Tt +Ym +Tt +Fn +Ff +Ba +Ff +Rx +qd +MU +zt +Hy +pb +GV +FS +eO +vX +qW +MU +ND +xd +un +bL +xU +ce +ce +Wt +Wx +dO +Wx +ce +UB +Ap +Xm +Xm +js +Ap +Ap +Xm +ir +ir +ir +ir +ir +ir +ir +ir +ir +ir +qW +qW +qW +ir +ir +ir +ir +Xm +NA +PB +Zg +Fz +gY +ir +zt +zt "} (42,1,1) = {" -wg -wg -wg -xb -TM -wg -Bg -Tf -XM -cC -jn -cC -kC -kC -kC -GX -vG -Bp -zT -Tm -TM -uA -Bk -SK -Bk -Nl -qs -Tf -XM -cC -jn -Dj -gx -TM -wg -De -bk -wg -IG -ah -gg -wg -IQ -Wz -BR -BR -yH -UD -wg +ir +ir +ir +dF +ce +ir +uE +qW +MU +ND +oL +ND +WT +WT +WT +Fy +cX +Rx +hh +tK +ce +Hy +Nb +GV +Nb +eO +vX +qW +MU +ND +oL +Jc +GM +ce +ir +nB +HO +ir +zF +SM +Zp +ir +qd +dd +Wx +Wx +Xm +KR +ir bN ZT ZT @@ -10912,72 +10917,72 @@ ZT ZT ZT bN -Tf -wg -wg -PL -ue -wg -yH -Jo -BH -wg -kF -wg -wg -yH -qh +qW +ir +ir +SH +Ck +ir +Xm +fl +cv +ir +IT +ir +ir +Xm +zt "} (43,1,1) = {" UE -wg -wg -TM -tW -TM -DD -Tf -XM -cC -EG -cC -kC -Dg -kC -ud -gt -Bp -zT -Tm -TM -uA -Bk -SK -Bk -zI -qs -Tf -XM -cC -cj -Zz -LH -mP -Rj -bk -Eq -Eq -DY -JI -BR -oY -af -BR -wg -wg -qh -qh -BR +ir +ir +ce +Ap +ce +Rf +qW +MU +ND +Or +ND +WT +jm +WT +sk +YX +Rx +hh +tK +ce +Hy +Nb +GV +Nb +PX +vX +qW +MU +ND +FL +bZ +Iz +CN +sH +HO +pu +pu +sA +sh +Wx +TK +xw +Wx +ir +ir +zt +zt +Wx ya sd WR @@ -10989,72 +10994,72 @@ Nh cW XA ya -wg -wg -PL -ZW -sr -wg -wg -zn -TM -TM -wg -wg -tW -yH -qh +ir +ir +SH +zN +PB +ir +ir +PQ +ce +ce +ir +ir +Ap +Xm +zt "} (44,1,1) = {" UE UE UE -wg -tW -tW -DD -Tf -XM -cC -cC -cC -kC -JA -kC -Su -cC -iJ -IQ -Aj -qh -qs -Bk -SK -Bk -zI -qs -Tf -XM -cC -Sg -WM -wg -Gs -wg -wg -xj -XB -EJ -wg -BR -Cu -Pi -wg -yH -UD -Yu -yH -BR +ir +Ap +Ap +Rf +qW +MU +ND +ND +ND +WT +vr +WT +dg +ND +Zx +qd +mI +zt +vX +Nb +GV +Nb +PX +vX +qW +MU +ND +wI +lp +ir +sB +ir +ir +Ut +yO +Zg +ir +Wx +Vt +jT +ir +Xm +KR +Ek +Xm +Wx bN TF jK @@ -11066,72 +11071,72 @@ nF GS aL bN -wg -wg -uk -Jo -Jo -Lj -TM -zn -wg -TM -TM -cd -yH -JN -qh +ir +ir +Gk +fl +fl +Fa +ce +PQ +ir +ce +ce +hH +Xm +yx +zt "} (45,1,1) = {" UE UE UE -wg -tW -tW -DD -Bk -XM -cC -cC -cC -io -IR -Ts -Su -cC -iJ -IQ -Aj -wg -qs -Tf -Xu -Tf -cV -hu -Tf -XM -cC -As -bQ -VD -SA -JC -wg -EJ -xj -DY -gg -SA -Pi -zG -BR -hw -yH -yH -hw -wg +ir +Ap +Ap +Rf +Nb +MU +ND +ND +ND +eG +zQ +NF +dg +ND +Zx +qd +mI +ir +vX +qW +Mg +qW +oH +ub +qW +MU +ND +AS +yu +Kx +if +Ac +ir +Zg +Ut +sA +Zp +if +jT +mj +Wx +aO +Xm +Xm +aO +ir bN nF nF @@ -11143,72 +11148,72 @@ nF Ha Pw bN -wg -wg -qh -Oi -ZW -ZW -wQ -CZ -wg -wg -tW -tW -tW -tW -wg +ir +ir +zt +Ua +zN +zN +nb +dA +ir +ir +Ap +Ap +Ap +Ap +ir "} (46,1,1) = {" UE UE UE -wg -yH -tW -DD -Bk -XM -cC -cC -zG -Kw -iE -io -vB -Su -OJ -Tf -Wq -NZ -qs -Tf -Xu -fO -th -Tf -Tf -SZ -EG -Sg -cC -Hx -Pi -bE -UP -Av -tx -UP -wg -BR -wg -Cu -qh -BR -hw -Wz -hw -wg +ir +Xm +Ap +Rf +Nb +MU +ND +ND +mj +BV +PA +eG +wO +dg +Mv +qW +sn +nH +vX +qW +Mg +CE +Rh +qW +qW +CD +Or +wI +ND +as +jT +Ly +hp +kw +ZR +hp +ir +Wx +ir +Vt +zt +Wx +aO +dd +aO +ir bN lI JX @@ -11220,72 +11225,72 @@ YA HG Ox bN -wg -UD -qh -wg -Oi -ZW -ZW -CZ -TM -Rs -tW -Wz -tW -TM -TM +ir +KR +zt +ir +Ua +zN +zN +dA +ce +gP +Ap +dd +Ap +ce +ce "} (47,1,1) = {" UE UE UE -wg -yH -yH -DD -Bk -Tm -cC -zG -bE -zG -Qr -uR -io -Su -Hr -hB -Tf -Wq -Rt -Qx -Xu -VL -Tf -Tf -Tf -Ld -cC -cC -io -cC -af -jx -wg -wg -EI -oY -BR -Pi -wg -Cu -UD -qh -hw -hw -wg -wg +ir +Xm +Xm +Rf +Nb +tK +ND +mj +Ly +mj +td +Py +eG +dg +oU +vW +qW +sn +Rz +hI +Mg +yW +qW +qW +qW +fL +ND +ND +eG +ND +xw +pZ +ir +ir +BX +TK +Wx +jT +ir +Vt +KR +zt +aO +aO +ir +ir bN bN bN @@ -11297,72 +11302,72 @@ BD bN bN BD -wg -qh -yH -wg -qh -qh -GY -ZW -Lj -wg -yH -yH -tW -wg -TM +ir +zt +Xm +ir +zt +zt +Ya +zN +Fa +ir +Xm +Xm +Ap +ir +ce "} (48,1,1) = {" UE UE UE -wg -yH -yH -DD -Bk -XM -zG -wg -EJ -wg -IQ -IQ -Hv -ng -XT -Qw -HX -HX -HX -HX -qC -HX -HX -HX -HX -qH -ef -hi -kC -LI -MK -BR -qh -tO -Pi -BR -BR -Cu -IU -yH -nK -qh -wg -yH -wm -wg +ir +Xm +Xm +Rf +Nb +MU +mj +ir +Zg +ir +qd +qd +fp +Zw +fz +vd +qk +qk +qk +qk +NO +qk +qk +qk +qk +dI +tj +qM +WT +Fl +vg +Wx +zt +cp +jT +Wx +Wx +Vt +Qb +Xm +VJ +zt +ir +Xm +qQ +ir bN OI ox @@ -11371,75 +11376,75 @@ ox ox qx bN -wg -wg -yH -yH -yH -Wz -qh -UD -wg -Oi -uB -ZW -ue -wg -yH -TM -fG -TM +ir +ir +Xm +Xm +Xm +dd +zt +KR +ir +Ua +gC +zN +Ck +ir +Xm +ce +ZE +ce "} (49,1,1) = {" UE UE UE -wg -wg -yH -DD -Bk -XM -bE -DY -OT -bE -cC -cK -uR -io -Ll -St -Tf -rj -zJ -tz -GT -Tf -Tf -tz -iO -jo -cC -io -io -mX -wg -zk -Mz -uY -af -bv -Cu -zG -yH -hw -Wz -UD -TM -TM -TM -ZU +ir +ir +Xm +Rf +Nb +MU +Ly +sA +sz +Ly +ND +gf +Py +eG +Ga +An +qW +Hm +Ix +zH +HD +qW +qW +zH +hM +Vm +ND +eG +eG +Xw +ir +Fu +pS +UB +xw +Kh +Vt +mj +Xm +aO +dd +KR +ce +ce +ce +vZ bN CR Pz @@ -11448,75 +11453,75 @@ Ob Lv Ea bN -wg -Wz -yH -yH -DA -qh -qh -Vi -Ry -wg -wg -vm -sr -wg -TM -tB -sr -TM +ir +dd +Xm +Xm +uy +zt +zt +os +TU +ir +ir +ju +PB +ir +ce +Tb +PB +ce "} (50,1,1) = {" UE UE UE UE -MT -MT -DD -Tf -XM -EG -px -wg -zG -io -zG -cC -cs -iJ -Tf -MJ -pE -MT -ma -Xu -XM -Bg -Tf -tz -md -cC -cC -cC -lX -io -iH -gt -xt -su -XW -jx -XM -qn -yH -hw -UD -Jn -wg -aW -ik +vC +vC +Rf +qW +MU +Or +Lh +ir +mj +eG +mj +ND +lU +Zx +qW +pz +CB +vC +kv +Mg +MU +uE +qW +zH +Bw +ND +ND +ND +Eh +eG +il +YX +CU +Rx +yf +pZ +MU +OL +Xm +aO +KR +kG +ir +nS +lZ WU bM wc @@ -11525,24 +11530,24 @@ mw vV lI bN -wg -yH -yH -lW -UD -Ry -yH -yH -Vi -MT -CG -uB -ZW -GJ -GJ -ZW -sr -wg +ir +Xm +Xm +MS +KR +TU +Xm +Xm +os +vC +um +gC +zN +NA +NA +zN +PB +ir "} (51,1,1) = {" UE @@ -11550,50 +11555,50 @@ UE UE UE UE -MT -DD -Tf -XM -cC -RH -cC -cC -cC -EG -cC -oC -ct -JC -zG -wg -wg -ma -Xu -XM -qO -ze -Tf -TL -Sg -px -cC -cC -io -YG -cC -KM -hq -XW -Tf -Tf -DI -aW -aW -pf -ZU -aW -ph -ok +vC +Rf +qW +MU +ND +IH +ND +ND +ND +Or +ND +TT +Pm +Ac +mj +ir +ir +kv +Mg +MU +Lf +Qa +qW +XP +wI +Lh +ND +ND +eG +RQ +ND +Gd +tp +yf +qW +qW +dx +nS +nS +ac +vZ +nS +mu +AK bN bN bN @@ -11602,24 +11607,24 @@ bN bN bN bN -wg -wg -wg -yH -wg -wg -yH -uR -io -uR -MT -MT -vm -ZW -ZW -ZW -Fg -TM +ir +ir +ir +Xm +ir +ir +Xm +Py +eG +Py +vC +vC +ju +zN +zN +zN +ty +ce "} (52,1,1) = {" UE @@ -11627,76 +11632,76 @@ UE UE UE UE -qh -DD -Tf -Wq -Rt -wl -wl -bR -bR -bR -bR -bR -zG -SA -Bk -TM -wg -ma -Hj -XM -TM -SN -Tf -XM -cC -RH -EG -cC -sW -cC -xt -tC -ct -XW -Tf -Tf -DI -aW -Ys -aW -aW -aW -SL -Ys -wg -wg -yH -wg -yH -Wz -yH -yH -wg -wg -wg -yH -BR -yH -uR -uR -Aq -Kw -uR -wg -vm -yD -ZW -Fg -TM -wg +zt +Rf +qW +sn +Rz +YL +YL +KY +KY +KY +KY +KY +mj +if +Nb +ce +ir +kv +lD +MU +ce +xf +qW +MU +ND +IH +Or +ND +OK +ND +CU +Oh +Pm +yf +qW +qW +dx +nS +nj +nS +nS +nS +vJ +nj +ir +ir +Xm +ir +Xm +dd +Xm +Xm +ir +ir +ir +Xm +Wx +Xm +Py +Py +sS +BV +Py +ir +ju +Gp +zN +ty +ce +ir "} (53,1,1) = {" UE @@ -11705,74 +11710,74 @@ UE UE UE UE -lj -is -kO -kO -JO -kO -kO -kO -kO -kO -SA -lf -TM -kr -wg -EJ -Am -Xu -XM -TM -SN -RM -eP -Eb -bR -bR -bR -bR -bR -wl -bR -KJ -JG -MJ -pE -eq -wg -BR -wg -BR -BR -Sx -aW -wg +vl +Jw +WJ +WJ +ts +WJ +WJ +WJ +WJ +WJ +if +IC +ce +oD +ir +Zg +Uw +Mg +MU +ce +xf +IB +Ht +iC +KY +KY +KY +KY +KY +YL +KY +Sz +Us +pz +CB +VW +ir +Wx +ir +Wx +Wx +kH +nS +ir Wo Wo Wo Bx Wo -wg +ir Wo Bx Wo Bx Wo -BN -Wz -Kw -bo -yp -yp -io -xi -ZW -Yy -CZ -TM -wg +mJ +dd +BV +mz +vA +vA +eG +wt +zN +Pe +dA +ce +ir UE "} (54,1,1) = {" @@ -11782,73 +11787,73 @@ UE UE UE UE -MT -qh -wg -wg -wg -wg -wg -MT -TM -wg -qh -qh -kr -DY -kF -MT -dQ -Xu -XM -TM -qh -qT -JO -rV -hl -kO -kO -kO -kO -kO -kO -kO -kO -pE -MT -MT -AF -UD -oj -BR -wg -Sx -Ys -Wz +vC +zt +ir +ir +ir +ir +ir +vC +ce +ir +zt +zt +oD +sA +IT +vC +Hc +Mg +MU +ce +zt +Cq +ts +FG +bm +WJ +WJ +WJ +WJ +WJ +WJ +WJ +WJ +CB +vC +vC +gv +KR +PY +Wx +ir +kH +nj +dd Wo to us se Bx -wg +ir Wo to dZ se Wo -hw -sM -Kw -yp -rA -JQ -Kw -wg -Oi -Jo -CZ -wg +aO +Pa +BV +vA +jr +HH +BV +ir +Ua +fl +dA +ir UE UE "} @@ -11866,66 +11871,66 @@ Lo Lo Lo BM -Cp -aX -tW -yH -wg -xj -oz -xj -wg -wA -Xu -XM -TM -UD -tW -wg -TM -qh -qh -wg -wg -wg -wg -wg -wg -MT -MT -wg -hw -AF -tW -UD -Wz -wg -HF -Ys -yH +CL +xO +Ap +Xm +ir +Ut +zv +Ut +ir +Kl +Mg +MU +ce +KR +Ap +ir +ce +zt +zt +ir +ir +ir +ir +ir +ir +vC +vC +ir +aO +gv +Ap +KR +dd +ir +KC +nj +Xm Wo oA GA wy Wo -wg +ir Wo oA qu xu Wo -Dk -hC -RB -DY -Av -vj -Kw -wg -wg -vm -sr -wg +Nq +KN +qq +sA +kw +wY +BV +ir +ir +ju +PB +ir UE UE "} @@ -11943,66 +11948,66 @@ Az hb kh Lo -Yv -Cp -aX -TM -TM -xj -xj -yY -wg -dQ -Xu -XM -TM -tW -tW -yH -yH -TM -qh -wm -wg -yH -yH -yH -yH -Vi -wg -wg -UD -IZ -tW -qh -yH -BR -Sx -Ys -wg +ZS +CL +xO +ce +ce +Ut +Ut +Ed +ir +Hc +Mg +MU +ce +Ap +Ap +Xm +Xm +ce +zt +qQ +ir +Xm +Xm +Xm +Xm +os +ir +ir +KR +zl +Ap +zt +Xm +Wx +kH +nj +ir Bx BK wy av Bx -wg +ir Wo BK oA Gh Bx -aW -GI -dy -Kw -rK -Kw -Kw -MT -UH -ZW -sr -wg +nS +Ev +WD +BV +Fv +BV +BV +vC +BT +zN +PB +ir UE UE "} @@ -12021,65 +12026,65 @@ bs wd Lo fW -Im -fs -Tw -Tw -Tw -Tw -Tw -Tw -ma -Xu -XM -qm -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -Tw -qm -qm -fw -rq -wg -wg -ri -aW -wg +za +aY +fC +fC +fC +fC +fC +fC +kv +Mg +MU +wr +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +fC +wr +wr +Lk +ua +ir +ir +LJ +nS +ir Wo Wo Bx jh Wo -wg +ir Wo Bx Bx fi Wo -UJ -hw -aW -Kw -Kw -Kw -MT -yj -ZW -ZW -uD -Ry +do +aO +nS +BV +BV +BV +vC +Bu +zN +zN +RV +TU UE UE "} @@ -12091,72 +12096,72 @@ UE UE UE Lo -PJ -PJ +Ss +Ss hE -PJ -PJ +Ss +Ss Ft -wi -Tf -Tf -Tz -Tz -Tz -af -af -Tf -Tf -Xu -Bk -Bk -Tf -Tf -Tf -Tf -Tf -Tf -qh -qh -Tf -Tf -Tf -Bk -Bk -Tf -Tf -Bk -Bk -Tf -Yv -Tw -Tw -Fc -Ak -Yv -Vw -gh -NN -LX -qh -qh -Vw -Vw -Vw -ri -wg -Jd -Ys -ws -wg -yH -MT -MT -PL -ZW -ZW -Ce -wg +pO +qW +qW +oQ +oQ +oQ +xw +xw +qW +qW +Mg +Nb +Nb +qW +qW +qW +qW +qW +qW +zt +zt +qW +qW +qW +Nb +Nb +qW +qW +Nb +Nb +qW +ZS +fC +fC +Ur +bd +ZS +Gv +Yw +Hw +bP +zt +zt +Gv +Gv +Gv +LJ +ir +xC +nj +Be +ir +Xm +vC +vC +SH +zN +zN +Hd +ir UE UE "} @@ -12168,72 +12173,72 @@ UE UE UE Lo -Qs +Mx Vl Td GD GD vD -tQ -DO -Dq -Wb -Wb -Wb -Wb -DO -DO -DO -Uv -VI -VA -VA -VA -NM -NM -wg -wg -DY -AR -yh -tg -tg -VA -VI -VI -VA -Lr -Lr -Lr -VA -mb -mb -JP -Tz -jH -aW -MT -MT -aC -ko -aW -aW -aW -aC -Zk -Jd -aW -BR -Iq -wg -Ry -MT -UH -ZW -ZW -Ce -qh -wg +fB +ww +mD +Qk +Qk +Qk +Qk +ww +ww +ww +aP +ly +Aa +Aa +Aa +qG +qG +ir +ir +sA +Wv +uf +Fh +Fh +Aa +ly +ly +Aa +eU +eU +eU +Aa +yr +yr +JD +oQ +gW +nS +vC +vC +AT +We +nS +nS +nS +AT +jJ +xC +nS +Wx +DK +ir +TU +vC +BT +zN +zN +Hd +zt +ir UE UE "} @@ -12251,65 +12256,65 @@ Lp PJ PJ Ft -wi -Tf -Zf -Tz -Tf -Tf -Tz -Tf -Tf -Tf -Zf -Tf -Tf -Tf -Tf -Tf -Tz -BR -NC -OT -BR -wg -RM -Tf -Tf -Tf -Bk -Bk -Bk -Tf -HB -Tf -Tf -Tf -Tf -gE -NL -kI -kI -bI -Jd -Eq -Jd -Jd -kI -WE -Wr -qh -cN -DY -AD -Bs -MT -MT -vm -ZW -Ce -qh -wg +pO +qW +Ne +oQ +qW +qW +oQ +qW +qW +qW +Ne +qW +qW +qW +qW +qW +oQ +Wx +Fz +sz +Wx +ir +IB +qW +qW +qW +Nb +Nb +Nb +qW +df +qW +qW +qW +qW +Gi +xS +vn +vn +oK +xC +pu +xC +xC +vn +hj +HS +zt +EB +sA +eV +YN +vC +vC +ju +zN +Hd +zt +ir UE UE UE @@ -12328,64 +12333,64 @@ uz Dr Eg Lo -Xj -iq -Zf -LD -Gr -uR -io -io -io -tI -Ax -aq -io -io -io -uR -Bg -Tz -BR -wZ -BR -wg -vi -vi -eq -eq -eq -Bg -Tf -Tf -Tz -Tz -Tz -Tz -Tf -Tf -dR -aW -wg -Eq -Eq -KW -wg -Vw -Vw -Vw -cY -qh -qh -wg -wg -fj -MT -PL -ZW -uD -qh -wg +ic +ln +Ne +JE +UQ +Py +eG +eG +eG +aJ +Lx +Yo +eG +eG +eG +Py +uE +oQ +Wx +bu +Wx +ir +cu +cu +VW +VW +VW +uE +qW +qW +oQ +oQ +oQ +oQ +qW +qW +EX +nS +ir +pu +pu +tn +ir +Gv +Gv +Gv +Gq +zt +zt +ir +ir +dv +vC +SH +zN +RV +zt +ir UE UE UE @@ -12405,63 +12410,63 @@ HZ PJ oI Lo -Gr -By -Zf -Tz -uR -io -yx -AG -Xl -Mu -FA -Ai -iL -Vu -lR -io -uR -Tf -BR -BR -wg -wg -yH -wg -wg -wg -wg -qs -fS -mi -VM -Gr -eq -eq -DM -DM -Vq -aW -wg -wg -Eq -TV -TM +UQ +xX +Ne +oQ +Py +eG +Nf +ls +ep +hy +ZO +Mk +pe +zL +rT +eG +Py +qW +Wx +Wx +ir +ir +Xm +ir +ir +ir +ir +vX +jz +te +iM +UQ +VW +VW +QC +QC +rE +nS +ir +ir +pu +jM +ce Wo Wo Wo zu Wo -wg -yH -tW -TM -TM -vm -ZW -sr -wg +ir +Xm +Ap +ce +ce +ju +zN +PB +ir UE UE UE @@ -12482,63 +12487,63 @@ Lo Lo Lo BM -RN -qs -Zf -Tf -io -OG -mn -lr -Qc -dp -Nc -yv -vw -Ai -IR -tk -io -Tf -Tz -Nl -wg -yH -yH -yH -yH -wg -wg -wg -aW -wg -aW -wg -wg -wg -Bm -aW -aW -wg -wg -wg -wg -Eq -TM +ec +vX +Ne +qW +eG +EP +Rw +Et +jA +Cm +tV +ob +AL +Mk +zQ +sj +eG +qW +oQ +eO +ir +Xm +Xm +Xm +Xm +ir +ir +ir +nS +ir +nS +ir +ir +ir +ne +nS +nS +ir +ir +ir +ir +pu +ce Bx BK Xg Gh Wo -yH -Wz -tW -Rs -TM -Gb -ZW -sr -wg +Xm +dd +Ap +gP +ce +oN +zN +PB +ir UE UE UE @@ -12552,70 +12557,70 @@ UE UE UE UE -yp -yp -Zh -wg -wg -qh -wg -wg -qs -Zf -Tf -io -ek -Af -zo -vu -st -rz -Uf -CS -nV -Ai -mo -io -Bk -Bk -Nl -yH -yH -ZS -ZS -ZS -ZS -ZS -ZS -lg -ZS -lg -ZS -ZS -ZS -ZS -nt -ZS -ZS -ZS -Kw -Kw -TM -wg +vA +vA +rk +ir +ir +zt +ir +ir +vX +Ne +qW +eG +vE +lB +LL +KL +WA +DF +Pr +kt +Hu +Mk +LK +eG +Nb +Nb +eO +Xm +Xm +ed +ed +ed +ed +ed +ed +QU +ed +QU +ed +ed +ed +ed +WO +ed +ed +ed +BV +BV +ce +ir Wo La pK CV Bx -wg -tW -TM -Bm -wg -Gb -Jo -sr -wg +ir +Ap +ce +ne +ir +oN +fl +PB +ir UE UE UE @@ -12629,70 +12634,70 @@ UE UE UE UE -yp -Vi -Vi -TM -AF -qh -EJ -kQ -qs -Zf -Tf -io -gA -Uk -MD -UP -bk -TM -rz -EK -IN -Ai -Oj -io -Tf -Bk -zI -yH -tW -ZS -gk -rc -yw -rc -lG -El -Tg -YE -WI -Pq -xm -lE -lG -lG -wE -bb +vA +os +os +ce +gv +zt +Zg +Dy +vX +Ne +qW +eG +ZH +uP +jN +hp +HO +ce +DF +Yz +ym +Mk +ny +eG +qW +Nb +PX +Xm +Ap +ed +GC +bH +UC +bH zG -ZS -TM -wg +Vf +dV +ZM +cF +ys +Vd +zM +zG +zG +ei +hf +mj +ed +ce +ir Wo to nI LM Wo -wg -wg -mh -Jn -wg -vm -Jo -sr -wg +ir +ir +Li +kG +ir +ju +fl +PB +ir UE UE UE @@ -12705,73 +12710,73 @@ UE UE UE UE -yp -yp -aX -EQ -wg -AF -BR -wg -wg -qs -Zf -Tf -uR -io -SA -wg -wX -Nx -EJ -sv -ET -nY -wW -io -uR -Tf -Tf -zI -TM -tW -ZS -rc -WI -gZ +vA +vA +xO +ew +ir +gv +Wx +ir +ir +vX +Ne +qW +Py +eG +if +ir lG -uW -je -je -je -Da -Da -RF -jt -py -dk -HM -xJ -xJ -ZS -wg -wg +iB +Zg +gU +HR +Fm +gO +eG +Py +qW +qW +PX +ce +Ap +ed +bH +cF +EY +zG +YS +Pv +Pv +Pv +uK +uK +zj +fn +zm +sE +om +Iw +Iw +ed +ir +ir Wo Wo Wo Bx Wo -wg -yH -hw -tW -wg -Oi -ZW -sr -wg -wg -wg +ir +Xm +aO +Ap +ir +Ua +zN +PB +ir +ir +ir UE UE UE @@ -12781,74 +12786,74 @@ UE UE UE UE -yp -yp -yp -Hp -yH -wg -AF -hw -hw -wg -qs -Zf -Tf -Nl -uR -io -io -DY -nW -VC -rB -io -io -io -uR -qs -Tf -Tf -Nl -wg -yH -ZS -ED -lE -pI -Ul -nh -UY -wJ -zG -LV -Ou -Ou -af -Pq -yq -cP -xl -eu -ZS -wg -dY -dY -CO -wg -wg -wg -qh -AF -hw -vf -TM -TM -Oi -ZW -wQ -ue -wg +vA +vA +vA +KQ +Xm +ir +gv +aO +aO +ir +vX +Ne +qW +eO +Py +eG +eG +sA +BB +Fr +PI +eG +eG +eG +Py +vX +qW +qW +eO +ir +Xm +ed +KB +zM +mS +NX +pr +fZ +kM +mj +YQ +VT +VT +xw +ys +pY +Mp +xM +Ig +ed +ir +Ee +Ee +YW +ir +ir +ir +zt +gv +aO +sg +ce +ce +Ua +zN +nb +Ck +ir UE UE UE @@ -12857,76 +12862,76 @@ UE UE UE UE -yp -yp -DY -yp -yp -yp -wg -hw -yH -iU -yH -qs -PU -AO -Wn -Jn -tW -Km -wg -qK -ek -MT -Vi -UD -UD -tW -qs -AO -AO -Nl -wg -wg -ZS -rc -xn -aG -zZ -BR -BR -JC -UY -PW -UA -we -Gm -jt -lE -iu -gn -Va -ZS -TM -TM -tW -yH -LA -wg -wg -yH -hw -FQ -yH -Wz -TM -wg -Oi -Jo -sr -wg -wg +vA +vA +sA +vA +vA +vA +ir +aO +Xm +bX +Xm +vX +Up +MH +BG +kG +Ap +QJ +ir +oc +vE +vC +os +KR +KR +Ap +vX +MH +MH +eO +ir +ir +ed +bH +FR +uS +ZX +Wx +Wx +Ac +fZ +Wd +ab +qS +DN +fn +zM +Cx +vx +Qj +ed +ce +ce +Ap +Xm +eA +ir +ir +Xm +aO +mg +Xm +dd +ce +ir +Ua +fl +PB +ir +ir UE UE "} @@ -12934,76 +12939,76 @@ UE UE UE UE -yp -Eq -KW -EJ -kr -yp -aW -Jn -aC -Vi -yH -yH -VQ -Ys -hw -yH -Vi -ho -MT -MT -MT -MT -Yf -UD -tW -TM -wg -aW -aW -aW -aW -aW -sL -rG -fu -uq -BR -KT -wg -BR -ay -wg -Cy -af -py -Pq -WS -iu -Df -Va -ZS -wg -wg -vf -TM -TM -wg -wg -Wz -yH -UD -UD -yH -ck -wg -TM -Gb -ZW -ue -wg +vA +pu +tn +Zg +oD +vA +nS +kG +AT +os +Xm +Xm +Vs +nj +aO +Xm +os +QS +vC +vC +vC +vC +bT +KR +Ap +ce +ir +nS +nS +nS +nS +nS +kK +OU +AA +JW +Wx +vU +ir +Wx +dS +ir +vv +xw +zm +ys +sb +Cx +TO +Qj +ed +ir +ir +sg +ce +ce +ir +ir +dd +Xm +KR +KR +Xm +TA +ir +ce +oN +zN +Ck +ir UE UE "} @@ -13011,76 +13016,76 @@ UE UE UE UE -yp -xr -dU -NC -WN -ZU -Ys -pf -hv -hv -LX -aW -ri -aW -tW -yH -yH -yH -nP -Vi -Yf -yH -UD -UD -TM -wg -wg -aW -aW -wg -wm -wg -ZS -WI -fP -TQ -QX -Vg -UP -QQ -wg -BR -BR -xQ -Gm -WI -gl -Va -jt -Xc -ZS -wg -dY -wg -wg -Bt -wg -wg -yH -Vi -wg -UD -dY -ck -hw -TM -vm -ZW -sr -wg +vA +da +xG +Fz +PR +vZ +nj +ac +wM +wM +bP +nS +LJ +nS +Ap +Xm +Xm +Xm +xD +os +bT +Xm +KR +KR +ce +ir +ir +nS +nS +ir +qQ +ir +ed +cF +qD +CM +oS +jy +hp +HV +ir +Wx +Wx +cE +DN +cF +yI +Qj +fn +NK +ed +ir +Ee +ir +ir +ME +ir +ir +Xm +os +ir +KR +Ee +TA +aO +ce +ju +zN +PB +ir UE UE "} @@ -13088,76 +13093,76 @@ UE UE UE UE -yp -LO -Eq -EJ -yp -pf -Bm -TM -MT -Fs -qh -kD -ri -aW -tW -TM -TM -yH -ot -Yf -wg -yH -UD -tW -tW -aW -aW -aW -aW -aW -aW -aW -Zw -Tp -sT -wg -QX -gg -NC -Dn -bp -gg -BR -zG -yc -WI -ij -jl -Xc -jt -ZS -dY -dY -wg -FY -bk -xr -wg -wg -MT -MT -Vi -dY -CO -DX -TM -vm -ZW -sr -wg +vA +Pc +pu +Zg +vA +ac +ne +ce +vC +BE +zt +AY +LJ +nS +Ap +ce +ce +Xm +hF +bT +ir +Xm +KR +Ap +Ap +nS +nS +nS +nS +nS +nS +nS +ag +fD +ji +ir +oS +Zp +Fz +io +HE +Zp +Wx +mj +QD +cF +Pl +nc +NK +fn +ed +Ee +Ee +ir +yP +HO +da +ir +ir +vC +vC +os +Ee +YW +nG +ce +ju +zN +PB +ir UE UE "} @@ -13165,177 +13170,177 @@ UE UE UE UE -Tv -Tv -xr -yp -yp -yp -tW -tW -Vi -Vi -jE -MT -ri -aW -yH -wg -TM -Bm -ZU -aW -aW -aW -ZU -ZU -aW -wg -yH -aC -aC -wg -qh -wg -ZS -WI -je -tE -wg -QX -DY -tR -ui -bp -wg -wk -On -rc -zc -lG -iN -pT -ZS -LA -wg -wg -DY -Nx -bk -wg -yH -wg -cd -lS -rY -yH -Jn -BR -vm -ZW -BH -wg +Jx +Jx +da +vA +vA +vA +Ap +Ap +os +os +LY +vC +LJ +nS +Xm +ir +ce +ne +vZ +nS +nS +nS +vZ +vZ +nS +ir +Xm +AT +AT +ir +zt +ir +ed +cF +Pv +Gu +ir +oS +sA +Rd +ZB +HE +ir +fd +gN +bH +TZ +zG +Ja +xT +ed +eA +ir +ir +sA +iB +HO +ir +Xm +ir +hH +cn +Ka +Xm +kG +Wx +ju +zN +cv +ir UE UE "} (73,1,1) = {" UE UE -jx -Cu -SA +pZ +Vt +if AQ xo Xq Xq Wo -tW -aU -yH -wg -wg -GK -aC -aC -BR -Ys -hw -TM -TM -wg -wg -TM -wg -wg -yH -yH -yH -aW -qh -qh -tW -ZS -GP -lG -LV -Rp -wg -jQ -xr -jS -wg -BR -Ul -lG -lG -zc -WI -jt -Si -Gt -aW -KP -xj -uL -KW -wg -wg -wg -LA -dY -br -lO -Wz -wg -BR -vm -sr -wg -wg +Ap +RP +Xm +ir +ir +SX +AT +AT +Wx +nj +aO +ce +ce +ir +ir +ce +ir +ir +Xm +Xm +Xm +nS +zt +zt +Ap +ed +RU +zG +YQ +pn +ir +Xb +da +nA +ir +Wx +NX +zG +zG +TZ +cF +fn +zB +FU +nS +Xe +Ut +zd +tn +ir +ir +ir +eA +Ee +Nr +oe +dd +ir +Wx +ju +PB +ir +ir UE UE "} (74,1,1) = {" UE UE -zG -uY +mj +UB uC wB AQ vK xE Bx -yH -Vi -TM -wg -wg -ri -aW -iX -iX -yH +Xm +os +ce +ir +ir +LJ +nS +AE +AE +Xm Wo Wo Bx @@ -13345,49 +13350,49 @@ Bx Wo Wo Wo -wg -aW -aW -qh -UD -tW -ZS -WI -xJ -Lt -iD -wg -UP -ui -EN -wg -SA -yJ -WI -WI -hr -jt -jt -lF -ZS -wg -aW -TM -uL -wg -TM -TM -Wz -yH -LA -hY -lO -tW -wg -MN -ZW -sr -wg +ir +nS +nS +zt +KR +Ap +ed +cF +Iw +bn +hS +ir +hp +ZB +QY +ir +if +VV +cF +cF +fg +fn +fn +KG +ed +ir +nS +ce +zd +ir +ce +ce +dd +Xm +eA +bK +oe +Ap +ir +AP +zN +PB +ir UE UE UE @@ -13403,16 +13408,16 @@ wH KE Uj Wo -yH -hw -Jn -Bm -wg -ri -aW -yH -UD -yH +Xm +aO +kG +ne +ir +LJ +nS +Xm +KR +Xm Wo zr Wo @@ -13422,49 +13427,49 @@ uT Wo cQ Bx -TM -ZU -TM -TM -tW -dY -ZS -WF -py -fu -tr -UZ -kW -wg -BR -Rb -af -jt -lG -jP -Nm -Si -UM -Qv -ZS -wg -ZU -TM -YZ -Jt -Nc -Ik -ZS -Ik -ZS -Vi -dE -zw -TM -Gb -Jo -CZ -wg +ce +vZ +ce +ce +Ap +Ee +ed +Iv +zm +AA +Cl +Pn +OB +ir +Wx +Bq +xw +fn +zG +Zn +nZ +zB +Ri +dc +ed +ir +vZ +ce +yV +oi +tV +Sm +ed +Sm +ed +os +sD +by +ce +oN +fl +dA +ir UE UE UE @@ -13480,16 +13485,16 @@ wB Vh SS Wo -yH -yH -yH -Bm -BR -ri -aW -yH -yH -UD +Xm +Xm +Xm +ne +Wx +LJ +nS +Xm +Xm +KR Wo ex Bx @@ -13499,49 +13504,49 @@ ro Bx ex Wo -wg -ZU -aW -wg -wg -yH -ZS -Dw -rn -WI -VO -qi -xJ -af -mp -WI -rn -Yb -gn -Va -Nm -WI -WI -bj -ZS -wg -aW -wg -DQ -SA -LH -Ae -Fq -Fq -Ik -wg -wg -wg -TM -Oi -ZW -CZ -wg +ir +vZ +nS +ir +ir +Xm +ed +MZ +Wi +cF +kj +bt +Iw +xw +qa +cF +Wi +eZ +vx +Qj +nZ +cF +cF +Go +ed +ir +nS +ir +GU +if +Iz +oo +Om +Om +Sm +ir +ir +ir +ce +Ua +zN +dA +ir UE UE UE @@ -13557,16 +13562,16 @@ TW Mr Se Bx -yH -wg -wg -yH -iX -tt -aW -aW -yH -yH +Xm +ir +ir +Xm +AE +Bb +nS +nS +Xm +Xm Bx wB AZ @@ -13576,49 +13581,49 @@ kn YR OW Wo -wg -aW -ZU -wg -wg -yH -ZS -Tc -WI -fX -WI -yv -lG -jw -WI -jt -Va -Zo -tL -rc -zc -rX -zc -wK -ZS -wg -ZU -ZU -Cu -sY -lL -rr -WI -WI -ZS -wg -yH -yH -tW -wg -vm -CZ -wg +ir +nS +vZ +ir +ir +Xm +ed +OR +cF +Bf +cF +ob +zG +aH +cF +fn +Qj +kP +VF +bH +TZ +xH +TZ +cH +ed +ir +vZ +vZ +Vt +bh +mk +og +cF +cF +ed +ir +Xm +Xm +Ap +ir +ju +dA +ir UE UE UE @@ -13634,16 +13639,16 @@ nM rl Se Wo -yH -yH -yH -qh -AF -wg -Yp -aW -ZU -aW +Xm +Xm +Xm +zt +gv +ir +RR +nS +vZ +nS yA QZ AQ @@ -13653,49 +13658,49 @@ Pg rh Yj PG -aW -aW -TM -TM -wg -wg -ZS -ZS -ZS -ZS -ZS -qR -xJ -ZS -kE -ZS -ZS -ZS -ZS -ZS -ZS -ZS -ZS -ZS -ZS -wg -jX -wg -ZS -BC -kS -WI -AH -DL -ZS -yH -yH -ms -tW -wg -vm -CZ -TM +nS +nS +ce +ce +ir +ir +ed +ed +ed +ed +ed +GB +Iw +ed +mG +ed +ed +ed +ed +ed +ed +ed +ed +ed +ed +ir +pv +ir +ed +wf +FI +cF +wv +tP +ed +Xm +Xm +kX +Ap +ir +ju +dA +ce UE UE UE @@ -13704,23 +13709,23 @@ UE UE UE Wo -JR +xs WZ Xz EV rJ -CW +Jm Wo -yH -UD -qh -wg -hw -Fx -YU -dJ -ZU -wg +Xm +KR +zt +ir +aO +ZA +Oe +DJ +vZ +ir Wo wB Xk @@ -13730,49 +13735,49 @@ YI Tr kf Bx -wg -aW -wg -TM -tW -wg -yH -yH -tW -wg -tA -MT -LX -yi -aW -wg -yH -dE -Xs -dE -yH -yH -dE -LA -Ra -TM -ZU -aC -lY -WI -zG -WI -zG -WI -Ik -yH -CO -Dh -wg -wg -vm -sr -wg +ir +nS +ir +ce +Ap +ir +Xm +Xm +Ap +ir +fE +vC +bP +QW +nS +ir +Xm +sD +No +sD +Xm +Xm +sD +eA +jx +ce +vZ +AT +Ql +cF +mj +cF +mj +cF +Sm +Xm +YW +YP +ir +ir +ju +PB +ir UE UE UE @@ -13781,23 +13786,23 @@ UE UE UE Wo -wB +xz Ic Xz Xz rJ -mv +sl Bx -yH -qh -wg -ek -MT -OA -ZU -ZU -Zs -IW +Xm +zt +ir +vE +vC +mU +vZ +vZ +km +XV hL cO uQ @@ -13807,49 +13812,49 @@ wB kn hN fA -aW -aW -wg -wg -yH -wg -TM -aX -aX -wg -Jd -LX -Na -Wz -wg -tA -yH -TM -TM -TM -tW -dE -mQ -Ii -LA -TM -qh -aC -Ik -fV -QB -bj -fV -JT -ZS -yH -EE -dY -wg -tB -ZW -sr -wg +nS +nS +ir +ir +Xm +ir +ce +xO +xO +ir +xC +bP +Ki +dd +ir +fE +Xm +ce +ce +ce +Ap +sD +He +eh +eA +ce +zt +AT +Sm +fJ +RG +Go +fJ +mW +ed +Xm +nq +Ee +ir +Tb +zN +PB +ir UE UE UE @@ -13865,16 +13870,16 @@ Ug Uj Se Wo -yH -yH -ek -ek -SF -aW -aW -wg -wg -ri +Xm +Xm +vE +vE +sm +nS +nS +ir +ir +LJ Wo WQ Wo @@ -13884,49 +13889,49 @@ Uz pM hN Wo -yH -aW -aW -wg -Ra -aX -MT -MT -wg -aW -aW -yH -yH -yH -yH -yH -yH -tW -yH -wg -wg -TM -wg -yH -Ra -nP -MT -LX -ZS -ZS -ZS -Ik -ZS -Ik -ZS -WG -EE -wg -TM -Jo -Jo -Fg -wg +Xm +nS +nS +ir +jx +xO +vC +vC +ir +nS +nS +Xm +Xm +Xm +Xm +Xm +Xm +Ap +Xm +ir +ir +ce +ir +Xm +jx +xD +vC +bP +ed +ed +ed +Sm +ed +Sm +ed +Ge +nq +ir +ce +fl +fl +ty +ir UE UE UE @@ -13939,19 +13944,19 @@ Hs lo cO ra -AQ +vH cO qt -kI -kI -ON -nN -aW -aW -yH -dY -dY -ri +vn +vn +Yn +EA +nS +nS +Xm +Ee +Ee +LJ Bx Wl Wo @@ -13961,49 +13966,49 @@ zV hN hN Bx -yH -aW -LX -MT -cd -Vi -yH -yH -wg -yH -yH -li -wg -wg -wg -yH -yH -wg -yH -yH -wg -TM -TM -MT -Vi -Vi -wg -Gx -TM -wg -wg -yH -yH -tW -tW -aX -Vi -TM -tB -ZW -CZ -wg -wg +Xm +nS +bP +vC +hH +os +Xm +Xm +ir +Xm +Xm +Os +ir +ir +ir +Xm +Xm +ir +Xm +Xm +ir +ce +ce +vC +os +os +ir +uU +ce +ir +ir +Xm +Xm +Ap +Ap +xO +os +ce +Tb +zN +dA +ir +ir UE UE UE @@ -14019,16 +14024,16 @@ dB Xk hJ Bx -wg -aW -sX -LX -aW -yH -dY -dY -hw -ri +ir +nS +aT +bP +nS +Xm +Ee +Ee +aO +LJ Wo DR Wo @@ -14038,48 +14043,48 @@ Tn pM WV Wo -Cu -wg -BR -MT -ap -Wz -yH -wg -wg -yH -yH -wg -wg -lk -wg -wg -yH -yH -wg -Wz -yH -wg -TM -wg -yH -JN -tW -UD -TM -wg -yH -JN -tW -DU -Vi -aX -TM -TM -ZW -Jo -BH -wg +Vt +ir +Wx +vC +DS +dd +Xm +ir +ir +Xm +Xm +ir +ir +Rg +ir +ir +Xm +Xm +ir +dd +Xm +ir +ce +ir +Xm +yx +Ap +KR +ce +ir +Xm +yx +Ap +YV +os +xO +ce +ce +zN +fl +cv +ir UE UE UE @@ -14096,16 +14101,16 @@ CP Se Se Cd -aW -aW -aW -aW -iX -iX -qh -UD -hw -tt +nS +nS +nS +nS +AE +AE +zt +KR +aO +Bb Bx Wo Bx @@ -14115,48 +14120,48 @@ Bx Bx aF aF -ci -EN -vk -yH -yH -wg -LA -wg -wg -wg -qz -TM -kF -NC -vz -wg -wg -Wz -wg -yH -tW -yH -yH -yH -TM -TM -UD -qh -TM -wg -wg -wg -wg -nP -vL -vL -wg -PL -Jo -Fg -wg -wg +YH +QY +TY +Xm +Xm +ir +eA +ir +ir +ir +CQ +ce +IT +Fz +jv +ir +ir +dd +ir +Xm +Ap +Xm +Xm +Xm +ce +ce +KR +zt +ce +ir +ir +ir +ir +xD +Yh +Yh +ir +SH +fl +ty +ir +ir UE UE UE @@ -14173,66 +14178,66 @@ HW eB Ab Wo -yH -wg -yH -AF -iX -BR -BR -BR -AF -aW -em -wg -MT -MT -yH -tW -tW -fY -Fk -vk -IG -BR -Kv -IG -MD -yH -yH -jq -tW -dE -TM -rt -Hq -xj -Av -wg -tW -TM -TM -TM -wg -wg -UD -UD -qh -qh -TM -Wz -wg -wg -UP -MT -wg -sU -wg -PL -ZW -BH -wg -wg +Xm +ir +Xm +gv +AE +Wx +Wx +Wx +gv +nS +tH +ir +vC +vC +Xm +Ap +Ap +zg +Oc +TY +zF +Wx +zD +zF +jN +Xm +Xm +AV +Ap +sD +ce +wx +AU +Ut +kw +ir +Ap +ce +ce +ce +ir +ir +KR +KR +zt +zt +ce +dd +ir +ir +hp +vC +ir +od +ir +SH +zN +cv +ir +ir UE UE UE @@ -14243,72 +14248,72 @@ UE UE UE Wo -SS +rR Mr kl rv Se -SS +GO Wo -yH -wg -hw -Vi -yH -wg -wg -hw -bz -UD -aW -Zc -MT -TM -TM -TM -tW -Ub -qE -Kv -MY -Uh -BR -vt -fb -wg -dE -zw -dE -wg -wg -ge -EJ -EJ -wg -wg -yH -UE -UE -UE -wg -wg -UE -UE -UE -UE -wg -wg -wg -xj -xj -NC -bk -wg -PL -uB -BH -wg -wg +Xm +ir +aO +os +Xm +ir +ir +aO +XN +KR +nS +pk +vC +ce +ce +ce +Ap +HK +YE +zD +PN +tw +Wx +qN +tm +ir +sD +by +sD +ir +ir +kg +Zg +Zg +ir +ir +Xm +UE +UE +UE +ir +ir +UE +UE +UE +UE +ir +ir +ir +Ut +Ut +Fz +HO +ir +SH +gC +cv +ir +ir UE UE UE @@ -14320,50 +14325,50 @@ UE UE UE Wo -Yl +BJ Se Xz eR cT -Mh +Ta Wo -yH -TM -Vi -Vi -yH -TM -wg -wg -hX -tN -yH -LX -yb -tW -TM -TM -Jn -JK -ax -IG -tv -tx -KW -gw -BR -wg -yH -dE -xZ -wg -wg -TM -wg -wg -wg -yH -yH +Xm +ce +os +os +Xm +ce +ir +ir +Ik +Kn +Xm +bP +xh +Ap +ce +ce +kG +BU +Dt +zF +bU +ZR +tn +gV +Wx +ir +Xm +sD +RC +ir +ir +ce +ir +ir +ir +Xm +Xm UE UE UE @@ -14375,16 +14380,16 @@ UE UE UE UE -wg -EJ -xj -rA -DY -wg -QP -wg -wg -wg +ir +Zg +Ut +jr +sA +ir +Jb +ir +ir +ir UE UE UE @@ -14404,42 +14409,42 @@ Xz Se SS Wo -wg -wg -aX -tW -tW -MT -MT -wg -yH -CO -CO -MT -tf -tW -tW -iX -iX -fY -ou -rM -wg -DY -Tx -UP -cI -TM -yH -Ra -dE -yH -pJ -TM -wg -yH -yH -yH +ir +ir +xO +Ap +Ap +vC +vC +ir +Xm +YW +YW +vC +qY +Ap +Ap +AE +AE +zg +Cb +Kd +ir +sA +IP +hp +US +ce +Xm +jx +sD +Xm +wC +ce +ir +Xm +Xm +Xm UE UE UE @@ -14452,14 +14457,14 @@ UE UE UE UE -wg -wg -EJ -EJ -wg -wg -wg -wg +ir +ir +Zg +Zg +ir +ir +ir +ir UE UE UE @@ -14481,40 +14486,40 @@ Ug kf ur Wo -wg -yH -yH -tW -xI -MT +ir +Xm +Xm +Ap +ii +vC dP QE QE QE QE dP -jU -ZU -yH -hw -yH -hw -ax -qh -EJ -tv -UP -yM -yM -TM -yH -wg -Wz -DU -yH -yH -yH -yH +GQ +vZ +Xm +aO +Xm +aO +Dt +zt +Zg +bU +hp +et +et +ce +Xm +ir +dd +YV +Xm +Xm +Xm +Xm UE UE UE @@ -14530,10 +14535,10 @@ UE UE UE UE -wg -wg -wg -wg +ir +ir +ir +ir UE UE UE @@ -14558,35 +14563,35 @@ an AQ ID Bx -wg -yH -yH -aX -MT -wg +ir +Xm +Xm +xO +vC +ir QE Nt zK Pf xg QE -ri -aW -BR -yH -dY -hw -BR -wg -yY -gg -Qh -po -vt -wg -Ra -yH -yH +LJ +nS +Wx +Xm +Ee +aO +Wx +ir +Ed +Zp +Ml +gG +qN +ir +jx +Xm +Xm UE UE UE @@ -14635,35 +14640,35 @@ dC XX Co Bx -Yf -yH -Vi -TM -wg -yH +bT +Xm +os +ce +ir +Xm QE Nt qv bF of Sf -ai -BR -BR -yH -dY -dY -hw -wg -wg -wg -po -wg -EN -wg -Wz -LA -yH +Aw +Wx +Wx +Xm +Ee +Ee +aO +ir +ir +ir +gG +ir +QY +ir +dd +eA +Xm UE UE UE @@ -14711,35 +14716,35 @@ Xq kf Xq Bx -zG -wg -qh -qh -TM -TM -yH +mj +ir +zt +zt +ce +ce +Xm QE Nt eK nm Rq QE -wg -BR -yH -yH +ir +Wx +Xm +Xm UE -yH -ms -hw -wg -wg -wg -wg -wg -yH -yH -yH +Xm +kX +aO +ir +ir +ir +ir +ir +Xm +Xm +Xm UE UE UE @@ -14783,39 +14788,39 @@ UE UE UE UE -MT -MT -MT -wg -wg -wg -wg -qh -UD -UD -TM -TM +vC +vC +vC +ir +ir +ir +ir +zt +KR +KR +ce +ce dP QE QE QE QE dP -BR -yH -CO +Wx +Xm +YW UE UE -yH -dY -yH -FP -yH -Wz -dY -dY -yH -yH +Xm +Ee +Xm +IO +Xm +dd +Ee +Ee +Xm +Xm UE UE UE @@ -14860,37 +14865,37 @@ UE UE UE UE -MT -wg -UP -UP -YB -wg +vC +ir +hp +hp +oy +ir UE -wg -qh -UD -qh -TM -TM -wg -Ra -wg -wg -wg -wg -yH -Wz +ir +zt +KR +zt +ce +ce +ir +jx +ir +ir +ir +ir +Xm +dd UE UE UE UE UE -dY -qb -dY -qb -yH +Ee +qc +Ee +qc +Xm UE UE UE @@ -14938,25 +14943,25 @@ UE UE UE UE -wg -wg -kQ -EJ -wg +ir +ir +Dy +Zg +ir UE UE -wm -qh -qh -qh -TM -tW -tW -wg -wg -yH -CO -yH +qQ +zt +zt +zt +ce +Ap +Ap +ir +ir +Xm +YW +Xm UE UE UE @@ -15015,23 +15020,23 @@ UE UE UE UE -wg -wg -wg -wg -wg +ir +ir +ir +ir +ir UE UE UE -wg -qh -UD -dE -dE -jd -TM -tW -tW +ir +zt +KR +sD +sD +jO +ce +Ap +Ap UE UE UE @@ -15101,13 +15106,13 @@ UE UE UE UE -wg -yH -dE -dY -dY -wg -yH +ir +Xm +sD +Ee +Ee +ir +Xm UE UE UE @@ -15178,12 +15183,12 @@ UE UE UE UE -wg -LA -dY -dE -yH -wg +ir +eA +Ee +sD +Xm +ir UE UE UE @@ -15255,12 +15260,12 @@ UE UE UE UE -wg -wg -LA -yH -wg -wg +ir +ir +eA +Xm +ir +ir UE UE UE @@ -15334,9 +15339,9 @@ UE UE UE UE -YB -wg -wg +oy +ir +ir UE UE UE diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_codelab.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_codelab.dmm index 04ada2692122..1bbc1b76a834 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_codelab.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_codelab.dmm @@ -238,9 +238,10 @@ /obj/structure/fluff/paper/stack{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/ruin/unpowered/codelab/subjectrooms) "cO" = ( @@ -424,7 +425,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plasteel/white, /area/ruin/unpowered/codelab/subjectrooms) "eY" = ( @@ -617,6 +618,13 @@ /obj/effect/turf_decal/industrial/stand_clear, /turf/open/floor/plating, /area/ruin/unpowered/codelab/maintenance) +"hB" = ( +/obj/effect/turf_decal/corner/opaque/white/mono, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/codelab/subjectrooms) "hE" = ( /turf/closed/wall/mineral/titanium, /area/ruin/unpowered/codelab/reception) @@ -5162,7 +5170,7 @@ ir XS He rY -GN +hB Ru GN hE diff --git a/_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm b/_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm index d36bbab74454..b663f0ad2bd1 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm @@ -480,23 +480,6 @@ }, /turf/open/floor/plating, /area/ruin/unpowered) -"sA" = ( -/obj/docking_port/mobile{ - callTime = 250; - can_move_docking_ports = 1; - dir = 2; - dwidth = 11; - height = 17; - launch_status = 0; - name = "Salvage Ship"; - port_direction = 8; - preferred_direction = 4; - width = 33 - }, -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plasteel, -/area/ruin/unpowered) "sN" = ( /obj/machinery/processor, /obj/effect/decal/cleanable/dirt/dust, @@ -1370,6 +1353,11 @@ }, /turf/open/floor/plating, /area/ruin/unpowered) +"WS" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plasteel, +/area/ruin/unpowered) "Xh" = ( /obj/structure/table, /obj/item/storage/bag/plants/portaseeder, @@ -1386,9 +1374,6 @@ }, /turf/open/floor/plasteel/cult, /area/ruin/unpowered) -"XI" = ( -/turf/closed/mineral/random/rockplanet, -/area/overmap_encounter/planetoid/rockplanet/explored) "XN" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood, @@ -1409,6 +1394,9 @@ }, /turf/open/floor/plasteel/cult, /area/ruin/unpowered) +"Zf" = ( +/turf/closed/mineral/random/rockplanet, +/area/overmap_encounter/planetoid/rockplanet/explored) "Zg" = ( /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 9 @@ -1729,7 +1717,7 @@ RY nv "} (16,1,1) = {" -sA +WS Bz hw ul @@ -1826,10 +1814,10 @@ li Es Es Es -XI +Zf "} (21,1,1) = {" -XI +Zf Es Us Es @@ -1844,12 +1832,12 @@ xD Us eK ou -XI -XI -XI +Zf +Zf +Zf "} (22,1,1) = {" -XI +Zf Es Es jU @@ -1863,14 +1851,14 @@ fg xD xD eK -XI -XI -XI -XI +Zf +Zf +Zf +Zf "} (23,1,1) = {" -XI -XI +Zf +Zf Es SP Es @@ -1889,8 +1877,8 @@ SP Es "} (24,1,1) = {" -XI -XI +Zf +Zf Es ou Es @@ -1904,14 +1892,14 @@ ct xD Es jU -XI -XI +Zf +Zf Es "} (25,1,1) = {" -XI -XI -XI +Zf +Zf +Zf Es Es Nt @@ -1923,16 +1911,16 @@ GW xD xD Es -XI -XI -XI -XI +Zf +Zf +Zf +Zf "} (26,1,1) = {" -XI -XI -XI -XI +Zf +Zf +Zf +Zf Es Es Nt @@ -1945,6 +1933,6 @@ Es Es Es Es -XI -XI +Zf +Zf "} diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_medipen_plant.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_medipen_plant.dmm index 2e167f56d1ef..e9d9c42c3028 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_medipen_plant.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_medipen_plant.dmm @@ -17,6 +17,14 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/powered) +"aV" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ruin/powered) "bu" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -69,6 +77,19 @@ /obj/effect/turf_decal/box, /turf/open/floor/engine, /area/ruin/powered) +"cN" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ruin/powered) "cZ" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -107,6 +128,14 @@ icon_state = "platingdmg1" }, /area/ruin/powered) +"dQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ruin/powered) "dR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 8 @@ -174,6 +203,15 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered) +"fh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/ruin/powered) "fl" = ( /obj/structure/table_frame, /obj/item/shard{ @@ -208,23 +246,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/powered) -"fG" = ( -/obj/item/shard{ - icon_state = "tiny" - }, -/obj/item/shard{ - icon_state = "small" - }, -/obj/item/shard, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, +"fO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/ruin/powered) -"fJ" = ( +"fY" = ( /obj/effect/turf_decal/industrial/warning{ dir = 8 }, @@ -232,14 +258,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 - }, /turf/open/floor/plasteel, /area/ruin/powered) -"fO" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plating, +"ge" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/ruin/powered) "gn" = ( /obj/effect/decal/cleanable/dirt, @@ -292,13 +322,6 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered) -"hq" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "hC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -507,18 +530,6 @@ }, /turf/open/floor/plasteel/white, /area/ruin/powered) -"nF" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/corner/transparent/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/corner/transparent/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "nQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 8 @@ -557,6 +568,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/powered) +"oL" = ( +/obj/item/shard{ + icon_state = "tiny" + }, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered) "oW" = ( /obj/structure/rack, /obj/item/storage/box, @@ -710,20 +733,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/powered) -"sT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 +"sS" = ( +/obj/structure/rack, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = -3 }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, +/turf/open/floor/plasteel/dark, /area/ruin/powered) "tu" = ( /obj/structure/table, @@ -743,11 +763,6 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/powered) -"uc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "uu" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/corner/transparent/neutral{ @@ -913,6 +928,14 @@ icon_state = "platingdmg1" }, /area/ruin/powered) +"zN" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/powered) "zQ" = ( /obj/structure/table/glass, /obj/effect/turf_decal/industrial/warning{ @@ -982,12 +1005,30 @@ }, /turf/open/floor/plating, /area/ruin/powered) +"BD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered) "BH" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ icon_state = "platingdmg2" }, /area/ruin/powered) +"BI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/ruin/powered) "BS" = ( /obj/effect/turf_decal/industrial/warning{ dir = 8 @@ -1058,13 +1099,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/plasteel/white, /area/ruin/powered) -"FM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "FO" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -1146,6 +1180,14 @@ "Jb" = ( /turf/closed/wall, /area/ruin/powered) +"Jm" = ( +/obj/machinery/light/directional/south, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ruin/powered) "Jq" = ( /obj/effect/turf_decal/industrial/loading, /turf/open/floor/engine, @@ -1281,17 +1323,12 @@ "Nb" = ( /turf/open/floor/plating/asteroid/whitesands, /area/ruin/powered) -"Nd" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/turf_decal/corner/transparent/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/corner/transparent/neutral{ - dir = 4 +"NN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/ruin/powered) "OB" = ( /obj/effect/decal/cleanable/dirt, @@ -1364,21 +1401,6 @@ icon_state = "platingdmg3" }, /area/ruin/powered) -"Qa" = ( -/obj/item/shard{ - icon_state = "tiny" - }, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/powered) "Qc" = ( /obj/machinery/plumbing/tank, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1402,16 +1424,6 @@ }, /turf/open/floor/plating, /area/ruin/powered) -"Qr" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "QP" = ( /obj/machinery/door/airlock/vault/derelict, /obj/structure/cable, @@ -1478,31 +1490,27 @@ }, /turf/open/floor/plasteel, /area/ruin/powered) -"SL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ruin/powered) "Tb" = ( /obj/machinery/plumbing, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, /area/ruin/powered) -"Tc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/ruin/powered) "Te" = ( /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel/white, /area/ruin/powered) +"TY" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/powered) "Ub" = ( /obj/effect/turf_decal/corner/transparent/neutral{ dir = 1 @@ -1516,18 +1524,12 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/powered) -"Ud" = ( -/obj/structure/rack, -/obj/item/storage/firstaid/brute, -/obj/item/storage/firstaid/fire{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +"Uo" = ( +/obj/item/paper{ + default_raw_text = "First, pack the medpens in a box, this is nessarary or else the launchpad won't take the pens. Second, leave them on the pad, and click send. From there, they will be managed and transported to mining vendors all over the galaxy."; + name = "Factory loading instructions" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/ruin/powered) "UH" = ( /turf/open/floor/plating, @@ -1589,6 +1591,20 @@ /obj/structure/table_frame, /turf/open/floor/plasteel/white, /area/ruin/powered) +"VY" = ( +/obj/item/shard{ + icon_state = "tiny" + }, +/obj/item/shard{ + icon_state = "small" + }, +/obj/item/shard, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/powered) "Wa" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1722,13 +1738,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/ruin/powered) -"ZJ" = ( -/obj/item/paper{ - default_raw_text = "First, pack the medpens in a box, this is nessarary or else the launchpad won't take the pens. Second, leave them on the pad, and click send. From there, they will be managed and transported to mining vendors all over the galaxy."; - name = "Factory loading instructions" - }, -/turf/open/floor/engine, -/area/ruin/powered) "ZM" = ( /obj/structure/table, /obj/item/paper_bin, @@ -1750,6 +1759,10 @@ }, /turf/open/floor/plasteel, /area/ruin/powered) +"ZQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/powered) (1,1,1) = {" Mb @@ -2066,17 +2079,17 @@ ku Jb kF sE -sE -nF -hq -FM -Qr +gS +cN +aV +dQ +Jm Jb hY kk Qq -fG -xd +VY +Qq mh Hp AO @@ -2097,17 +2110,17 @@ pB dZ bu sE -gS -Nd -uc -Ud -SL +sE +KU +ZQ +sS +ge Ei qs Wa Qk -fJ -eI +fY +fh zk rN iP @@ -2118,7 +2131,7 @@ wq QP Fd Fd -ZJ +Uo Jq lM az @@ -2137,8 +2150,8 @@ FO sz Rs Lj -sT -SE +BI +TY kS SE SE @@ -2168,8 +2181,8 @@ Jb hY en Bn -Qa -rf +oL +zN yc rf rf @@ -2199,8 +2212,8 @@ Jb hn ir ad -Tc -ad +NN +BD zk ad oH diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_youreinsane.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_youreinsane.dmm index 4ea2350301d7..e8932e8b51ed 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_youreinsane.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_youreinsane.dmm @@ -79,8 +79,7 @@ /area/ruin/unpowered) "x" = ( /obj/effect/mob_spawn/human/engineer{ - gender = "female"; - mob_species = null + gender = "female" }, /obj/item/clothing/suit/radiation, /obj/item/clothing/head/radiation{ @@ -90,6 +89,12 @@ /obj/item/geiger_counter, /turf/open/floor/engine, /area/ruin/unpowered) +"y" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) "z" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating{ @@ -139,9 +144,6 @@ dir = 1 }, /obj/structure/frame/machine, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, @@ -268,7 +270,7 @@ Q u Y j -w +y w w "} diff --git a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm index 7371069c7a17..3c98825f7924 100644 --- a/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm +++ b/_maps/RandomRuins/SpaceRuins/Fast_Food.dmm @@ -1645,11 +1645,6 @@ /obj/item/reagent_containers/food/snacks/burger/brain, /turf/open/floor/carpet, /area/ruin/space/has_grav/powered/macspace) -"Fk" = ( -/obj/machinery/atmospherics/components/unary/tank/oxygen, -/obj/machinery/atmospherics/components/unary/tank/oxygen, -/turf/open/floor/mineral/titanium, -/area/ruin/space/has_grav/powered/macspace) "Im" = ( /obj/machinery/door/airlock/silver, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -2226,7 +2221,7 @@ aM ae dk dk -Fk +dk ae VM VM diff --git a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm index 63442dfeb7bf..78a1027fb247 100644 --- a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm +++ b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm @@ -37,6 +37,14 @@ /obj/structure/flora/rock/pile, /turf/open/floor/plating/asteroid/airless, /area/ruin/space) +"bA" = ( +/obj/machinery/vending/cigarette, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/lightgrey, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/corporatemine/hall) "bG" = ( /obj/structure/cable{ icon_state = "1-4" @@ -124,21 +132,6 @@ }, /turf/open/floor/plasteel/mono/dark, /area/ruin/space/has_grav/corporatemine/crewquarters) -"ei" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/machinery/atmospherics/pipe/simple/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/components/binary/valve/digital/on/layer4, -/obj/machinery/atmospherics/components/binary/valve/digital/on/layer2, -/turf/open/floor/plating, -/area/ruin/space/has_grav/corporatemine/hall) "eu" = ( /obj/structure/cable{ icon_state = "4-8" @@ -213,6 +206,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/ruin/space/has_grav/corporatemine/hall) +"fF" = ( +/obj/machinery/door/airlock{ + name = "Room 1" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/opaque/bar/filled/warning, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/corporatemine/crewquarters) "fK" = ( /obj/structure/cable{ icon_state = "5-8" @@ -533,20 +547,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/ruin/space) -"mp" = ( -/obj/structure/table/wood/poker, -/obj/effect/holodeck_effect/cards, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/plasteel/grimy, -/area/ruin/space/has_grav/corporatemine/crewquarters) "my" = ( /obj/machinery/door/airlock/wood{ locked = 1; @@ -639,6 +639,17 @@ /obj/item/shovel, /turf/open/floor/plating/asteroid/airless, /area/ruin/space) +"ov" = ( +/obj/structure/table/wood/poker, +/obj/effect/holodeck_effect/cards, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/corporatemine/crewquarters) "oD" = ( /obj/structure/railing, /obj/structure/catwalk/over/plated_catwalk, @@ -842,33 +853,6 @@ /obj/effect/turf_decal/industrial/outline, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/corporatemine/hall) -"uJ" = ( -/obj/machinery/door/airlock{ - name = "Room 1" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/opaque/bar/filled/warning, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/corporatemine/crewquarters) "va" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 @@ -970,6 +954,11 @@ }, /turf/open/floor/plating, /area/ruin/space) +"xK" = ( +/obj/structure/table/wood, +/obj/machinery/fax, +/turf/open/floor/wood, +/area/ruin/space/has_grav/corporatemine/crewquarters) "xT" = ( /obj/structure/cable{ icon_state = "1-10" @@ -1007,11 +996,6 @@ "yl" = ( /turf/open/floor/plating, /area/ruin/space) -"yv" = ( -/obj/structure/table/wood, -/obj/machinery/fax, -/turf/open/floor/wood, -/area/ruin/space/has_grav/corporatemine/crewquarters) "yD" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -1648,6 +1632,18 @@ }, /turf/open/floor/plating, /area/ruin/space) +"JS" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/machinery/atmospherics/pipe/simple/scrubbers{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on/layer4, +/obj/machinery/atmospherics/components/binary/valve/digital/on/layer2, +/turf/open/floor/plating, +/area/ruin/space/has_grav/corporatemine/hall) "Ke" = ( /turf/open/floor/plating/airless, /area/ruin/space) @@ -1817,17 +1813,6 @@ /obj/structure/lattice, /turf/open/floor/plating, /area/ruin/space) -"NV" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/spline/fancy/opaque/lightgrey, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/corporatemine/hall) "Og" = ( /obj/structure/bed, /obj/item/bedsheet/syndie, @@ -3559,7 +3544,7 @@ bc rn iW BA -yv +xK DF gf BA @@ -3713,7 +3698,7 @@ Al iW Eu AD -ei +JS CH Br WW @@ -4133,7 +4118,7 @@ yD Dn Zz qK -NV +bA pP nf zB @@ -4283,7 +4268,7 @@ BA gj cI nW -uJ +fF pK pK TT @@ -4333,7 +4318,7 @@ Al Al QR Lm -mp +ov qZ tF Qc diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm index 7ac9ff16fff2..0104b112aeda 100644 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -25,10 +25,10 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ dir = 4 }, /turf/open/floor/plastic, @@ -40,7 +40,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ dir = 1 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ dir = 1 }, /turf/open/floor/plastic, @@ -55,7 +55,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ dir = 8 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ dir = 8 }, /turf/closed/indestructible/reinforced, @@ -70,7 +70,7 @@ "ak" = ( /obj/machinery/atmospherics/components/unary/tank/oxygen{ dir = 8; - gas_type = /datum/gas/water_vapor; + gas_type = "water_vapor"; initialize_directions = 8 }, /turf/open/floor/plasteel/grimy, @@ -122,15 +122,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ dir = 6 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 6 }, /turf/open/floor/plastic, /area/ruin/space/has_grav/hellfactory) "av" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 }, @@ -138,6 +135,9 @@ dir = 4 }, /obj/structure/holobox, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, /turf/open/floor/plastic, /area/ruin/space/has_grav/hellfactory) "ax" = ( @@ -147,7 +147,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ dir = 4 }, /turf/open/floor/plastic, @@ -166,7 +166,7 @@ "aC" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4, /turf/open/floor/plastic, /area/ruin/space/has_grav/hellfactory) "aD" = ( @@ -206,7 +206,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ dir = 5 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 5 }, /turf/open/floor/plastic, @@ -218,7 +218,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 4 }, /turf/open/floor/plastic, @@ -230,7 +230,7 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ dir = 9 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ dir = 9 }, /turf/open/floor/plastic, @@ -1030,8 +1030,8 @@ "Nv" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4, /turf/open/floor/plastic, /area/ruin/space/has_grav/hellfactory) "Nx" = ( diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm index f8b9e24b2d20..67fb3c35f127 100644 --- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm +++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm @@ -1,4 +1,12 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "ac" = ( /obj/structure/cable{ icon_state = "5-9" @@ -60,21 +68,23 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"ap" = ( -/obj/machinery/conveyor{ - id = "singlabcarg" +"ao" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/railing{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 }, -/area/ruin/space/has_grav/singularitylab) +/obj/effect/turf_decal/siding/thinplating, +/obj/effect/decal/cleanable/blood{ + dir = 4; + icon_state = "gib3" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/cargo) "aq" = ( /obj/structure/chair/office{ dir = 1 @@ -109,55 +119,18 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"ax" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/effect/turf_decal/atmos/oxygen, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 1 +"az" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_y = 32 }, -/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/spacevine/dense, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab) -"ay" = ( -/obj/machinery/door/airlock{ - dir = 4; - name = "Private Quarters" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/civvie) -"aA" = ( -/turf/open/space/basic, -/area/space/nearstation) -"aC" = ( -/obj/structure/flippedtable{ - dir = 1; - icon_state = "" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/turf/open/floor/plating/asteroid, -/area/ruin/space/has_grav/singularitylab) "aD" = ( /obj/structure/cable{ icon_state = "5-9" @@ -169,11 +142,15 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"aI" = ( +"aJ" = ( /obj/structure/spacevine/dense, -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 8 +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 }, +/mob/living/simple_animal/hostile/venus_human_trap, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; @@ -224,15 +201,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"aP" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "aQ" = ( /obj/structure/transit_tube/diagonal{ dir = 4 @@ -249,23 +217,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab) -"aR" = ( -/obj/structure/table, -/obj/machinery/button/shieldwallgen{ - dir = 8; - id = "singlabhang"; - pixel_x = -5 - }, -/obj/machinery/button/door{ - dir = 8; - id = "singlabhangar"; - pixel_x = 8 - }, -/obj/structure/sign/warning/incident{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "aT" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ dir = 1 @@ -276,28 +227,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"aU" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"aY" = ( -/turf/closed/wall{ - desc = "A huge chunk of metal holding the roof of the asteroid at bay"; - name = "structural support" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "aZ" = ( /obj/structure/cable{ icon_state = "6-8" @@ -314,6 +243,22 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"ba" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "bb" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/dirt{ @@ -438,6 +383,13 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav) +"bx" = ( +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "by" = ( /obj/structure/chair/office{ dir = 4 @@ -453,18 +405,25 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) -"bD" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 1; - piping_layer = 4 +"bC" = ( +/obj/machinery/door/airlock{ + dir = 4; + name = "Private Quarters" }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/area/ruin/space/has_grav/singularitylab) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) "bH" = ( /obj/structure/railing/corner{ dir = 4 @@ -500,12 +459,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"bO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) "bV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -523,14 +476,18 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"bZ" = ( -/obj/structure/spacevine/dense, +"ca" = ( +/obj/structure/spacevine, +/obj/item/gun/energy/floragun, +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/gibspawner, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/engineering) +/area/ruin/space/has_grav/singularitylab/civvie) "cb" = ( /obj/effect/turf_decal/siding/thinplating, /obj/effect/turf_decal/siding/thinplating/corner{ @@ -570,18 +527,6 @@ /obj/structure/closet/cardboard/metal, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) -"ci" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "cj" = ( /obj/structure/closet/firecloset{ anchored = 1 @@ -592,16 +537,6 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/civvie) -"cl" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) "cm" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -615,17 +550,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"cr" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "cu" = ( /obj/effect/turf_decal/box, /obj/structure/closet/crate/medical, @@ -634,6 +558,18 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) +"cv" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "cw" = ( /obj/structure/cable{ icon_state = "2-8" @@ -654,31 +590,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"cz" = ( -/obj/machinery/door/airlock/engineering{ - dir = 8; - name = "Engine Control" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/engineering) "cB" = ( /obj/structure/cable{ icon_state = "1-2" @@ -694,6 +605,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) +"cC" = ( +/obj/machinery/door/airlock{ + name = "Private Quarters" + }, +/turf/closed/mineral/random, +/area/ruin/space/has_grav) "cD" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -729,10 +646,19 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav) -"cK" = ( -/obj/machinery/power/apc/auto_name/directional/west{ - start_charge = 0 - }, +"cI" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"cK" = ( +/obj/machinery/power/apc/auto_name/directional/west{ + start_charge = 0 + }, /obj/structure/cable{ icon_state = "0-2" }, @@ -757,18 +683,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"cP" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "cQ" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) @@ -790,6 +704,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"cT" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "cU" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 5 @@ -803,6 +728,16 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"cV" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) "cW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 6 @@ -816,6 +751,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"cZ" = ( +/obj/structure/chair/stool/bar{ + dir = 1; + name = "picnic stool"; + pixel_y = 16 + }, +/obj/effect/turf_decal/siding/wood/end, +/obj/structure/spacevine, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "da" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/grille, @@ -829,31 +774,6 @@ /obj/structure/ore_box, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) -"dc" = ( -/obj/machinery/door/airlock/engineering{ - dir = 4; - name = "Engine Control" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/engineering) "dd" = ( /obj/structure/bed, /obj/item/bedsheet/nanotrasen, @@ -868,6 +788,21 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) +"dh" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "dk" = ( /obj/machinery/door/airlock/vault{ name = "Vault" @@ -896,6 +831,48 @@ dir = 1 }, /area/ruin/space/has_grav/singularitylab) +"dr" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"dt" = ( +/obj/structure/transit_tube/station/dispenser{ + dir = 4 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/structure/spacevine, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "du" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -915,6 +892,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"dx" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "dz" = ( /obj/structure/railing{ dir = 4 @@ -924,30 +912,30 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) -"dG" = ( +"dH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/reactor) +"dI" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -31; - pixel_y = 32 - }, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/effect/decal/cleanable/insectguts, /obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab) -"dH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/reactor) +"dK" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "dL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -960,21 +948,6 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) -"dM" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/visible/layer4{ - dir = 6 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "dP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 @@ -1043,26 +1016,6 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"ed" = ( -/obj/machinery/door/airlock{ - dir = 4; - name = "Barracks" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/civvie) "eh" = ( /obj/structure/spacevine, /obj/machinery/atmospherics/components/unary/outlet_injector/on, @@ -1081,35 +1034,19 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"em" = ( -/obj/machinery/mineral/processing_unit_console{ - machinedir = 9; - pixel_x = -32; - pixel_y = -4 +"en" = ( +/obj/machinery/door/airlock{ + dir = 4; + name = "Barracks" }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/cargo) -"eo" = ( -/obj/structure/cable{ - icon_state = "1-6" +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/purple{ +/obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 5 - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) "eq" = ( /obj/structure/chair{ dir = 4 @@ -1120,23 +1057,6 @@ /obj/effect/turf_decal/corner/opaque/white/full, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"er" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/table/wood/fancy/green, -/obj/structure/fluff/beach_umbrella{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/structure/spacevine, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) "es" = ( /obj/structure/transit_tube/curved/flipped{ dir = 4 @@ -1156,28 +1076,13 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"et" = ( -/obj/item/gun/energy/e_gun/smg{ - dry_fire_sound = 'sound/items/ding.ogg'; - dry_fire_text = "ding"; - name = "\improper Modified E-TAR SMG"; - pixel_x = 5; - pixel_y = 6 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/item/stack/telecrystal{ - pixel_x = -9; - pixel_y = -4 - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 10 - }, -/obj/structure/sign/poster/official/mini_energy_gun{ - pixel_y = -32 +"eu" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/turf/open/floor/plating, +/area/space/nearstation) "ev" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 10 @@ -1187,6 +1092,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"ew" = ( +/obj/structure/toilet{ + dir = 8; + pixel_x = 6; + pixel_y = 5 + }, +/obj/structure/window/reinforced/tinted/frosted{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/civvie) "ez" = ( /obj/structure/table/wood, /obj/machinery/light/small/directional/west, @@ -1309,17 +1225,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab) -"eY" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/effect/decal/cleanable/insectguts, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "fa" = ( /obj/structure/spacevine/dense, /turf/open/floor/plating/dirt{ @@ -1348,15 +1253,29 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab/engineering) -"fg" = ( -/obj/effect/turf_decal/solarpanel, -/obj/machinery/power/solar, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"fh" = ( +/obj/machinery/power/floodlight{ + anchored = 1 }, -/turf/open/floor/plating, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "0-6" + }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"fk" = ( +/obj/structure/spacevine, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "fn" = ( /obj/structure/spacevine, /obj/structure/spacevine{ @@ -1381,18 +1300,6 @@ }, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab) -"fq" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "fr" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ dir = 1 @@ -1409,16 +1316,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"ft" = ( -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt{ - baseturfs = /turf/open/floor/plating/asteroid - }, -/area/ruin/space/has_grav/singularitylab) "fu" = ( /obj/structure/cable{ icon_state = "5-10" @@ -1440,14 +1337,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"fv" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "fw" = ( /obj/effect/turf_decal/industrial/warning/corner, /obj/effect/turf_decal/siding/thinplating{ @@ -1462,6 +1351,15 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) +"fD" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "fF" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -1495,6 +1393,17 @@ "fK" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/civvie) +"fP" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -14; + pixel_y = 4 + }, +/obj/structure/mirror{ + pixel_x = -29 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/civvie) "fQ" = ( /obj/structure/table/wood, /obj/machinery/light/small/directional/west, @@ -1526,20 +1435,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/singularitylab/lab) -"fT" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"fU" = ( -/obj/structure/table, -/turf/closed/mineral/random, -/area/ruin/space/has_grav) "fW" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 6 @@ -1679,24 +1574,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"gB" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "gC" = ( /obj/effect/turf_decal/industrial/warning, /obj/structure/railing/corner{ @@ -1766,31 +1643,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"gM" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/structure/table, -/obj/item/lighter{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/clothing/mask/cigarette, -/obj/item/clothing/mask/cigarette{ - pixel_x = 3; - pixel_y = 11 - }, -/obj/item/clothing/mask/cigarette{ - pixel_x = 6; - pixel_y = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "gN" = ( /obj/structure/cable{ icon_state = "4-10" @@ -1812,29 +1664,11 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/nanoweave/beige, /area/ruin/space/has_grav/singularitylab/cargo) -"gQ" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"gS" = ( -/obj/structure/cable{ - icon_state = "6-9" - }, +"gR" = ( /obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/spacevine{ + pixel_y = 32 }, -/area/ruin/space/has_grav/singularitylab) -"gU" = ( -/obj/structure/spacevine/dense, /obj/structure/flora/ausbushes/fullgrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; @@ -1842,18 +1676,6 @@ name = "grass" }, /area/ruin/space/has_grav/singularitylab/civvie) -"gZ" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/under/rank/rnd/scientist, -/obj/item/clothing/shoes/sneakers/white, -/obj/effect/gibspawner, -/obj/item/gun/energy/lasercannon/unrestricted{ - desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; - icon_state = "pulse"; - name = "NT-LS-1013" - }, -/turf/open/floor/plating/asteroid, -/area/ruin/space/has_grav/singularitylab) "ha" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -1873,13 +1695,31 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"hh" = ( +"hf" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = -32 +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 8 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"hg" = ( +/obj/item/flamethrower/full, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/cable{ + icon_state = "1-8" }, /obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; @@ -1913,13 +1753,6 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/cargo) -"hn" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlabhanger" - }, -/turf/open/floor/plating/asteroid, -/area/ruin/space/has_grav/singularitylab) "ho" = ( /obj/machinery/door/airlock/highsecurity{ name = "Testing Lab" @@ -1948,53 +1781,37 @@ }, /turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/lab) -"hy" = ( -/obj/structure/cable{ - icon_state = "4-10" - }, -/obj/structure/spacevine, -/turf/open/floor/plating/asteroid/airless, -/area/ruin/space/has_grav/singularitylab/civvie) -"hz" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 +"ht" = ( +/obj/structure/spacevine/dense, +/obj/machinery/power/apc/auto_name/directional/north{ + start_charge = 0 }, -/obj/effect/turf_decal/siding/white{ - dir = 4 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/vault, -/area/ruin/space/has_grav/singularitylab/cargo) -"hB" = ( -/obj/machinery/door/airlock/security{ - name = "Hangar Control" +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/area/ruin/space/has_grav/singularitylab) +"hu" = ( +/obj/effect/turf_decal/solarpanel, +/obj/machinery/power/solar, +/obj/structure/cable/yellow, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) -"hE" = ( +/turf/open/floor/plating, +/area/space/nearstation) +"hv" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/obj/structure/spacevine{ +/obj/structure/spacevine/dense{ pixel_y = 32 }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"hF" = ( -/obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_y = 32 + pixel_x = 32 }, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; @@ -2002,6 +1819,52 @@ name = "grass" }, /area/ruin/space/has_grav/singularitylab/civvie) +"hy" = ( +/obj/structure/cable{ + icon_state = "4-10" + }, +/obj/structure/spacevine, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space/has_grav/singularitylab/civvie) +"hz" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/vault, +/area/ruin/space/has_grav/singularitylab/cargo) +"hA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/table/wood/fancy/green, +/obj/structure/fluff/beach_umbrella{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/structure/spacevine, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) +"hB" = ( +/obj/machinery/door/airlock/security{ + name = "Hangar Control" + }, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "hJ" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/corner/transparent/orange{ @@ -2017,6 +1880,17 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"hN" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ + dir = 8 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "hP" = ( /obj/structure/filingcabinet, /obj/structure/cable{ @@ -2071,18 +1945,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"hX" = ( -/obj/structure/table, -/obj/item/paper{ - default_raw_text = "Whatever happens. Happens." - }, -/obj/item/pen, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = 10; - pixel_y = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "hY" = ( /obj/machinery/door/poddoor{ id = "singlabcargo2" @@ -2114,6 +1976,9 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"id" = ( +/turf/closed/mineral/random, +/area/ruin/space/has_grav) "ie" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2135,6 +2000,11 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"ig" = ( +/obj/machinery/power/emitter/welded, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/space/nearstation) "ih" = ( /obj/structure/table/reinforced, /obj/item/paper{ @@ -2179,38 +2049,36 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"io" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_y = -32 +"ir" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/area/ruin/space/has_grav/singularitylab/civvie) -"ip" = ( -/obj/machinery/power/floodlight{ - anchored = 1 +/turf/open/floor/engine/hull, +/area/space/nearstation) +"iv" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/structure/cable/yellow{ + icon_state = "4-10" }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) +"iw" = ( /obj/structure/cable{ - icon_state = "0-6" + icon_state = "2-5" }, /obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/structure/flora/ausbushes/fullgrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab/civvie) -"iv" = ( -/obj/effect/turf_decal/industrial/warning, -/obj/structure/cable/yellow{ - icon_state = "4-10" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) "iy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, @@ -2244,21 +2112,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"iC" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/mob/living/simple_animal/hostile/venus_human_trap, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "iD" = ( /obj/effect/turf_decal/siding/white, /obj/effect/turf_decal/siding/white{ @@ -2292,31 +2145,24 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"iJ" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "iK" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"iL" = ( -/obj/machinery/door/airlock/external{ - dir = 4; - name = "Engine Access" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/reactor) "iN" = ( /obj/effect/turf_decal/industrial/warning{ dir = 8 @@ -2337,13 +2183,29 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"iX" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" +"iV" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/plating, -/area/space/nearstation) +/area/ruin/space/has_grav/singularitylab) +"iW" = ( +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/spacevine, +/obj/machinery/light/directional/north, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "iZ" = ( /obj/structure/cable, /obj/structure/poddoor_assembly, @@ -2365,32 +2227,20 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"jd" = ( -/obj/effect/turf_decal/siding/yellow, -/obj/machinery/button/door{ - dir = 8; - id = "singlabcargo2"; - name = "Blast Door Control"; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/cargo) -"jg" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "jj" = ( /obj/structure/spacevine, /obj/machinery/air_sensor/atmos/nitrogen_tank, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) +"jk" = ( +/obj/machinery/turretid, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = -14 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ruin/space/has_grav/singularitylab/cargo) "jl" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -2428,15 +2278,6 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"jr" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "jt" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -2469,6 +2310,19 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"jx" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/chair/stool/bar{ + dir = 8; + name = "picnic stool"; + pixel_x = -10; + pixel_y = 4 + }, +/obj/structure/spacevine, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "jy" = ( /obj/structure/cable{ icon_state = "5-9" @@ -2495,42 +2349,15 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"jB" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_y = 32 +"jE" = ( +/obj/structure/cable/yellow{ + icon_state = "2-9" }, -/obj/structure/spacevine{ - pixel_x = -32 +/obj/effect/turf_decal/techfloor{ + dir = 4 }, -/obj/structure/spacevine/dense{ - pixel_x = -31; - pixel_y = 32 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) -"jC" = ( -/obj/structure/flippedtable{ - dir = 4; - icon_state = "" - }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"jE" = ( -/obj/structure/cable/yellow{ - icon_state = "2-9" - }, -/obj/effect/turf_decal/techfloor{ - dir = 4 - }, -/obj/effect/turf_decal/techfloor{ - dir = 8 +/obj/effect/turf_decal/techfloor{ + dir = 8 }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) @@ -2551,41 +2378,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"jI" = ( -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/structure/transit_tube/station/dispenser/flipped{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab/cargo) "jK" = ( /obj/structure/spacevine{ pixel_y = 32 @@ -2636,28 +2428,13 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"jR" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"jT" = ( -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"jS" = ( +/obj/machinery/door/airlock{ + dir = 4; + name = "Bathroom" }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "jV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -2670,29 +2447,47 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"kb" = ( -/obj/effect/turf_decal/atmos/carbon_dioxide, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) -"ke" = ( -/obj/machinery/door/airlock/freezer{ +"jY" = ( +/obj/machinery/door/airlock{ dir = 4; - name = "Freezer" + name = "Private Quarters" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, /turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/civvie) -"ki" = ( -/obj/machinery/power/shieldwallgen/atmos/strong/roundstart{ - id = "singlabhang" +"kb" = ( +/obj/effect/turf_decal/atmos/carbon_dioxide, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) +"kd" = ( +/obj/item/clothing/suit/space/hardsuit/engine, +/obj/item/tank/internals/oxygen, +/obj/effect/decal/remains/human, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/cable/yellow{ - icon_state = "0-8" +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = -32 }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlabhanger" +/obj/effect/decal/cleanable/blood/old, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) "kk" = ( /obj/effect/turf_decal/industrial/warning{ @@ -2708,22 +2503,6 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"km" = ( -/obj/machinery/door/airlock/hatch{ - dir = 4; - name = "Server Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/singularitylab/lab) "kn" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2734,16 +2513,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"ko" = ( -/obj/structure/flippedtable{ - dir = 1; - icon_state = "" - }, -/obj/structure/spacevine, -/turf/open/floor/plating/dirt{ - baseturfs = /turf/open/floor/plating/asteroid - }, -/area/ruin/space/has_grav/singularitylab) "kp" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/red{ @@ -2755,35 +2524,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"kq" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) -"kr" = ( -/obj/structure/cable{ - icon_state = "5-8" - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "kt" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -2794,17 +2534,47 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"kx" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "singlabfurn" +"ku" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = 32 }, -/obj/structure/railing, -/obj/structure/railing{ +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/spacevine/dense{ pixel_y = 32 }, -/turf/open/floor/plating, +/obj/machinery/portable_atmospherics/scrubber/huge, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"kv" = ( +/obj/structure/railing, +/obj/machinery/conveyor_switch{ + id = "singlabfurn"; + pixel_x = -11; + pixel_y = 13 + }, +/obj/machinery/mineral/processing_unit_console{ + machinedir = 9; + pixel_x = -32; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) +"kw" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/space/nearstation) "ky" = ( /obj/machinery/shower{ dir = 8 @@ -2850,19 +2620,6 @@ /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"kI" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/techfloor/corner, -/obj/machinery/button/door{ - dir = 1; - id = "singlabcargo1"; - name = "Blast Door Control"; - pixel_y = -25 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "kK" = ( /obj/structure/cable{ icon_state = "4-10" @@ -2880,6 +2637,12 @@ /obj/structure/closet/crate/freezer, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) +"kM" = ( +/turf/closed/wall{ + desc = "A huge chunk of metal holding the roof of the asteroid at bay"; + name = "structural support" + }, +/area/ruin/space/has_grav/singularitylab/cargo) "kP" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav) @@ -2951,25 +2714,6 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"lb" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "lc" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -3015,14 +2759,6 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) -"lj" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "singlabfurn" - }, -/obj/structure/railing, -/turf/open/floor/plating, -/area/ruin/space/has_grav/singularitylab/cargo) "lk" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -3075,35 +2811,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"lu" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/space/has_grav/singularitylab/civvie) -"lv" = ( -/obj/structure/cable{ - icon_state = "6-10" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/door/airlock/science{ - dir = 4; - name = "High Energy Applications Research Facility" +"lt" = ( +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" }, +/obj/structure/spacevine, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/lab) +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) +"lu" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab/civvie) "lw" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ @@ -3121,6 +2846,15 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"lx" = ( +/obj/structure/spacevine, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "ly" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable{ @@ -3153,6 +2887,43 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) +"lF" = ( +/obj/structure/cable{ + icon_state = "5-9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/science{ + dir = 4; + name = "High Energy Applications Research Facility" + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/lab) +"lH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/table/wood/fancy/purple, +/obj/structure/fluff/beach_umbrella{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/machinery/jukebox/boombox, +/obj/structure/spacevine, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "lJ" = ( /obj/structure/transit_tube/crossing/horizontal, /obj/structure/cable{ @@ -3174,6 +2945,18 @@ "lK" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/singularitylab/lab) +"lL" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "lM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3204,18 +2987,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) -"lQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/table, -/obj/item/paper, -/obj/item/pen{ - pixel_x = 2; - pixel_y = -3 - }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ruin/space/has_grav/singularitylab/cargo) "lS" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -3226,6 +2997,25 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"lU" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 5 + }, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry{ + pixel_x = -6; + pixel_y = -3 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/sodawater{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "lV" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 10 @@ -3236,18 +3026,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/ruin/space/has_grav/singularitylab/civvie) -"lZ" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "mc" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -3274,6 +3052,18 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"mj" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "mk" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 @@ -3330,6 +3120,22 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) +"mu" = ( +/obj/machinery/door/airlock/engineering{ + dir = 8; + name = "Power Control" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/engineering) "mv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3401,6 +3207,23 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"mD" = ( +/obj/structure/table, +/obj/machinery/button/shieldwallgen{ + dir = 8; + id = "singlabhang"; + pixel_x = -5 + }, +/obj/machinery/button/door{ + dir = 8; + id = "singlabhangar"; + pixel_x = 8 + }, +/obj/structure/sign/warning/incident{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "mE" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/white/full, @@ -3423,36 +3246,16 @@ /obj/machinery/vending/tool, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) -"mJ" = ( -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/structure/flippedtable, -/obj/effect/turf_decal/siding/thinplating{ - dir = 6 - }, -/obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 +"mL" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"mK" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) "mP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3473,26 +3276,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"mU" = ( -/obj/structure/table, -/obj/machinery/button/door{ - dir = 8; - id = "singlablast2"; - name = "Testing Chamber Control"; - pixel_x = -4; - pixel_y = 7 - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"mW" = ( -/obj/machinery/conveyor_switch{ - id = "singlabcarg"; - pixel_x = 9; - pixel_y = -5 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/singularitylab) "mY" = ( /obj/structure/railing{ dir = 4; @@ -3504,19 +3287,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"na" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -14; - pixel_y = 4 - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Scientist" - }, -/obj/effect/turf_decal/siding/thinplating/light/corner, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "nc" = ( /obj/structure/particle_accelerator/particle_emitter/left{ dir = 4 @@ -3612,40 +3382,28 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"no" = ( -/obj/structure/railing, -/obj/machinery/conveyor_switch{ - id = "singlabfurn"; - pixel_x = -11; - pixel_y = 13 - }, -/obj/machinery/mineral/processing_unit_console{ - machinedir = 9; - pixel_x = -32; - pixel_y = -4 +"nn" = ( +/obj/machinery/conveyor{ + id = "singlabcarg" }, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/cargo) -"np" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_x = 32 +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/plating/asteroid, -/area/ruin/space/has_grav/singularitylab) -"nq" = ( -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/flamethrower/full, -/obj/effect/decal/remains/human, -/obj/structure/spacevine/dense, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/structure/spacevine/dense, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/engineering) +/area/ruin/space/has_grav/singularitylab) +"np" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) "nr" = ( /obj/structure/spacevine, /turf/open/floor/plating/asteroid, @@ -3673,25 +3431,6 @@ /obj/structure/closet/crate/bin, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"nw" = ( -/obj/machinery/door/airlock{ - dir = 4; - name = "Private Quarters" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/civvie) "nx" = ( /obj/effect/turf_decal/corner/opaque/beige{ dir = 4 @@ -3699,25 +3438,9 @@ /obj/machinery/light/directional/east, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"nA" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"nB" = ( +"nz" = ( /obj/structure/cable{ - icon_state = "6-9" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" + icon_state = "4-9" }, /obj/structure/spacevine/dense, /obj/structure/flora/ausbushes/fullgrass, @@ -3749,90 +3472,25 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab) -"nJ" = ( -/obj/machinery/rnd/server, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/industrial/outline/yellow, -/turf/open/floor/plasteel/tech/grid, -/area/ruin/space/has_grav/singularitylab/lab) -"nK" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/space/nearstation) -"nM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/mining{ - dir = 4; - name = "Cargo Bay" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/cargo) -"nN" = ( +"nG" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, +/obj/effect/decal/cleanable/blood/old, /obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"nO" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = 32; - pixel_y = 5 - }, -/obj/effect/turf_decal/industrial/warning{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/machinery/power/shieldwallgen/anchored{ - req_access = null - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "0-10" - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"nR" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab/civvie) +"nI" = ( +/turf/open/space/basic, +/area/space/nearstation) +"nJ" = ( +/obj/machinery/rnd/server, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/industrial/outline/yellow, +/turf/open/floor/plasteel/tech/grid, +/area/ruin/space/has_grav/singularitylab/lab) "nS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 9 @@ -3840,19 +3498,17 @@ /obj/machinery/computer/cargo/express, /turf/open/floor/carpet/nanoweave/beige, /area/ruin/space/has_grav/singularitylab/cargo) -"nV" = ( +"nT" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/machinery/atmospherics/components/unary/outlet_injector/on, /obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/area/ruin/space/has_grav/singularitylab) "nW" = ( /obj/structure/spacevine, /obj/structure/closet/crate/bin, @@ -3883,6 +3539,31 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"ob" = ( +/obj/machinery/door/airlock/engineering{ + dir = 8; + name = "Engine Control" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/engineering) "oc" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 5 @@ -3954,13 +3635,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"op" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) "oq" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -3983,21 +3657,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"ou" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/shoes/sneakers/white, -/obj/item/clothing/under/rank/rnd/scientist, -/obj/item/gun/energy/e_gun/iot, -/obj/item/flashlight/seclite, -/obj/effect/gibspawner, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "ov" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -4033,6 +3692,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/lab) +"oz" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ruin/space/has_grav/singularitylab/cargo) "oA" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/industrial/warning{ @@ -4051,6 +3724,42 @@ /obj/machinery/ore_silo, /turf/open/floor/pod, /area/ruin/space/has_grav/singularitylab/cargo) +"oF" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"oG" = ( +/obj/structure/flippedtable, +/obj/structure/spacevine/dense{ + pixel_x = -31; + pixel_y = 32 + }, +/obj/structure/spacevine, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/space/has_grav/singularitylab) +"oH" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_x = -32 + }, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "oJ" = ( /obj/structure/bed, /obj/item/bedsheet/cosmos, @@ -4074,31 +3783,13 @@ }, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab/civvie) -"oN" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/closet/emcloset, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"oP" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"oR" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-9" }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/floor/plating, +/area/space/nearstation) "oS" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/industrial/warning/corner{ @@ -4121,23 +3812,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"oV" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/table/wood/fancy/blue, -/obj/structure/fluff/beach_umbrella{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/structure/spacevine, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) "oW" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable{ @@ -4145,20 +3819,40 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"oY" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/machinery/recharger{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "oZ" = ( /obj/machinery/camera/xray{ network = list("sl12") }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"pc" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-2" +"pd" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 }, -/obj/item/book/manual/wiki/engineering_singulo_tesla, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "pe" = ( /obj/machinery/light/directional/north, /turf/open/floor/engine, @@ -4225,41 +3919,11 @@ /obj/item/pen, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) -"pv" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"pw" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) "px" = ( /obj/item/tank/internals/oxygen, /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"pB" = ( -/obj/effect/turf_decal/solarpanel, -/obj/machinery/power/tracker, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/space/nearstation) "pC" = ( /obj/structure/rack, /obj/effect/turf_decal/box, @@ -4269,6 +3933,25 @@ "pE" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/singularitylab/reactor) +"pF" = ( +/obj/machinery/door/airlock/external{ + dir = 4; + name = "Engine Access" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/reactor) "pG" = ( /obj/structure/cable{ icon_state = "5-10" @@ -4299,12 +3982,38 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"pK" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/effect/turf_decal/atmos/oxygen, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "pL" = ( /obj/machinery/computer/rdconsole/experiment{ dir = 8 }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) +"pM" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) "pN" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/spacevine, @@ -4340,6 +4049,23 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"pT" = ( +/obj/item/banner/engineering{ + anchored = 1 + }, +/turf/open/floor/engine/hull, +/area/space/nearstation) +"pU" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "singlabfurn" + }, +/obj/structure/railing, +/obj/structure/railing{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab/cargo) "pY" = ( /obj/structure/cable{ icon_state = "5-10" @@ -4402,33 +4128,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/lab) -"qg" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/table/wood/fancy/cyan, -/obj/structure/fluff/beach_umbrella{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/structure/spacevine, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) -"qj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/space/nearstation) "qk" = ( /obj/effect/turf_decal/industrial/warning, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -4446,18 +4145,18 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"qm" = ( +"qn" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_x = -32 + pixel_y = 32 }, -/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/area/ruin/space/has_grav/singularitylab) "qo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 @@ -4495,6 +4194,18 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/engineering) +"qu" = ( +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/spacevine, +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "qy" = ( /obj/structure/cable{ icon_state = "5-9" @@ -4517,6 +4228,18 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"qC" = ( +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/spacevine, +/obj/machinery/vending/dinnerware, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "qF" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -4524,6 +4247,27 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"qG" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "qK" = ( /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) @@ -4539,18 +4283,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"qN" = ( -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "qQ" = ( /obj/structure/transit_tube/curved/flipped, /obj/structure/cable{ @@ -4586,13 +4318,26 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"qU" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +"qV" = ( +/obj/structure/table, +/obj/structure/sign/poster/official/moth/hardhats{ + pixel_x = -32 }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/spacevine, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = -6 + }, +/obj/item/assembly/igniter{ + pixel_x = -7; + pixel_y = 3 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/engineering) "qZ" = ( /obj/effect/turf_decal/techfloor, /obj/effect/turf_decal/techfloor{ @@ -4605,83 +4350,35 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab) -"ra" = ( -/obj/structure/transit_tube/station/dispenser{ - dir = 4 - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 23 - }, +"rc" = ( +/obj/effect/turf_decal/corner/opaque/white/full, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) -"rc" = ( -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 9 +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 9 }, /obj/effect/turf_decal/industrial/warning/corner{ dir = 1 }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"rf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "rg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab) -"rh" = ( -/obj/item/seeds/kudzu, -/obj/structure/sign/poster/contraband/kudzu{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense, -/obj/structure/closet/firecloset{ - anchored = 1 +"ri" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/cable/yellow{ + icon_state = "1-8" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/space/basic, +/area/space/nearstation) "rj" = ( /obj/structure/chair, /turf/open/floor/plasteel, @@ -4693,6 +4390,15 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"rn" = ( +/obj/machinery/mineral/processing_unit_console{ + machinedir = 9; + pixel_x = -32; + pixel_y = -4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/cargo) "rp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -4707,13 +4413,13 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"rs" = ( -/obj/effect/decal/cleanable/blood/drip{ - pixel_x = 2; - pixel_y = 2 +"rt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "ru" = ( /obj/effect/turf_decal/box, /obj/item/clothing/shoes/magboots, @@ -4730,17 +4436,41 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"rA" = ( +"rw" = ( /obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1; + piping_layer = 4 + }, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab) +"ry" = ( +/obj/structure/sign/warning/biohazard{ + pixel_x = 32; + pixel_y = 5 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/machinery/power/shieldwallgen/anchored{ + req_access = null + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-10" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "rB" = ( /obj/structure/window/reinforced/fulltile, /obj/structure/grille, @@ -4751,15 +4481,6 @@ /obj/effect/turf_decal/corner/opaque/green/border, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"rE" = ( -/obj/machinery/power/emitter/welded{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/space/nearstation) "rG" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/vending/cola/pwr_game, @@ -4831,25 +4552,6 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"sa" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "sc" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/industrial/warning, @@ -4858,38 +4560,9 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"sd" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "se" = ( /turf/open/space/basic, /area/ruin/space/has_grav) -"sf" = ( -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine, -/obj/machinery/vending/wardrobe/chef_wardrobe, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "sh" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/item/weldingtool/empty, @@ -4897,16 +4570,22 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"sk" = ( -/obj/structure/cable{ - icon_state = "6-10" +"si" = ( +/obj/machinery/door/airlock/engineering{ + dir = 4; + name = "Engine Control" }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -4914,7 +4593,31 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/engineering) +"sl" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/engine/hull, +/area/space/nearstation) +"sp" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, /area/ruin/space/has_grav/singularitylab) "sr" = ( /obj/structure/closet/wall{ @@ -4934,26 +4637,25 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/civvie) -"sv" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/carpet/nanoweave/purple, -/area/ruin/space/has_grav/singularitylab/lab) -"sw" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 +"st" = ( +/obj/structure/cable{ + icon_state = "1-6" }, +/obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = 32 + pixel_x = -32 }, -/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/fullgrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab) +"sv" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/carpet/nanoweave/purple, +/area/ruin/space/has_grav/singularitylab/lab) "sA" = ( /obj/machinery/conveyor{ id = "singlabfurn" @@ -4970,15 +4672,6 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab/engineering) -"sF" = ( -/obj/structure/spacevine, -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "sG" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -4994,20 +4687,6 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"sI" = ( -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_x = -32 - }, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "sJ" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/purple{ @@ -5037,18 +4716,6 @@ /obj/effect/turf_decal/techfloor, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"sU" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "sV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -5061,6 +4728,15 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) +"sW" = ( +/obj/structure/spacevine/dense, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "sX" = ( /obj/machinery/door/poddoor{ id = "singlabcargo1" @@ -5068,9 +4744,31 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab) +"sZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/mining{ + dir = 4; + name = "Cargo Bay" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, /turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab) +/area/ruin/space/has_grav/singularitylab/cargo) "tb" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -5093,6 +4791,27 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"tk" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"tl" = ( +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) "tq" = ( /turf/template_noop, /area/template_noop) @@ -5103,6 +4822,19 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) +"ts" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "tv" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine{ @@ -5121,17 +4853,6 @@ "ty" = ( /turf/closed/wall, /area/ruin/space/has_grav/singularitylab/civvie) -"tz" = ( -/obj/structure/cable{ - icon_state = "5-9" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "tA" = ( /obj/structure/cable{ icon_state = "6-8" @@ -5142,21 +4863,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"tB" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "tE" = ( /obj/structure/spacevine, /obj/structure/spacevine{ @@ -5173,13 +4879,20 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"tF" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-9" +"tI" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 }, -/turf/open/floor/plating, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "tL" = ( /obj/structure/cable{ icon_state = "5-9" @@ -5203,15 +4916,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"tQ" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 2 - }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ruin/space/has_grav/singularitylab/cargo) "tR" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable{ @@ -5219,6 +4923,14 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"tV" = ( +/obj/structure/table, +/obj/item/clipboard{ + pixel_x = 9; + pixel_y = 7 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/engineering) "ua" = ( /obj/structure/spacevine, /turf/open/floor/plating/dirt{ @@ -5229,13 +4941,6 @@ /obj/machinery/rnd/experimentor, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) -"uk" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlabhanger" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) "ul" = ( /obj/structure/sign/warning/testchamber{ pixel_y = 32 @@ -5275,19 +4980,24 @@ "un" = ( /turf/open/floor/plasteel/freezer, /area/ruin/space/has_grav/singularitylab/civvie) -"ur" = ( +"up" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = 32 +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = -32 }, -/mob/living/simple_animal/hostile/venus_human_trap, /obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/area/ruin/space/has_grav/singularitylab) "us" = ( /obj/structure/transit_tube, /obj/structure/cable{ @@ -5375,6 +5085,24 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"uI" = ( +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/structure/flippedtable, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/obj/structure/spacevine, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "uJ" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/red{ @@ -5416,21 +5144,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"uQ" = ( -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) "uS" = ( /obj/effect/turf_decal/corner/transparent/orange{ dir = 1 @@ -5438,6 +5151,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) +"uU" = ( +/turf/open/floor/engine/hull, +/area/space/nearstation) "uV" = ( /obj/structure/tank_dispenser/plasma, /turf/open/floor/plasteel, @@ -5449,44 +5165,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"uX" = ( -/obj/effect/turf_decal/box, -/obj/machinery/light/directional/north, -/obj/item/gun/energy/lasercannon/unrestricted{ - desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; - icon_state = "pulse"; - name = "NT-LS-1013" - }, -/obj/item/gun/energy/laser/iot, -/obj/item/gun/energy/laser/iot{ - dry_fire_sound = 'sound/items/ding.ogg'; - dry_fire_text = "ding" - }, -/obj/structure/safe{ - name = "Prototype Storage" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab/lab) -"uY" = ( -/obj/item/flamethrower/full, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "uZ" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -5519,17 +5197,16 @@ /obj/structure/cable, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab/engineering) -"ve" = ( -/obj/structure/cable{ - icon_state = "6-9" +"vd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-8" }, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/space/basic, +/area/space/nearstation) "vg" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -5541,6 +5218,32 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"vh" = ( +/obj/machinery/door/airlock/freezer{ + dir = 4; + name = "Freezer" + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) +"vi" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "vk" = ( /obj/effect/turf_decal/techfloor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -5564,6 +5267,25 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/cargo) +"vr" = ( +/obj/machinery/door/airlock/security{ + dir = 8; + name = "Front Office" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/lab) "vu" = ( /obj/structure/cable{ icon_state = "1-10" @@ -5593,25 +5315,31 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"vy" = ( -/obj/machinery/door/airlock/security{ - dir = 8; - name = "Front Office" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 +"vz" = ( +/obj/structure/spacevine, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 +/area/ruin/space/has_grav/singularitylab/civvie) +"vD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/door/firedoor/border_only{ +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/lab) +/obj/structure/table/wood/fancy/cyan, +/obj/structure/fluff/beach_umbrella{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/structure/spacevine, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "vE" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -5632,6 +5360,18 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"vL" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "vO" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 1 @@ -5639,18 +5379,6 @@ /obj/effect/turf_decal/corner/transparent/orange/three_quarters, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"vT" = ( -/obj/structure/flippedtable{ - dir = 4; - icon_state = "" - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/spacevine, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "vU" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 4 @@ -5660,22 +5388,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"vV" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "vW" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -5686,16 +5398,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/vault, /area/ruin/space/has_grav/singularitylab/cargo) -"vX" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/flippedtable{ - dir = 2; - icon_state = "" - }, -/turf/open/floor/carpet/nanoweave/purple, -/area/ruin/space/has_grav/singularitylab/lab) "vY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 5 @@ -5703,18 +5405,6 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"vZ" = ( -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine, -/obj/machinery/vending/dinnerware, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "wa" = ( /obj/structure/spacevine, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -5804,43 +5494,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"wu" = ( -/obj/machinery/door/airlock/external{ - dir = 4; - name = "Engine Access" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/reactor) -"wv" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"ww" = ( -/obj/machinery/field/generator/anchored, -/turf/open/floor/plating, -/area/space/nearstation) "wx" = ( /obj/structure/transit_tube/curved{ dir = 1 @@ -5883,22 +5536,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"wH" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "wM" = ( /obj/structure/spacevine, /mob/living/simple_animal/hostile/venus_human_trap, @@ -5916,20 +5553,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"wP" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "wR" = ( /obj/structure/cable{ icon_state = "0-4" @@ -5940,16 +5563,17 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"wU" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "4-8" +"wV" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" }, -/obj/structure/cable/yellow{ - icon_state = "1-8" +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/space/basic, -/area/space/nearstation) +/area/ruin/space/has_grav/singularitylab/civvie) "wW" = ( /obj/structure/railing{ dir = 4; @@ -5982,19 +5606,6 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"xa" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/obj/structure/chair/stool/bar{ - dir = 8; - name = "picnic stool"; - pixel_x = -10; - pixel_y = 4 - }, -/obj/structure/spacevine, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) "xe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -6038,45 +5649,39 @@ /obj/item/paper_bin, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"xm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"xn" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"xo" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"xr" = ( -/obj/machinery/door/airlock{ - dir = 4; - name = "Bathroom" - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "xu" = ( /obj/effect/turf_decal/corner/transparent/orange{ dir = 5 }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) +"xv" = ( +/obj/structure/transit_tube/station/dispenser{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 23 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/spacevine, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "xw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -6161,20 +5766,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"xF" = ( -/obj/machinery/power/shieldwallgen/atmos/strong/roundstart{ - dir = 1; - id = "singlabhang" - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlabhanger" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab) "xG" = ( /obj/effect/turf_decal/siding/thinplating/end, /turf/open/floor/plasteel, @@ -6216,16 +5807,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"xM" = ( -/obj/structure/spacevine/dense, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "xO" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -6234,27 +5815,8 @@ /obj/structure/cable{ icon_state = "1-10" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"xR" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "xS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -6304,6 +5866,26 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) +"ya" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 9 + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "yc" = ( /obj/structure/chair{ dir = 4 @@ -6353,27 +5935,6 @@ "yi" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/singularitylab/engineering) -"yk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) -"ym" = ( -/obj/machinery/turretid, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = -14 - }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ruin/space/has_grav/singularitylab/cargo) "yn" = ( /obj/machinery/light/directional/south, /turf/open/floor/engine/hull/reinforced, @@ -6388,20 +5949,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"yp" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "yr" = ( /obj/structure/railing{ dir = 4; @@ -6441,6 +5988,25 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"yw" = ( +/obj/machinery/door/airlock{ + dir = 8; + name = "Private Quarters" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) "yy" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/plasteel, @@ -6494,6 +6060,24 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"yI" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "To Environment" + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "yL" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable{ @@ -6538,16 +6122,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"yW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/space/basic, -/area/space/nearstation) "yZ" = ( /obj/structure/cable{ icon_state = "6-9" @@ -6563,22 +6137,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"za" = ( -/obj/item/pickaxe/rusted, -/obj/structure/spacevine, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "zb" = ( /obj/structure/sign/poster/retro/science{ pixel_y = -32 @@ -6612,6 +6170,10 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/lab) +"zf" = ( +/obj/item/stack/cable_coil/cut/yellow, +/turf/open/space/basic, +/area/space/nearstation) "zg" = ( /obj/structure/transit_tube/curved{ dir = 4 @@ -6654,18 +6216,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/carpet/nanoweave/purple, /area/ruin/space/has_grav/singularitylab/lab) -"zl" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "zm" = ( /obj/structure/sign/poster/official/high_class_martini{ pixel_x = -32 @@ -6692,6 +6242,17 @@ /obj/machinery/vending/cigarette, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) +"zs" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/button/door{ + dir = 8; + id = "singlabcargo2"; + name = "Blast Door Control"; + pixel_x = 24 + }, +/obj/structure/spacevine, +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab) "zt" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -6717,6 +6278,13 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) +"zv" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-10" + }, +/turf/open/floor/plating, +/area/space/nearstation) "zw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, @@ -6745,38 +6313,15 @@ /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"zz" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"zB" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/lavendergrass, +"zA" = ( +/obj/machinery/hydroponics/constructable, +/obj/structure/spacevine, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab) +/area/ruin/space/has_grav/singularitylab/civvie) "zC" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/white/full, @@ -6843,6 +6388,21 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"zK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"zL" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "zM" = ( /obj/structure/cable{ icon_state = "6-10" @@ -6863,9 +6423,6 @@ /obj/effect/turf_decal/corner/transparent/orange/border, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"zP" = ( -/turf/open/floor/engine/hull, -/area/space/nearstation) "zR" = ( /obj/structure/spacevine/dense, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -6912,20 +6469,6 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav) -"Ae" = ( -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 1 - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "Ah" = ( /obj/structure/table, /obj/structure/sign/poster/contraband/power{ @@ -6980,6 +6523,26 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"Ar" = ( +/obj/effect/turf_decal/solarpanel, +/obj/machinery/power/solar, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/space/nearstation) +"As" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "At" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7015,13 +6578,6 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) -"Ay" = ( -/obj/effect/decal/cleanable/blood/drip{ - pixel_x = 5; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "AA" = ( /obj/structure/cable{ icon_state = "0-8" @@ -7035,6 +6591,22 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"AB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "AC" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -7046,13 +6618,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"AD" = ( -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "AE" = ( /obj/structure/chair{ dir = 1 @@ -7087,20 +6652,11 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"AL" = ( -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/industrial/warning, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"AM" = ( -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) +"AL" = ( +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "AN" = ( /obj/structure/closet/emcloset{ anchored = 1 @@ -7134,12 +6690,36 @@ }, /turf/closed/wall, /area/ruin/space/has_grav/singularitylab) +"AS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "AT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 }, /turf/closed/wall, /area/ruin/space/has_grav/singularitylab) +"AV" = ( +/obj/structure/table, +/obj/machinery/button/door{ + dir = 8; + id = "singlablast2"; + name = "Testing Chamber Control"; + pixel_x = -4; + pixel_y = 7 + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "AW" = ( /obj/structure/cable{ icon_state = "0-2" @@ -7162,6 +6742,22 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"Ba" = ( +/obj/item/pickaxe/rusted, +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "Bb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 5 @@ -7174,16 +6770,6 @@ "Bc" = ( /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab/civvie) -"Be" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "Bf" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -7213,6 +6799,18 @@ /obj/structure/spacevine, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) +"Bi" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "Bk" = ( /obj/machinery/door/airlock/highsecurity{ name = "Secure Weapon Storage" @@ -7241,56 +6839,46 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"Bp" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 +"Bq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/visible/layer4{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "To Environment" +/obj/structure/cable/yellow{ + icon_state = "2-5" }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/cable/yellow{ + icon_state = "1-6" }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/space/basic, +/area/space/nearstation) "Bw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"Bz" = ( -/obj/structure/spacevine/dense, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) +"Bx" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow, +/turf/open/floor/plating, +/area/space/nearstation) "BB" = ( /obj/effect/turf_decal/industrial/warning, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"BH" = ( -/obj/structure/chair/office{ - dir = 8; - name = "tinkering chair" +"BE" = ( +/obj/structure/cable{ + icon_state = "6-10" }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) -"BI" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -7298,13 +6886,23 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, -/obj/effect/turf_decal/siding/thinplating, -/obj/effect/decal/cleanable/blood{ - dir = 4; - icon_state = "gib3" +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) +"BG" = ( +/obj/machinery/field/generator/anchored, +/turf/open/floor/plating, +/area/space/nearstation) +"BH" = ( +/obj/structure/chair/office{ + dir = 8; + name = "tinkering chair" + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 5 }, /turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/cargo) +/area/ruin/space/has_grav/singularitylab/lab) "BK" = ( /obj/structure/window/reinforced{ dir = 1 @@ -7322,13 +6920,6 @@ /obj/item/pickaxe/rusted, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab/civvie) -"BP" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlablas1" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab/lab) "BR" = ( /obj/structure/cable{ icon_state = "1-2" @@ -7538,23 +7129,6 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"Cu" = ( -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"CB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/space/nearstation) "CC" = ( /obj/structure/transit_tube/curved/flipped, /obj/structure/cable{ @@ -7572,15 +7146,6 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"CE" = ( -/obj/structure/flippedtable, -/obj/structure/spacevine/dense{ - pixel_x = -31; - pixel_y = 32 - }, -/obj/structure/spacevine, -/turf/open/floor/plasteel/tech/techmaint, -/area/ruin/space/has_grav/singularitylab) "CF" = ( /obj/structure/lattice/catwalk, /obj/machinery/airalarm/directional/east, @@ -7599,48 +7164,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"CK" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "2-5" - }, -/obj/structure/cable/yellow{ - icon_state = "1-6" - }, -/turf/open/space/basic, -/area/space/nearstation) -"CL" = ( -/obj/structure/transit_tube/station/dispenser{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 23 - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 +"CJ" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 8 +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) "CN" = ( /obj/effect/turf_decal/siding/yellow{ @@ -7655,23 +7189,31 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"CR" = ( -/obj/structure/cable{ - icon_state = "1-10" - }, -/obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, +"CP" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/shoes/sneakers/white, +/obj/item/clothing/under/rank/rnd/scientist, +/obj/item/gun/energy/e_gun/iot, +/obj/item/flashlight/seclite, +/obj/effect/gibspawner, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/area/ruin/space/has_grav/singularitylab) +"CT" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/button/door{ + dir = 8; + id = "singlabcargo2"; + name = "Blast Door Control"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/cargo) "CU" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine{ @@ -7755,42 +7297,32 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) -"Dh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) -"Di" = ( -/obj/structure/spacevine, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/engineering) -"Dl" = ( -/obj/structure/cable{ - icon_state = "4-9" - }, +/area/ruin/space/has_grav/singularitylab) +"Dg" = ( /obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -31; + pixel_y = 32 + }, /obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab) -"Dn" = ( -/obj/structure/flippedtable{ - dir = 1; - icon_state = "" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, +"Di" = ( +/obj/structure/spacevine, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/engineering) +"Dj" = ( /obj/structure/spacevine/dense, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; @@ -7837,6 +7369,14 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"Du" = ( +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/engineering) "Dw" = ( /obj/structure/particle_accelerator/particle_emitter/center{ dir = 4 @@ -7856,25 +7396,18 @@ /obj/effect/turf_decal/box, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) +"Dy" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlablas2" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab/lab) "Dz" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/effect/turf_decal/box, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) -"DB" = ( -/obj/structure/cable{ - icon_state = "2-5" - }, -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "DC" = ( /obj/structure/transit_tube, /obj/structure/plasticflaps/opaque{ @@ -7954,25 +7487,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"DL" = ( -/obj/structure/cable{ - icon_state = "5-9" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/airlock/science{ - dir = 4; - name = "High Energy Applications Research Facility" - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/lab) "DM" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -8016,6 +7530,31 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"DZ" = ( +/obj/structure/cable{ + icon_state = "6-10" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/door/airlock/science{ + dir = 4; + name = "High Energy Applications Research Facility" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/lab) "Ed" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -8036,6 +7575,14 @@ /obj/structure/spacevine, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/civvie) +"Eh" = ( +/obj/effect/turf_decal/solarpanel, +/obj/machinery/power/tracker, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/space/nearstation) "Ei" = ( /obj/structure/cable{ icon_state = "4-8" @@ -8107,9 +7654,11 @@ /obj/machinery/air_sensor/atmos/oxygen_tank, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"Ew" = ( +"Eu" = ( /obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; @@ -8163,18 +7712,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"EF" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "EG" = ( /obj/structure/transit_tube, /obj/structure/cable{ @@ -8232,18 +7769,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"EO" = ( -/obj/structure/table, -/obj/machinery/button/door{ - dir = 8; - id = "singlablast1"; - name = "Testing Chamber Control"; - pixel_x = -4; - pixel_y = 7 - }, -/obj/effect/turf_decal/corner/opaque/white/full, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "EP" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -8301,22 +7826,6 @@ /obj/effect/turf_decal/corner/transparent/orange, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"EY" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "EZ" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/white/full, @@ -8474,10 +7983,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"FA" = ( -/obj/item/wrench, -/turf/open/space/basic, -/area/space/nearstation) "FB" = ( /obj/machinery/door/airlock/highsecurity{ name = "Testing Lab" @@ -8503,6 +8008,13 @@ }, /turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/lab) +"FD" = ( +/obj/structure/sign/poster/official/moth/boh{ + pixel_x = -32 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "FE" = ( /obj/structure/window/plasma/reinforced{ dir = 1 @@ -8513,17 +8025,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"FF" = ( -/obj/structure/cable{ - icon_state = "4-9" - }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/structure/spacevine, -/turf/open/floor/plasteel/tech/techmaint, -/area/ruin/space/has_grav/singularitylab) "FH" = ( /obj/effect/turf_decal/box, /obj/item/clothing/shoes/magboots, @@ -8531,12 +8032,13 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab/engineering) -"FI" = ( -/turf/closed/wall{ - desc = "A huge chunk of metal holding the roof of the asteroid at bay"; - name = "structural support" +"FJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/area/ruin/space/has_grav/singularitylab) +/turf/open/space/basic, +/area/space/nearstation) "FL" = ( /obj/effect/turf_decal/techfloor{ dir = 1 @@ -8598,6 +8100,18 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/singularitylab/civvie) +"FV" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "FW" = ( /obj/structure/cable/yellow{ icon_state = "4-9" @@ -8618,20 +8132,6 @@ /obj/structure/railing, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/cargo) -"Ge" = ( -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/obj/structure/spacevine, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "Gf" = ( /obj/structure/table, /turf/open/floor/wood, @@ -8646,79 +8146,69 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab) -"Gm" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 5 - }, -/obj/structure/spacevine, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/civvie) -"Gn" = ( +"Gh" = ( /obj/structure/spacevine, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/asteroid/airless, -/area/ruin/space/has_grav/singularitylab/civvie) -"Gq" = ( -/obj/machinery/the_singularitygen{ - anchored = 1 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"Gr" = ( -/obj/structure/cable{ - icon_state = "1-10" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/cargo) -"Gs" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ +/obj/structure/spacevine{ pixel_x = 32 }, -/obj/structure/spacevine/dense{ - pixel_y = 32 +/obj/structure/spacevine{ + pixel_y = -32 + }, +/obj/structure/spacevine{ + pixel_y = -32 }, -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab) -"Gv" = ( -/obj/structure/cable{ +/area/ruin/space/has_grav/singularitylab/civvie) +"Gi" = ( +/obj/machinery/door/airlock/external{ + dir = 4; + name = "Engine Access" + }, +/obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 9 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/reactor) +"Gm" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 }, -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" +/obj/structure/spacevine, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/civvie) +"Gn" = ( +/obj/structure/spacevine, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space/has_grav/singularitylab/civvie) +"Gr" = ( +/obj/structure/cable{ + icon_state = "1-10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 + dir = 9 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 9 + }, +/obj/effect/turf_decal/siding/yellow{ dir = 4 }, /turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/area/ruin/space/has_grav/singularitylab/cargo) "Gw" = ( /obj/machinery/door/airlock/public/glass{ name = "Kitchen" @@ -8732,16 +8222,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"GA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external{ - dir = 4; - name = "Interior Mine" - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/cargo) "GC" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -8796,20 +8276,33 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"GH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/space/nearstation) "GJ" = ( /obj/effect/decal/cleanable/insectguts, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"GK" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "GL" = ( /obj/machinery/particle_accelerator/control_box, /turf/open/floor/engine, @@ -8840,6 +8333,13 @@ /obj/effect/turf_decal/box, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"GP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/space/nearstation) "GQ" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 @@ -8872,18 +8372,6 @@ /obj/structure/spacevine, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"GV" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "GW" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -8921,6 +8409,27 @@ /obj/effect/turf_decal/box, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"Hc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine/hull, +/area/space/nearstation) +"He" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "Hg" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 @@ -8937,6 +8446,15 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/reactor) +"Hi" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "Hj" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -8952,6 +8470,25 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab/cargo) +"Hk" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlabhanger" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) +"Hm" = ( +/obj/structure/table, +/obj/machinery/button/door{ + dir = 8; + id = "singlablast1"; + name = "Testing Chamber Control"; + pixel_x = -4; + pixel_y = 7 + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "Hn" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 8 @@ -8964,37 +8501,26 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"Hx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plating/asteroid/airless, -/area/ruin/space/has_grav/singularitylab/civvie) -"Hy" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"Hz" = ( +"Hr" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_y = 32 + pixel_x = -32 }, /obj/structure/spacevine/dense{ - pixel_x = -31; - pixel_y = 32 + pixel_x = -32; + pixel_y = -32 }, +/obj/structure/flora/ausbushes/fullgrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, /area/ruin/space/has_grav/singularitylab) +"Hx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space/has_grav/singularitylab/civvie) "HA" = ( /obj/structure/cable{ icon_state = "2-10" @@ -9004,16 +8530,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"HC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) "HD" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 10 @@ -9023,6 +8539,13 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"HE" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "HF" = ( /obj/structure/chair/office, /obj/effect/mob_spawn/human/corpse/charredskeleton, @@ -9042,6 +8565,22 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"HK" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "HL" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/spacevine/dense, @@ -9053,6 +8592,28 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"HN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/mining{ + dir = 4; + name = "Cargo Bay" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/cargo) "HO" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -9080,17 +8641,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /turf/open/floor/plasteel/grimy, /area/ruin/space/has_grav/singularitylab/lab) -"HT" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "HU" = ( /obj/structure/fireaxecabinet{ pixel_y = 32 @@ -9101,17 +8651,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/engineering) -"HV" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "HW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 5 @@ -9121,6 +8660,22 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"HX" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "HY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 5 @@ -9132,23 +8687,11 @@ /area/ruin/space/has_grav/singularitylab/cargo) "Ia" = ( /obj/machinery/porta_turret{ - stun_projectile = "/obj/projectile/beam/hitscan/disabler" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plasteel/tech/techmaint, -/area/ruin/space/has_grav/singularitylab/cargo) -"Ib" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" + stun_projectile = "/obj/projectile/beam/hitscan/disabler" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/machinery/light/small/directional/north, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/space/has_grav/singularitylab/cargo) "Ic" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -9158,6 +8701,18 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"Id" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "If" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, @@ -9175,19 +8730,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Ih" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) -"Ii" = ( -/obj/machinery/door/airlock{ - name = "Private Quarters" - }, -/turf/closed/mineral/random, -/area/ruin/space/has_grav) "Ij" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 10 @@ -9234,12 +8776,18 @@ /obj/machinery/power/shieldwallgen/atmos, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"Is" = ( -/obj/effect/turf_decal/solarpanel, -/obj/machinery/power/solar, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/space/nearstation) +"Iq" = ( +/obj/structure/flippedtable{ + dir = 4; + icon_state = "" + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/spacevine, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "Iu" = ( /obj/structure/transit_tube/diagonal{ dir = 4 @@ -9315,16 +8863,9 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"IM" = ( -/obj/effect/turf_decal/solarpanel, -/obj/machinery/power/solar, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, +"IK" = ( +/obj/item/wrench, +/turf/open/space/basic, /area/space/nearstation) "IO" = ( /obj/structure/railing{ @@ -9363,11 +8904,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/engine/hull/reinforced, /area/ruin/space/has_grav/singularitylab/reactor) -"IV" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/space/nearstation) "IW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -9473,6 +9009,28 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/engineering) +"Jr" = ( +/obj/item/gun/energy/ionrifle/carbine{ + desc = "The Ion Projector is contained within a sleek metal case. Engraved on the handle are the letters S.H. The stock is warm to the touch"; + dry_fire_text = "RECHARGING"; + name = "ion projector"; + pixel_x = 2; + pixel_y = 5; + selfcharge = 1 + }, +/obj/item/screwdriver{ + pixel_y = -6 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 9 + }, +/obj/structure/sign/poster/official/ion_carbine{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "Ju" = ( /obj/structure/chair/office{ dir = 8 @@ -9546,6 +9104,40 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) +"JJ" = ( +/obj/item/gun/energy/e_gun/smg{ + dry_fire_sound = 'sound/items/ding.ogg'; + dry_fire_text = "ding"; + name = "\improper Modified E-TAR SMG"; + pixel_x = 5; + pixel_y = 6 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/item/stack/telecrystal{ + pixel_x = -9; + pixel_y = -4 + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 10 + }, +/obj/structure/sign/poster/official/mini_energy_gun{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) +"JK" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/under/rank/rnd/scientist, +/obj/item/clothing/shoes/sneakers/white, +/obj/effect/gibspawner, +/obj/item/gun/energy/lasercannon/unrestricted{ + desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; + icon_state = "pulse"; + name = "NT-LS-1013" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) "JL" = ( /obj/structure/spacevine, /obj/effect/decal/cleanable/insectguts, @@ -9569,6 +9161,13 @@ /obj/item/stack/sheet/glass/fifty, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) +"JO" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlablas1" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab/lab) "JP" = ( /obj/structure/closet/emcloset{ anchored = 1 @@ -9581,17 +9180,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"JQ" = ( -/obj/structure/sign/poster/retro/science{ - pixel_y = 32 - }, -/obj/structure/chair/office{ - desc = "Technologically enhanced for the optimal research position."; - dir = 8; - name = "science chair" - }, -/turf/open/floor/carpet/nanoweave/purple, -/area/ruin/space/has_grav/singularitylab/lab) "JS" = ( /obj/structure/sign/warning/radiation{ pixel_x = 32 @@ -9603,17 +9191,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"JT" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "JU" = ( /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) @@ -9663,23 +9240,100 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab) -"Kc" = ( -/obj/structure/spacevine, -/turf/closed/wall{ - desc = "A huge chunk of metal holding the roof of the asteroid at bay"; - name = "structural support" +"Kb" = ( +/obj/structure/chair/stool/bar{ + dir = 4; + name = "picnic stool"; + pixel_x = 9; + pixel_y = 7 }, -/area/ruin/space/has_grav/singularitylab) +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/obj/structure/spacevine, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "Ke" = ( /turf/closed/indestructible/rock{ base_icon_state = "smoothrocks" }, /area/ruin/space/has_grav) +"Kf" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"Kg" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 6 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Kh" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -31; + pixel_y = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Ki" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/box, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/space/has_grav/singularitylab/cargo) +"Kj" = ( +/obj/item/seeds/kudzu, +/obj/structure/sign/poster/contraband/kudzu{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense, +/obj/structure/closet/firecloset{ + anchored = 1 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Kk" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Kn" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ dir = 4 @@ -9700,28 +9354,14 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"Kr" = ( -/obj/item/gun/energy/ionrifle/carbine{ - desc = "The Ion Projector is contained within a sleek metal case. Engraved on the handle are the letters S.H. The stock is warm to the touch"; - dry_fire_text = "RECHARGING"; - name = "ion projector"; - pixel_x = 2; - pixel_y = 5; - selfcharge = 1 - }, -/obj/item/screwdriver{ - pixel_y = -6 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 9 - }, -/obj/structure/sign/poster/official/ion_carbine{ - pixel_x = -32 +"Kq" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "singlabfurn" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/obj/structure/railing, +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab/cargo) "Ks" = ( /obj/structure/cable{ icon_state = "6-8" @@ -9764,26 +9404,16 @@ /obj/structure/window/plasma/reinforced{ dir = 1 }, -/obj/structure/spacevine, -/obj/machinery/computer/atmos_control/tank/nitrogen_tank, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) -"Ky" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = -32 - }, -/obj/structure/spacevine{ - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/spacevine, +/obj/machinery/computer/atmos_control/tank/nitrogen_tank, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) +"KB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/floor/engine/hull, +/area/space/nearstation) "KC" = ( /obj/machinery/hydroponics/constructable, /obj/structure/spacevine, @@ -9791,6 +9421,13 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) +"KE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) "KF" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -9811,6 +9448,27 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"KI" = ( +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/item/flashlight/seclite, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) +"KK" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -14; + pixel_y = 4 + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Scientist" + }, +/obj/effect/turf_decal/siding/thinplating/light/corner, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "KL" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/plasteel/tech/techmaint, @@ -9862,6 +9520,17 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"KU" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "KW" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -9884,6 +9553,21 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"KY" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "KZ" = ( /obj/structure/cable{ icon_state = "2-5" @@ -9902,6 +9586,17 @@ dir = 1 }, /area/ruin/space/has_grav/singularitylab) +"Ld" = ( +/obj/structure/flippedtable{ + dir = 1; + icon_state = "" + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/turf/open/floor/plating/asteroid, +/area/ruin/space/has_grav/singularitylab) "Le" = ( /obj/structure/cable{ icon_state = "6-9" @@ -9922,17 +9617,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"Ln" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"Ll" = ( +/obj/machinery/conveyor_switch{ + id = "singlabcarg"; + pixel_x = 9; + pixel_y = -5 }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab) "Lq" = ( /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/engineering) @@ -10011,6 +9703,17 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) +"LH" = ( +/obj/structure/cable{ + icon_state = "4-9" + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/structure/spacevine, +/turf/open/floor/plasteel/tech/techmaint, +/area/ruin/space/has_grav/singularitylab) "LM" = ( /obj/structure/cable{ icon_state = "0-4" @@ -10053,6 +9756,12 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab) +"LQ" = ( +/turf/closed/wall{ + desc = "A huge chunk of metal holding the roof of the asteroid at bay"; + name = "structural support" + }, +/area/ruin/space/has_grav/singularitylab/hangar) "LY" = ( /obj/effect/turf_decal/corner/opaque/green{ dir = 6 @@ -10146,20 +9855,39 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"Mk" = ( -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"Mm" = ( +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 1 }, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "Mo" = ( /obj/structure/chair/comfy/brown{ dir = 8 }, /turf/open/floor/wood, /area/ruin/space/has_grav/singularitylab/civvie) +"Mq" = ( +/obj/structure/chair/stool/bar{ + dir = 8; + name = "picnic stool"; + pixel_x = -10; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/spacevine, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "Ms" = ( /obj/structure/spacevine{ pixel_y = -32 @@ -10185,15 +9913,18 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"My" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" +"Mx" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_y = -32 }, -/obj/structure/cable/yellow{ - icon_state = "1-4" +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/engine/hull, -/area/space/nearstation) +/area/ruin/space/has_grav/singularitylab/civvie) "MA" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -10215,11 +9946,13 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"MF" = ( -/obj/machinery/power/emitter/welded, -/obj/structure/cable/yellow, -/turf/open/floor/plating, -/area/space/nearstation) +"MD" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "MG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -10265,28 +9998,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"MO" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/space/nearstation) -"MQ" = ( -/obj/structure/spacevine/dense, -/obj/machinery/power/apc/auto_name/directional/north{ - start_charge = 0 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "MS" = ( /obj/structure/dresser, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -10325,25 +10036,6 @@ /obj/item/stack/cable_coil/cut/yellow, /turf/open/floor/engine/hull/reinforced, /area/ruin/space/has_grav/singularitylab/reactor) -"MW" = ( -/obj/machinery/door/airlock{ - dir = 8; - name = "Private Quarters" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/civvie) "MX" = ( /obj/structure/transit_tube/curved{ dir = 1 @@ -10388,6 +10080,18 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"Nd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper, +/obj/item/pen{ + pixel_x = 2; + pixel_y = -3 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ruin/space/has_grav/singularitylab/cargo) "Ni" = ( /obj/structure/spacevine, /obj/structure/spacevine{ @@ -10452,10 +10156,6 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/singularitylab/civvie) -"Nu" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "Nw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -10466,14 +10166,57 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"NG" = ( -/obj/effect/turf_decal/solarpanel, -/obj/machinery/power/solar, -/obj/structure/cable/yellow{ - icon_state = "0-2" +"Nx" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Ny" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"NB" = ( +/turf/closed/wall{ + desc = "A huge chunk of metal holding the roof of the asteroid at bay"; + name = "structural support" + }, +/area/ruin/space/has_grav/singularitylab) +"NC" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/obj/structure/spacevine{ + pixel_y = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"NE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external{ + dir = 4; + name = "Interior Mine" }, -/turf/open/floor/plating, -/area/space/nearstation) +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/cargo) "NH" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/industrial/warning{ @@ -10497,17 +10240,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"NJ" = ( -/obj/structure/spacevine/dense, -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ - dir = 8 - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "NK" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -10535,19 +10267,6 @@ }, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab/civvie) -"NN" = ( -/obj/structure/chair/stool/bar{ - dir = 4; - name = "picnic stool"; - pixel_x = 9; - pixel_y = 7 - }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/obj/structure/spacevine, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) "NP" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ @@ -10555,18 +10274,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"NR" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "NS" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/purple{ @@ -10574,23 +10281,16 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"NU" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 +"NT" = ( +/obj/structure/flippedtable{ + dir = 1; + icon_state = "" }, -/obj/structure/spacevine/dense{ - pixel_x = 32; - pixel_y = 32 +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/spacevine/dense, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; @@ -10653,17 +10353,6 @@ /obj/structure/tank_dispenser/plasma, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"Oe" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -14; - pixel_y = 4 - }, -/obj/structure/mirror{ - pixel_x = -29 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/civvie) "Oh" = ( /obj/structure/spacevine, /obj/machinery/atmospherics/components/binary/valve/digital/layer4{ @@ -10684,14 +10373,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"Ol" = ( -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "Om" = ( /obj/structure/cable{ icon_state = "4-8" @@ -10713,6 +10394,13 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"Op" = ( +/obj/machinery/door/airlock/public/glass{ + dir = 4; + name = "Hydroponics" + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) "Oq" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/purple{ @@ -10740,6 +10428,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"Ov" = ( +/obj/structure/sign/poster/retro/science{ + pixel_y = 32 + }, +/obj/structure/chair/office{ + desc = "Technologically enhanced for the optimal research position."; + dir = 8; + name = "science chair" + }, +/turf/open/floor/carpet/nanoweave/purple, +/area/ruin/space/has_grav/singularitylab/lab) "Ox" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -10755,12 +10454,6 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"Oy" = ( -/turf/closed/wall{ - desc = "A huge chunk of metal holding the roof of the asteroid at bay"; - name = "structural support" - }, -/area/ruin/space/has_grav/singularitylab/hangar) "Oz" = ( /obj/structure/particle_accelerator/fuel_chamber{ dir = 4 @@ -10790,6 +10483,16 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"OC" = ( +/obj/structure/flippedtable{ + dir = 1; + icon_state = "" + }, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt{ + baseturfs = /turf/open/floor/plating/asteroid + }, +/area/ruin/space/has_grav/singularitylab) "OE" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -10828,22 +10531,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"OK" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/machinery/recharger{ - pixel_x = 5; - pixel_y = -5 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) "OL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 9 @@ -10918,17 +10605,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"OU" = ( -/obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "OV" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating, @@ -10940,24 +10616,20 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"OZ" = ( -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" +"OX" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/obj/item/flashlight/seclite, -/turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) "Pa" = ( /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"Pb" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "Pd" = ( /obj/structure/bed, /obj/item/bedsheet/nanotrasen, @@ -11009,15 +10681,6 @@ }, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/singularitylab/lab) -"Pk" = ( -/obj/structure/spacevine, -/obj/structure/spacevine/dense, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "Pl" = ( /obj/structure/cable{ icon_state = "1-2" @@ -11098,24 +10761,21 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"Pv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 +"Px" = ( +/obj/structure/spacevine, +/obj/structure/spacevine{ + pixel_y = 32 }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/structure/spacevine{ + pixel_x = -32 }, -/obj/structure/table/wood/fancy/purple, -/obj/structure/fluff/beach_umbrella{ - pixel_x = -5; - pixel_y = 16 +/obj/structure/spacevine/dense{ + pixel_x = -31; + pixel_y = 32 }, -/obj/machinery/jukebox/boombox, -/obj/structure/spacevine, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "Pz" = ( /obj/effect/turf_decal/box, /obj/structure/closet/crate, @@ -11195,6 +10855,19 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"PL" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/closet/emcloset, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "PM" = ( /obj/structure/table, /obj/machinery/reagentgrinder, @@ -11220,6 +10893,15 @@ /obj/machinery/computer/atmos_alert, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"PS" = ( +/obj/structure/spacevine, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "PT" = ( /obj/structure/table/reinforced, /obj/item/binoculars, @@ -11245,36 +10927,49 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Qc" = ( -/obj/structure/spacevine, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"PY" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/area/ruin/space/has_grav/singularitylab/civvie) -"Qd" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/turf/open/floor/engine/hull, +/area/space/nearstation) +"PZ" = ( +/obj/effect/turf_decal/box, +/obj/machinery/light/directional/north, +/obj/item/gun/energy/lasercannon/unrestricted{ + desc = "An advanced laser cannon, a laser etched inscription in the handle states 'NT-LS-1013'. The casing is made of a lightweight alloy."; + icon_state = "pulse"; + name = "NT-LS-1013" }, -/area/ruin/space/has_grav/singularitylab) -"Qg" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-8" +/obj/item/gun/energy/laser/iot, +/obj/item/gun/energy/laser/iot{ + dry_fire_sound = 'sound/items/ding.ogg'; + dry_fire_text = "ding" + }, +/obj/structure/safe{ + name = "Prototype Storage" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab/lab) +"Qe" = ( +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" }, +/obj/structure/spacevine, +/turf/open/floor/plating/dirt{ + baseturfs = /turf/open/floor/plating/asteroid + }, +/area/ruin/space/has_grav/singularitylab) +"Qh" = ( +/obj/machinery/power/rad_collector/anchored, /obj/structure/cable/yellow{ - icon_state = "1-2" + icon_state = "0-2" }, -/turf/open/space/basic, +/turf/open/floor/plating, /area/space/nearstation) "Qi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ @@ -11285,69 +10980,37 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Qj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/space/nearstation) "Ql" = ( -/obj/item/banner/engineering{ - anchored = 1 - }, -/turf/open/floor/engine/hull, -/area/space/nearstation) -"Qm" = ( /obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ +/obj/structure/spacevine{ pixel_x = -32 }, +/obj/structure/spacevine{ + pixel_y = -32 + }, /obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab) +/area/ruin/space/has_grav/singularitylab/civvie) "Qo" = ( /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav) -"Qr" = ( -/obj/structure/spacevine, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"Qs" = ( -/obj/structure/cable{ - icon_state = "1-2" +"Qq" = ( +/obj/machinery/power/shieldwallgen/atmos/strong/roundstart{ + id = "singlabhang" }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 +/obj/structure/cable/yellow{ + icon_state = "0-8" }, -/mob/living/simple_animal/hostile/venus_human_trap, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlabhanger" }, +/turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) "Qt" = ( /obj/effect/turf_decal/corner/transparent/orange{ @@ -11358,14 +11021,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"Qw" = ( -/obj/structure/table, -/obj/item/clipboard{ - pixel_x = 9; - pixel_y = 7 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/engineering) "Qx" = ( /obj/structure/table/wood, /obj/machinery/light/small/directional/west, @@ -11409,9 +11064,6 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"QB" = ( -/turf/closed/mineral/random, -/area/ruin/space/has_grav) "QC" = ( /obj/structure/cable{ icon_state = "1-6" @@ -11423,19 +11075,6 @@ /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"QD" = ( -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/spacevine, -/obj/machinery/light/directional/north, -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "QE" = ( /obj/effect/turf_decal/corner/transparent/orange{ dir = 10 @@ -11447,25 +11086,19 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"QH" = ( -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/tank/internals/oxygen, -/obj/effect/decal/remains/human, -/obj/structure/cable{ - icon_state = "4-8" - }, +"QF" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_y = -32 + pixel_x = 32 }, -/obj/effect/decal/cleanable/blood/old, /obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab) +/area/ruin/space/has_grav/singularitylab/civvie) "QI" = ( /obj/structure/spacevine, /obj/machinery/light/directional/north, @@ -11483,29 +11116,43 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"QO" = ( +/obj/machinery/power/shieldwallgen/atmos/strong/roundstart{ + dir = 1; + id = "singlabhang" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlabhanger" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "QQ" = ( /obj/effect/decal/remains/human, /obj/item/clothing/shoes/sneakers/white, /obj/item/clothing/under/rank/rnd/scientist, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) -"QT" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" - }, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "QV" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"QW" = ( +/obj/structure/cable{ + icon_state = "5-9" + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "QX" = ( /obj/structure/cable/yellow{ icon_state = "1-6" @@ -11519,12 +11166,35 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) +"QY" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "QZ" = ( /obj/structure/railing{ dir = 8 }, /turf/open/floor/plasteel/stairs, /area/ruin/space/has_grav/singularitylab/engineering) +"Rb" = ( +/obj/machinery/power/emitter/welded{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/space/nearstation) "Rc" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/industrial/warning/corner, @@ -11540,6 +11210,16 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) +"Rf" = ( +/obj/structure/spacevine/dense, +/mob/living/simple_animal/hostile/venus_human_trap, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "Rh" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 5 @@ -11566,15 +11246,14 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/engineering) -"Ro" = ( -/obj/structure/spacevine, -/mob/living/simple_animal/hostile/venus_human_trap, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"Rl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/turf/open/space/basic, +/area/space/nearstation) "Rp" = ( /obj/structure/transit_tube/horizontal, /obj/structure/plasticflaps/opaque{ @@ -11591,6 +11270,26 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"Rq" = ( +/obj/structure/cable{ + icon_state = "1-6" + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 8 + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 5 + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "Rr" = ( /obj/structure/cable{ icon_state = "6-8" @@ -11613,6 +11312,19 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) +"Rw" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Rx" = ( /obj/structure/dresser, /obj/item/radio/intercom/directional/west, @@ -11704,15 +11416,23 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"RN" = ( -/obj/structure/toilet{ - dir = 4; - pixel_x = -6; - pixel_y = 6 +"RP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/table/wood/fancy/blue, +/obj/structure/fluff/beach_umbrella{ + pixel_x = -5; + pixel_y = 16 + }, +/obj/structure/spacevine, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/ruin/space/has_grav/singularitylab/civvie) "RR" = ( /obj/effect/turf_decal/corner/transparent/orange{ dir = 5 @@ -11726,53 +11446,26 @@ /obj/structure/cable{ icon_state = "6-9" }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood{ - icon_state = "bubblegumfoot" - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/cargo) -"RV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/reactor) -"RW" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/civvie) -"RX" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/machinery/portable_atmospherics/scrubber/huge, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) -"RZ" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = -32 +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 }, -/obj/structure/spacevine{ - pixel_y = -32 +/obj/effect/decal/cleanable/blood{ + icon_state = "bubblegumfoot" }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/cargo) +"RV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/reactor) +"RW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4, +/turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) "Sa" = ( /obj/structure/cable{ @@ -11808,23 +11501,16 @@ /obj/structure/spacevine, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"Sh" = ( -/obj/item/stack/cable_coil/cut/yellow, -/turf/open/space/basic, -/area/space/nearstation) -"Si" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_y = -32 +"Sj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/space/basic, +/area/space/nearstation) "Sk" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -11833,17 +11519,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Sm" = ( -/obj/structure/toilet{ - dir = 8; - pixel_x = 6; - pixel_y = 5 - }, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/civvie) "Sn" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -11905,23 +11580,29 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab/lab) -"SF" = ( +"Sv" = ( +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 23 + }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" }, /obj/effect/turf_decal/siding/thinplating{ dir = 4 }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 23 - }, -/obj/structure/railing/corner{ - pixel_x = -3; - pixel_y = 2 +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 }, /obj/structure/transit_tube/station/dispenser/flipped{ dir = 8 @@ -11933,17 +11614,36 @@ dir = 8 }, /turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab/cargo) +"SC" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, /area/ruin/space/has_grav/singularitylab) -"SH" = ( -/obj/structure/chair/stool/bar{ - dir = 1; - name = "picnic stool"; - pixel_y = 16 +"SE" = ( +/obj/structure/toilet{ + dir = 4; + pixel_x = -6; + pixel_y = 6 }, -/obj/effect/turf_decal/siding/wood/end, -/obj/structure/spacevine, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/machinery/light/small/directional/south, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) +"SJ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/flippedtable{ + dir = 2; + icon_state = "" + }, +/turf/open/floor/carpet/nanoweave/purple, +/area/ruin/space/has_grav/singularitylab/lab) "SK" = ( /obj/structure/closet/emcloset{ anchored = 1 @@ -11960,11 +11660,49 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"SM" = ( +/obj/structure/spacevine, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "SQ" = ( /obj/machinery/rnd/production/protolathe/department/engineering, /obj/structure/spacevine, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/engineering) +"SR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/space/nearstation) +"SS" = ( +/obj/machinery/door/poddoor{ + dir = 4; + id = "singlabhanger" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) +"ST" = ( +/obj/structure/flippedtable{ + dir = 4; + icon_state = "" + }, +/obj/structure/spacevine/dense, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "SW" = ( /obj/structure/chair/office{ dir = 4 @@ -11982,6 +11720,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/visible/layer4, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"SY" = ( +/obj/structure/cable{ + icon_state = "6-9" + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "SZ" = ( /obj/effect/spawner/structure/window, /obj/structure/curtain/cloth/fancy, @@ -11997,6 +11747,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"Tb" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Td" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -12008,6 +11770,35 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) +"Th" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 23 + }, +/obj/structure/railing/corner{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/structure/transit_tube/station/dispenser/flipped{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "Ti" = ( /obj/structure/transit_tube/curved, /obj/structure/cable{ @@ -12017,18 +11808,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"To" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_y = 32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "Tq" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 8 @@ -12051,15 +11830,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"Tu" = ( -/obj/structure/spacevine, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) "Tv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 5 @@ -12105,22 +11875,6 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab/civvie) -"TC" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_y = 32 - }, -/obj/structure/spacevine/dense{ - pixel_y = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "TD" = ( /obj/structure/cable{ icon_state = "4-8" @@ -12152,6 +11906,20 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"TG" = ( +/obj/structure/cable{ + icon_state = "5-9" + }, +/obj/effect/turf_decal/siding/thinplating, +/obj/item/gun/energy/e_gun/smg{ + dry_fire_sound = 'sound/items/ding.ogg'; + dry_fire_text = "ding"; + name = "\improper Modified E-TAR SMG"; + pixel_x = 5; + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "TH" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/corner/opaque/white/full, @@ -12164,14 +11932,34 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/siding/thinplating/dark{ +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/cargo) +"TK" = ( +/obj/structure/cable{ + icon_state = "5-8" + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/flippedtable{ + dir = 8; + icon_state = "" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/cargo) +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "TL" = ( /obj/machinery/rnd/production/circuit_imprinter/department/engi, /turf/open/floor/plasteel/dark, @@ -12220,13 +12008,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"TQ" = ( -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-10" - }, -/turf/open/floor/plating, -/area/space/nearstation) "TR" = ( /obj/structure/cable{ icon_state = "4-8" @@ -12310,19 +12091,25 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) -"Uf" = ( -/obj/structure/chair/stool/bar{ - dir = 8; - name = "picnic stool"; - pixel_x = -10; - pixel_y = 4 +"Ue" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 +/obj/structure/spacevine/dense{ + pixel_y = 32 }, -/obj/structure/spacevine, -/turf/open/floor/wood, -/area/ruin/space/has_grav/singularitylab/civvie) +/obj/structure/spacevine/dense{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Ui" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable{ @@ -12385,6 +12172,50 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/engineering) +"Up" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Ur" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"Ut" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Ux" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Uy" = ( /obj/machinery/door/airlock{ name = "Bedroom" @@ -12407,6 +12238,45 @@ "UD" = ( /turf/open/floor/engine/hull/reinforced, /area/ruin/space/has_grav/singularitylab/reactor) +"UF" = ( +/obj/effect/turf_decal/solarpanel, +/obj/machinery/power/solar, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"UG" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense{ + pixel_y = -32 + }, +/obj/structure/spacevine/dense{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"UH" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "UI" = ( /obj/structure/spacevine, /obj/structure/spacevine/dense{ @@ -12435,6 +12305,33 @@ baseturfs = /turf/open/floor/plating/asteroid }, /area/ruin/space/has_grav/singularitylab) +"UL" = ( +/obj/structure/sign/poster/retro/lasergun{ + pixel_x = -32 + }, +/obj/effect/turf_decal/box, +/obj/machinery/light/directional/north, +/obj/item/gun/energy/e_gun/smg{ + dry_fire_sound = 'sound/items/ding.ogg'; + dry_fire_text = "ding"; + name = "\improper Modified E-TAR SMG"; + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/gun/energy/e_gun/smg{ + dry_fire_sound = 'sound/items/ding.ogg'; + dry_fire_text = "ding"; + name = "\improper Modified E-TAR SMG"; + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/gun/energy/laser, +/obj/item/gun/energy/laser, +/obj/structure/safe{ + name = "Prototype Storage" + }, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab/lab) "UM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on/layer4{ dir = 8 @@ -12447,18 +12344,13 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"UR" = ( -/obj/structure/spacevine, -/obj/item/gun/energy/floragun, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/gibspawner, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +"UP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "2-8" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/space/basic, +/area/space/nearstation) "UU" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 9 @@ -12479,6 +12371,22 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) +"UW" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "UY" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ @@ -12486,6 +12394,40 @@ }, /turf/open/floor/engine, /area/ruin/space/has_grav/singularitylab) +"Vb" = ( +/obj/structure/spacevine/dense{ + pixel_x = -32 + }, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Vc" = ( +/obj/structure/spacevine/dense, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible/layer4{ + dir = 6 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) +"Ve" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 5; + pixel_y = 11 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "Vg" = ( /obj/structure/sign/warning/radiation/rad_area{ pixel_x = 32 @@ -12540,6 +12482,12 @@ /obj/item/gun/energy/floragun, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"Vn" = ( +/obj/machinery/the_singularitygen{ + anchored = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) "Vo" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 6 @@ -12549,18 +12497,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Vp" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "Vq" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/industrial/warning/corner, @@ -12608,62 +12544,51 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"Vw" = ( -/obj/effect/turf_decal/corner/opaque/green{ - dir = 10 - }, -/obj/effect/turf_decal/corner/opaque/green{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/civvie) -"Vz" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/tech/grid, -/area/ruin/space/has_grav/singularitylab/engineering) -"VA" = ( +"Vv" = ( +/obj/item/clothing/suit/space/hardsuit/engine, +/obj/item/flamethrower/full, +/obj/effect/decal/remains/human, /obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/lavendergrass, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"VD" = ( -/obj/structure/table, -/obj/structure/sign/poster/official/moth/hardhats{ - pixel_x = -32 - }, -/obj/structure/spacevine, -/obj/item/assembly/igniter{ - pixel_x = 7; - pixel_y = 3 + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -6 +/area/ruin/space/has_grav/singularitylab/engineering) +"Vw" = ( +/obj/effect/turf_decal/corner/opaque/green{ + dir = 10 }, -/obj/item/assembly/igniter{ - pixel_x = -7; - pixel_y = 3 +/obj/effect/turf_decal/corner/opaque/green{ + dir = 5 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/civvie) +"Vz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/tech/grid, /area/ruin/space/has_grav/singularitylab/engineering) "VE" = ( /obj/machinery/light/directional/west, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) -"VF" = ( -/obj/machinery/door/airlock/public/glass{ - dir = 4; - name = "Hydroponics" +"VG" = ( +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" }, -/turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/singularitylab/civvie) +"VH" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "VI" = ( /obj/structure/curtain/cloth, /obj/machinery/light/small/directional/north, @@ -12716,6 +12641,37 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) +"VT" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = -32 + }, +/obj/structure/spacevine{ + pixel_y = -32 + }, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"VU" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) "VV" = ( /obj/structure/transit_tube/curved/flipped{ dir = 4 @@ -12817,13 +12773,6 @@ }, /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav/singularitylab/civvie) -"Wg" = ( -/obj/effect/decal/cleanable/blood/drip{ - pixel_x = 5; - pixel_y = 11 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "Wh" = ( /obj/structure/spacevine, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -12850,20 +12799,27 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/lab) -"Wl" = ( -/obj/structure/cable{ - icon_state = "5-9" +"Wm" = ( +/obj/effect/turf_decal/solarpanel, +/obj/machinery/power/solar, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/obj/effect/turf_decal/siding/thinplating, -/obj/item/gun/energy/e_gun/smg{ - dry_fire_sound = 'sound/items/ding.ogg'; - dry_fire_text = "ding"; - name = "\improper Modified E-TAR SMG"; - pixel_x = 5; - pixel_y = 6 +/obj/structure/cable/yellow{ + icon_state = "0-2" }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) +/turf/open/floor/plating, +/area/space/nearstation) +"Wo" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/space/nearstation) "Wp" = ( /obj/structure/railing/corner{ dir = 4 @@ -12895,25 +12851,26 @@ /obj/effect/decal/cleanable/ash, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Wy" = ( -/obj/structure/window/reinforced{ - dir = 1 +"Ww" = ( +/obj/machinery/door/airlock{ + dir = 4; + name = "Barracks" }, -/obj/effect/turf_decal/corner/opaque/white/full, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 5 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/sol_dry{ - pixel_x = -6; - pixel_y = -3 +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 }, -/obj/item/reagent_containers/food/drinks/soda_cans/sodawater{ - pixel_x = 8; - pixel_y = 8 +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ruin/space/has_grav/singularitylab/civvie) "Wz" = ( /obj/machinery/door/airlock/vault{ name = "Vault Access" @@ -12948,6 +12905,17 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"WE" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/zombie/kudzu{ + zombiejob = "Assistant" + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "WG" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/machinery/light/directional/east, @@ -12971,6 +12939,10 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) +"WJ" = ( +/obj/structure/table, +/turf/closed/mineral/random, +/area/ruin/space/has_grav) "WK" = ( /obj/structure/rack, /obj/item/gun/energy/e_gun/rdgun{ @@ -13048,43 +13020,18 @@ }, /turf/open/floor/holofloor/wood, /area/ruin/space/has_grav/singularitylab/lab) -"WU" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/mining{ - dir = 4; - name = "Cargo Bay" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/cargo) -"WV" = ( +"WT" = ( /obj/structure/spacevine/dense, /obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/mob/living/simple_animal/hostile/zombie/kudzu{ - zombiejob = "Assistant" + pixel_y = -32 }, -/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; name = "grass" }, -/area/ruin/space/has_grav/singularitylab/civvie) +/area/ruin/space/has_grav/singularitylab) "WW" = ( /obj/structure/transit_tube/curved/flipped{ dir = 1 @@ -13101,22 +13048,6 @@ /obj/structure/spacevine, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"Xa" = ( -/obj/machinery/door/airlock/engineering{ - dir = 8; - name = "Power Control" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/engineering) "Xc" = ( /obj/structure/chair/office, /obj/structure/sign/poster/official/wtf_is_co2{ @@ -13127,6 +13058,21 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/singularitylab/reactor) +"Xe" = ( +/obj/structure/spacevine{ + pixel_y = 32 + }, +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/engine, +/area/ruin/space/has_grav/singularitylab) "Xf" = ( /obj/structure/filingcabinet, /obj/item/pen/fountain, @@ -13147,6 +13093,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab) +"Xh" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ruin/space/has_grav/singularitylab/cargo) "Xk" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/on/layer4{ @@ -13164,44 +13119,26 @@ }, /turf/open/floor/carpet/nanoweave/beige, /area/ruin/space/has_grav/singularitylab/cargo) -"Xn" = ( -/obj/machinery/door/airlock{ +"Xp" = ( +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/singularitylab/engineering) +"Xt" = ( +/obj/machinery/door/airlock/hatch{ dir = 4; - name = "Barracks" + name = "Server Room" }, -/obj/machinery/door/firedoor/border_only{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/turf/open/floor/plasteel/tech, -/area/ruin/space/has_grav/singularitylab/civvie) -"Xo" = ( -/obj/machinery/hydroponics/constructable, -/obj/structure/spacevine, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab/civvie) -"Xp" = ( -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/ruin/space/has_grav/singularitylab/engineering) -"Xs" = ( -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = 32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" +/obj/machinery/door/firedoor/border_only{ + dir = 4 }, -/area/ruin/space/has_grav/singularitylab/civvie) +/turf/open/floor/plating, +/area/ruin/space/has_grav/singularitylab/lab) "Xv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 @@ -13211,13 +13148,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"Xw" = ( -/obj/structure/flippedtable{ - dir = 8; - icon_state = "" - }, -/turf/open/floor/plating/asteroid, -/area/ruin/space/has_grav/singularitylab) "Xx" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ @@ -13229,8 +13159,18 @@ /obj/effect/turf_decal/corner/opaque/purple{ dir = 1 }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab/lab) +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) +"XB" = ( +/obj/structure/spacevine, +/obj/structure/spacevine/dense, +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "XD" = ( /obj/effect/turf_decal/industrial/warning/corner{ dir = 4 @@ -13269,34 +13209,11 @@ }, /turf/closed/wall/r_wall, /area/ruin/space/has_grav/singularitylab/reactor) -"XG" = ( -/obj/structure/cable{ - icon_state = "1-6" - }, -/obj/structure/spacevine/dense, -/obj/structure/spacevine/dense{ - pixel_x = -32 - }, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "XJ" = ( /obj/structure/lattice/catwalk, /obj/structure/spacevine, /turf/open/floor/plating, /area/ruin/space/has_grav/singularitylab) -"XN" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/singularitylab) "XR" = ( /obj/effect/turf_decal/siding/thinplating, /obj/effect/decal/cleanable/blood{ @@ -13321,6 +13238,18 @@ /obj/structure/filingcabinet, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"Ya" = ( +/obj/structure/table, +/obj/item/paper{ + default_raw_text = "Whatever happens. Happens." + }, +/obj/item/pen, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "Yc" = ( /obj/structure/cable{ icon_state = "1-2" @@ -13340,6 +13269,46 @@ /obj/effect/decal/cleanable/blood, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) +"Yh" = ( +/obj/structure/spacevine, +/mob/living/simple_animal/hostile/venus_human_trap, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"Yi" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/effect/turf_decal/corner/opaque/white/full, +/obj/structure/table, +/obj/item/lighter{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/clothing/mask/cigarette, +/obj/item/clothing/mask/cigarette{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab/lab) +"Yj" = ( +/turf/closed/wall{ + desc = "A huge chunk of metal holding the roof of the asteroid at bay"; + name = "structural support" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "Yk" = ( /obj/machinery/conveyor{ id = "singlabcarg" @@ -13373,13 +13342,6 @@ /obj/structure/chair, /turf/open/floor/carpet/nanoweave/purple, /area/ruin/space/has_grav/singularitylab/lab) -"Yo" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "singlablas2" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab/lab) "Yp" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -13399,14 +13361,19 @@ }, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"Ys" = ( +"Yt" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, /obj/structure/spacevine/dense, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 10 +/obj/structure/spacevine/dense{ + pixel_x = -32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 10 +/obj/structure/spacevine/dense{ + pixel_x = -32; + pixel_y = 32 }, +/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/grass/jungle{ baseturfs = /turf/open/floor/plasteel; desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; @@ -13493,17 +13460,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/reactor) -"YG" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/button/door{ - dir = 8; - id = "singlabcargo2"; - name = "Blast Door Control"; - pixel_x = 24 - }, -/obj/structure/spacevine, -/turf/open/floor/plating, -/area/ruin/space/has_grav/singularitylab) "YH" = ( /obj/structure/transit_tube, /obj/structure/cable{ @@ -13520,13 +13476,25 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plating/asteroid, /area/ruin/space/has_grav/singularitylab) -"YJ" = ( -/obj/structure/sign/poster/official/moth/boh{ - pixel_x = -32 +"YK" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"YL" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "YN" = ( /obj/structure/table, /obj/item/paper_bin, @@ -13556,45 +13524,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/cargo) -"YV" = ( -/obj/structure/sign/poster/retro/lasergun{ - pixel_x = -32 - }, -/obj/effect/turf_decal/box, -/obj/machinery/light/directional/north, -/obj/item/gun/energy/e_gun/smg{ - dry_fire_sound = 'sound/items/ding.ogg'; - dry_fire_text = "ding"; - name = "\improper Modified E-TAR SMG"; - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/gun/energy/e_gun/smg{ - dry_fire_sound = 'sound/items/ding.ogg'; - dry_fire_text = "ding"; - name = "\improper Modified E-TAR SMG"; - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/gun/energy/laser, -/obj/item/gun/energy/laser, -/obj/structure/safe{ - name = "Prototype Storage" - }, -/turf/open/floor/engine, -/area/ruin/space/has_grav/singularitylab/lab) -"YW" = ( -/obj/structure/cable{ - icon_state = "6-9" - }, -/obj/structure/spacevine/dense, -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/floor/plating/grass/jungle{ - baseturfs = /turf/open/floor/plasteel; - desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; - name = "grass" - }, -/area/ruin/space/has_grav/singularitylab) "YX" = ( /obj/effect/turf_decal/corner/opaque/white/full, /turf/open/floor/plasteel, @@ -13611,23 +13540,51 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/singularitylab/engineering) +"Za" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine/dense{ + pixel_x = 32 + }, +/obj/machinery/portable_atmospherics/scrubber/huge, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab) "Zc" = ( /turf/closed/wall, /area/ruin/space/has_grav/singularitylab) -"Zh" = ( -/obj/structure/cable{ - icon_state = "6-9" +"Ze" = ( +/obj/structure/spacevine, +/turf/closed/wall{ + desc = "A huge chunk of metal holding the roof of the asteroid at bay"; + name = "structural support" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen{ - pixel_x = -4; - pixel_y = 2 +/area/ruin/space/has_grav/singularitylab) +"Zg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "1-4" }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ruin/space/has_grav/singularitylab/cargo) +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/space/nearstation) +"Zj" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/techfloor/corner, +/obj/machinery/button/door{ + dir = 1; + id = "singlabcargo1"; + name = "Blast Door Control"; + pixel_y = -25 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/singularitylab) "Zk" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile, @@ -13710,12 +13667,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab) -"Zx" = ( -/turf/closed/wall{ - desc = "A huge chunk of metal holding the roof of the asteroid at bay"; - name = "structural support" - }, -/area/ruin/space/has_grav/singularitylab/cargo) "Zy" = ( /obj/structure/cable{ icon_state = "6-10" @@ -13805,6 +13756,16 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"ZO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/space/nearstation) "ZR" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13817,6 +13778,34 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/singularitylab/civvie) +"ZS" = ( +/obj/structure/cable{ + icon_state = "1-10" + }, +/obj/structure/spacevine, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) +"ZU" = ( +/obj/structure/spacevine/dense, +/obj/structure/spacevine{ + pixel_x = 32 + }, +/turf/open/floor/plating/grass/jungle{ + baseturfs = /turf/open/floor/plasteel; + desc = "A patch of overgrown grass. Hints of plasteel plating lay under it."; + name = "grass" + }, +/area/ruin/space/has_grav/singularitylab/civvie) "ZV" = ( /obj/structure/transit_tube/horizontal, /obj/structure/cable{ @@ -13881,7 +13870,7 @@ tq tq tq tq -QB +id tq tq tq @@ -13927,17 +13916,17 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id tq -QB -QB +id +id tq tq "} @@ -13953,7 +13942,7 @@ tq tq tq tq -QB +id tq tq tq @@ -14002,19 +13991,19 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id tq tq "} @@ -14024,18 +14013,18 @@ tq tq tq tq -QB -QB +id +id tq tq tq -QB -QB +id +id tq Ke Ke Ke -QB +id Ke tq tq @@ -14047,8 +14036,8 @@ tq tq tq tq -QB -QB +id +id tq tq tq @@ -14057,7 +14046,7 @@ tq tq tq tq -QB +id tq tq tq @@ -14078,20 +14067,20 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id tq tq "} @@ -14100,7 +14089,7 @@ tq tq tq tq -QB +id Ke Ke Ke @@ -14110,22 +14099,22 @@ Ke Ke Ke Ke -QB -QB -QB +id +id +id Ke Ke -QB +id tq tq tq -QB +id tq tq tq -QB -QB -QB +id +id +id tq tq tq @@ -14133,8 +14122,8 @@ tq tq tq tq -QB -QB +id +id tq tq tq @@ -14142,10 +14131,10 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq @@ -14154,14 +14143,14 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id tq tq tq @@ -14179,29 +14168,29 @@ tq tq tq Ke -QB +id Ke tq Ke -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Ke tq tq Ke Ke Ke -QB +id tq -QB -QB -QB +id +id +id tq tq tq @@ -14209,35 +14198,35 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq tq -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id tq tq tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id tq tq tq @@ -14256,28 +14245,28 @@ tq Ke Ke Ke -QB +id Ke Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Ke Ke Ke Ke -QB +id Ke -QB +id tq tq -QB +id tq tq tq @@ -14286,18 +14275,18 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq tq tq tq -QB -QB +id +id tq tq tq @@ -14305,15 +14294,15 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id tq tq tq @@ -14331,25 +14320,25 @@ tq tq Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke tq tq @@ -14362,10 +14351,10 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq @@ -14373,23 +14362,23 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id kP tq tq @@ -14407,26 +14396,26 @@ tq tq Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke tq tq @@ -14439,8 +14428,8 @@ tq tq tq tq -QB -QB +id +id tq tq tq @@ -14450,23 +14439,23 @@ tq tq tq tq -QB -QB +id +id tq tq tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id kP tq tq @@ -14481,29 +14470,29 @@ tq tq "} (9,1,1) = {" -QB +id Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -14516,8 +14505,8 @@ tq tq tq tq -QB -QB +id +id tq tq tq @@ -14534,14 +14523,14 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id kP kP kP @@ -14562,26 +14551,26 @@ tq Ke Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -14600,9 +14589,9 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq tq @@ -14610,14 +14599,14 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id kP kP kP @@ -14639,27 +14628,27 @@ tq tq tq Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -14676,9 +14665,9 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq tq @@ -14687,14 +14676,14 @@ tq tq tq tq -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id kP kP kP @@ -14716,28 +14705,28 @@ tq tq Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -14753,24 +14742,24 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP -QB -QB +id +id kP kP kP @@ -14792,30 +14781,30 @@ tq tq Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -sa -Qs -rf -XG -vV -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +Yt +AB +dh +st +Hr +id +id +id +id +id +id Ke Ke tq @@ -14830,24 +14819,24 @@ tq tq tq tq -QB +id tq -QB +id tq tq tq tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP kP -QB -QB +id +id kP kP kP @@ -14866,40 +14855,40 @@ tq tq "} (14,1,1) = {" -QB +id Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -xR -zl -Ew -fq -fq -YW -sU -lb -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +Ue +AS +fD +pd +pd +SY +Tb +UG +id +id +id +id +id Ke Ke Ke Ke Ke -QB +id Ke Ke Ke @@ -14916,14 +14905,14 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP kP -QB +id kP kP kP @@ -14943,42 +14932,42 @@ tq tq "} (15,1,1) = {" -QB +id Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -ci -Qd -nN -QB -QB -sw -Dl -EY -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +qn +Id +WT +id +id +UW +nz +HX +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -14992,15 +14981,15 @@ tq tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP kP kP -QB +id kP kP kP @@ -15023,14 +15012,14 @@ tq tq Ke Ke -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Zc Zc Zc @@ -15039,45 +15028,45 @@ ii Iz iZ Zc -QB -QB +id +id mo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke tq tq tq tq tq -QB -QB +id +id tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP kP kP kP -QB +id kP kP kP @@ -15100,16 +15089,16 @@ tq tq tq Ke -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Zc -jB +Px zx zx Bh @@ -15121,19 +15110,19 @@ Zc Or Zc Zc -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -15145,10 +15134,10 @@ Ke tq tq tq -QB -QB -QB -QB +id +id +id +id kP kP kP @@ -15156,8 +15145,8 @@ kP kP kP kP -QB -QB +id +id kP kP tq @@ -15177,18 +15166,18 @@ tq tq tq Ke -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Zc tr -OU -fT +KU +SC jj Re eh @@ -15196,28 +15185,28 @@ FE wR th jN -bD +rw Zc -QB -QB -QB -dG -zB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +Dg +qG +id +id +id +id +id +id +id +id +id Ke Ke Ke Ke Ke -QB +id Ke Ke tq @@ -15233,8 +15222,8 @@ kP kP kP kP -QB -QB +id +id kP kP tq @@ -15261,11 +15250,11 @@ Ke Ke Ke Ke -QB +id Zc tr -fT -OU +SC +KU VW vb xK @@ -15273,34 +15262,34 @@ zJ KH Es Fx -bD +rw Zc -QB -QB -Hz -xo -gB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -Ke -Ke -Ke -QB -QB +id +id +Kh +mL +up +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +Ke +Ke +Ke +id +id Ke Ke kP @@ -15311,8 +15300,8 @@ kP kP kP kP -QB -QB +id +id kP tq tq @@ -15338,9 +15327,9 @@ Qo Qo Qo Ke -QB +id Zc -uQ +Xe UY wX Bh @@ -15348,37 +15337,37 @@ OP fG Kx Wh -Ew +fD Oh ac Zc Zc -CE +oG UU fw -FI -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +NB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke Ke @@ -15388,8 +15377,8 @@ kP kP kP kP -QB -QB +id +id kP tq tq @@ -15412,10 +15401,10 @@ Ke Qo Qo Qo -QB +id Qo Ke -QB +id Zc Zc Zc @@ -15424,8 +15413,8 @@ Jb WI Zc PR -NJ -Ew +hN +fD De TX wk @@ -15435,31 +15424,31 @@ jQ Ot Kt iQ -ra +dt ut kT -QB -FI -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -FI -QB -QB -QB -QB -QB -QB +id +NB +id +id +id +id +id +id +id +id +id +id +id +id +id +NB +id +id +id +id +id +id Ke Ke Ke @@ -15486,10 +15475,10 @@ tq tq tq Ke -QB -QB -QB -QB +id +id +id +id Qo Ke Ke @@ -15498,11 +15487,11 @@ Ni Bh Bh Bh -HV -ax +Eu +pK aj -oP -Ew +UH +fD Gy VP kA @@ -15537,12 +15526,12 @@ us us Jc HW -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id Ke Ke kP @@ -15563,10 +15552,10 @@ tq tq tq Ke -QB -QB -QB -QB +id +id +id +id Qo Qo Ke @@ -15575,10 +15564,10 @@ XE OW OW Et -aI -rA +hf +nT FE -dM +Vc SX MN jM @@ -15593,7 +15582,7 @@ iB iN wm Zw -FI +NB BX BX BX @@ -15606,21 +15595,21 @@ BX BX BX BX -QB -FI -QB -QB -QB -QB +id +NB +id +id +id +id kU oa -QB -FI -QB -QB -QB -QB -QB +id +NB +id +id +id +id +id Ke kP kP @@ -15637,11 +15626,11 @@ tq "} (24,1,1) = {" tq -QB -QB +id +id Ke -QB -QB +id +id Qo Qo Qo @@ -15654,14 +15643,14 @@ Zc Zc CD CD -HV -Bp +Eu +yI Ou kb kD Zc -QB -QB +id +id cU cX zE @@ -15678,26 +15667,26 @@ Eo EX zq Di -VD +qV OH Uo ce BX -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id Ci CC my UV yS -QB -QB -QB +id +id +id Ke Ke kP @@ -15715,31 +15704,31 @@ tq (25,1,1) = {" tq tq -QB +id Ke -QB -QB +id +id Qo -QB -QB -QB -QB -QB +id +id +id +id +id Qo Qo Ad AR -Gs -RX -yp +ku +Za +tI nZ iF sH Ss Zc -QB -Qm -Ew +id +vi +fD wW lJ mY @@ -15750,32 +15739,32 @@ BX BX hP by -Qw +tV RR MH QZ In Di -bZ -bZ +Du +Du TZ BX rg jL kU -QB -QB -QB -QB -QB -QB -FI +id +id +id +id +id +id +NB os KT la -QB -QB -QB +id +id +id Ke kP kP @@ -15794,17 +15783,17 @@ tq tq tq Ke -QB -QB +id +id Qo -QB -QB -QB -QB -QB +id +id +id +id +id Qo -QB -QB +id +id AT om om @@ -15814,14 +15803,14 @@ Zc Zc Zc Zc -QB -TC -QB -FI +id +HK +id +NB OM -FI -Ge -FF +NB +lt +LH BX BX BX @@ -15834,7 +15823,7 @@ dX CI CY Cb -nq +Vv QE KQ EV @@ -15842,17 +15831,17 @@ jL kU kU kU -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id HP EN yS -QB -QB +id +id Ke Ke kP @@ -15871,33 +15860,33 @@ tq tq tq Ke -QB -QB +id +id Qo -QB +id Qo Qo Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -NU -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +GK +id +id eF -QB -Ys +id +tk Xg Jq cB @@ -15920,17 +15909,17 @@ Fy kU kU jp -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id os KT la -FI -QB +NB +id Ke Ke kP @@ -15948,34 +15937,34 @@ tq tq Ke Ke -QB -QB +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id eF -QB -pv -QH +id +iV +kd BX bo JU @@ -15999,16 +15988,16 @@ nr ua uN uN -Vp -hh -QB -QB -QB +vL +Kk +id +id +id HP Nj vY -QB -QB +id +id Ke Ke kP @@ -16024,35 +16013,35 @@ tq tq tq Ke -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -FI +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +NB bl -FI -MQ -uY +NB +ht +hg BX EK rB @@ -16060,7 +16049,7 @@ rB EK rB BX -Xa +mu yi JS FW @@ -16076,17 +16065,17 @@ JD ua ua ua -jT -cP -Cu -QB -QB -FI +Dj +lL +Ux +id +id +NB os Nc Bb zY -QB +id Ke Ke kP @@ -16099,37 +16088,37 @@ tq "} (30,1,1) = {" tq -QB -Ke -QB -QB -QB -QB -QB -QB -QB -FI -QB -QB -QB -FI -QB -QB -QB -FI -QB -QB -QB -QB -QB -QB -QB -FI +id +Ke +id +id +id +id +id +id +id +NB +id +id +id +NB +id +id +id +NB +id +id +id +id +id +id +id +NB rZ Na -QB -jC -vT +id +ST +Iq BX Ei xZ @@ -16140,7 +16129,7 @@ YZ vE yi yi -cz +ob yi yi BX @@ -16154,17 +16143,17 @@ ET JD ua ua -jT -Ew -Ew -QB -QB -QB +Dj +fD +fD +id +id +id pI aQ LP qc -QB +id Ke Ke kP @@ -16176,13 +16165,13 @@ tq "} (31,1,1) = {" tq -QB +id Ke -QB -QB -QB -QB -QB +id +id +id +id +id rZ VZ DC @@ -16191,7 +16180,7 @@ YH YH DC Ph -CL +xv Ph NV YH @@ -16204,7 +16193,7 @@ YH DC wx tE -QB +id vg gI BX @@ -16222,11 +16211,11 @@ ru yi ok ua -jT -jT -jT -jT -jT +Dj +Dj +Dj +Dj +Dj Ly ha JD @@ -16235,14 +16224,14 @@ ua ua Mi xG -QB -QB -QB +id +id +id WQ GX TN bY -QB +id Ke Ke kP @@ -16255,33 +16244,33 @@ tq tq tq Ke -QB -QB -QB -QB +id +id +id +id Ck ys wY -FI -QB -QB -QB -FI +NB +id +id +id +NB Yu Pu kk -Kc -QB -QB -QB -QB -QB -QB -QB -FI +Ze +id +id +id +id +id +id +id +NB ec -QB -QB +id +id vg ly BX @@ -16298,12 +16287,12 @@ HO mB yi Fw -jT -jT -zz -jT -pv -Ew +Dj +Dj +dx +Dj +iV +fD ua BT ha @@ -16313,13 +16302,13 @@ Mi Vo kU kU -QB -QB -QB -QB +id +id +id +id pI zg -QB +id Ke Ke Ke @@ -16333,31 +16322,31 @@ tq tq Ke Ke -QB -QB -QB +id +id +id DG uE -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id ql gK Yy -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id hW xH Wv @@ -16375,13 +16364,13 @@ Rk Md yi Fw -jT -jT -jT +Dj +Dj +Dj ua ua -Ew -Cu +fD +Ux ua oc ha @@ -16391,13 +16380,13 @@ kU kU kU jp -QB -QB -QB -QB +id +id +id +id QA vY -QB +id Ke Ke Ke @@ -16410,34 +16399,34 @@ tq tq tq Ke -QB -QB -QB +id +id +id pS -QB -QB -QB -QB +id +id +id +id BM Bc WH -Ln -Ib -fv -tB +YK +FV +aa +KY WH Bc Bc -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id ZC OJ -QB +id BX fe ea @@ -16456,10 +16445,10 @@ AQ AQ ua ua -jT -cP -Cu -Cu +Dj +lL +Ux +Ux ua oc EM @@ -16469,14 +16458,14 @@ GJ kU ua UK -QB -QB -QB +id +id +id os og -QB -QB -QB +id +id +id Ke Ke tq @@ -16487,13 +16476,13 @@ tq Ke Ke Ke -QB -QB -FI +id +id +NB bl -FI -QB -QB +NB +id +id ty ty ty @@ -16507,14 +16496,14 @@ ty ty ty EU -QB -QB -QB -QB -QB +id +id +id +id +id ZC Ui -QB +id BX BX BX @@ -16525,7 +16514,7 @@ pE pE pE pE -dc +si pE pE pE @@ -16533,10 +16522,10 @@ pE pE AQ AQ -jT -HT -Ew -GV +Dj +OX +fD +sp AQ ua kn @@ -16549,11 +16538,11 @@ ua uN kU as -FI +NB Rp -FI -QB -QB +NB +id +id Ke se tq @@ -16562,14 +16551,14 @@ tq (36,1,1) = {" tq Ke -QB -QB -QB -QB -QB +id +id +id +id +id RL -QB -QB +id +id Bc ty MS @@ -16584,19 +16573,19 @@ dd Qx ty EU -WV -qm +dr +iJ fa Zu Zu jQ JC -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id pE Xc pt @@ -16608,13 +16597,13 @@ KO Yv cE pE -QB -QB -hE -QB +id +id +NC +id cf -QB -QB +id +id Wc Cl kH @@ -16628,9 +16617,9 @@ Vs zV Am Ud -QB -QB -QB +id +id +id Ke Qo tq @@ -16641,12 +16630,12 @@ tq Ke Ke Ke -QB -QB -QB +id +id +id RL -QB -QB +id +id Bc ty qo @@ -16661,8 +16650,8 @@ Ns Mo ty fn -xn -ip +dK +fh Zu Zu lg @@ -16670,10 +16659,10 @@ pG DK uN uN -QB -QB -QB -QB +id +id +id +id pE oT JX @@ -16685,13 +16674,13 @@ Fu rv Wb pE -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id kU Rh EC @@ -16705,9 +16694,9 @@ QV uW xW Ud -QB -QB -QB +id +id +id Ke Qo tq @@ -16718,22 +16707,22 @@ tq tq tq Ke -QB -QB -QB +id +id +id RL -QB -QB +id +id Bc ty -ay +jY ty SZ ty tx Bc ty -MW +yw ty SZ ty @@ -16744,13 +16733,13 @@ PF kt GU fW -QB +id ua -jT -wP -QB -QB -QB +Dj +QY +id +id +id pE Qt YC @@ -16762,18 +16751,18 @@ RV xS yQ pE -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id kU kU Rh -ve -jT +Kf +Dj ua ua ua @@ -16782,9 +16771,9 @@ jQ aT KZ lM -QB -QB -QB +id +id +id Ke Ke tq @@ -16795,12 +16784,12 @@ tq tq tq Ke -QB -QB -QB +id +id +id RL -QB -QB +id +id Bc NX rX @@ -16820,14 +16809,14 @@ ae hQ bj fW -QB -QB -QB -wv -iC -QB -QB -QB +id +id +id +Ur +aJ +id +id +id pE KM zi @@ -16839,19 +16828,19 @@ gi Od uV pE -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id kU ua -jT -ve -jT +Dj +Kf +Dj ua ua nr @@ -16859,10 +16848,10 @@ Vi nk qk Ud -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -16872,12 +16861,12 @@ tq tq tq Ke -QB -QB -QB +id +id +id RL -QB -QB +id +id Bc Bc Bc @@ -16895,16 +16884,16 @@ WH Nn dQ fW -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id pE UC oT @@ -16912,32 +16901,32 @@ Ed Ed uD pE -iL +Gi pE pE pE -QB -QB -QB -fU -QB -QB -QB -QB -QB +id +id +id +WJ +id +id +id +id +id LO ua -Dn -nB -eY +NT +ba +dI ua nr lc bi jO Ud -QB -QB +id +id Ke Ke Ke @@ -16945,16 +16934,16 @@ tq tq "} (41,1,1) = {" -QB -QB +id +id Ke Ke -QB -QB -QB +id +id +id RL -QB -QB +id +id Bc Bc ty @@ -16971,17 +16960,17 @@ ty WH Nn AK -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id pE Rc zu @@ -16991,30 +16980,30 @@ bH pE wF pE -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id LO -ko -ou -gS +OC +CP +Rw ET ET pY HG -FI +NB Rp -FI -QB +NB +id Ke Qo Qo @@ -17022,16 +17011,16 @@ tq tq "} (42,1,1) = {" -QB -QB +id +id Ke -QB -QB -QB -QB +id +id +id +id RL -QB -QB +id +id Bc Bc ty @@ -17048,7 +17037,7 @@ ty WH Nm tR -QB +id pE pE pE @@ -17066,7 +17055,7 @@ GY cG dp pE -wu +pF pE pE pE @@ -17076,22 +17065,22 @@ pE pE pE pE -QB -QB -QB -QB -QB +id +id +id +id +id Fw ua -jT +Dj JZ OQ -mJ +uI kU -QB +id ZV -QB -QB +id +id Ke Qo tq @@ -17102,14 +17091,14 @@ tq tq tq Ke -QB -QB -QB -FI +id +id +id +NB bl -FI -QB -QB +NB +id +id Bc ty Pd @@ -17125,17 +17114,17 @@ ty Bc Nn tR -QB +id pE -Nu -Nu +VH +VH UD IU UD -Nu -YJ -Nu -Nu +VH +FD +VH +VH pE Ix cG @@ -17144,31 +17133,31 @@ GL Wp pE Er -Nu -Nu -Nu +VH +VH +VH UD IU UD -Nu -Nu +VH +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id Fw -ft -ft +Qe +Qe dY aD kU -QB -QB +id +id ZV -QB -QB +id +id Ke Qo tq @@ -17179,14 +17168,14 @@ tq tq tq Ke -QB -QB -QB +id +id +id JA Yp -QB -QB -QB +id +id +id Bc ty Zq @@ -17195,24 +17184,24 @@ SZ tx Bc ty -nw +bC ty SZ ty Bc hS tR -QB +id pE -Nu -aA -aA -zP -aA -aA -aA -aA -aA +VH +nI +nI +uU +nI +nI +nI +nI +nI pE Ix cG @@ -17221,31 +17210,31 @@ cG dp pE Dp -aA -aA -aA -aA -zP -aA -aA -Nu +nI +nI +nI +nI +uU +nI +nI +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id kU ua ua qT aD kU -QB -QB +id +id ZV -QB -QB +id +id Ke Ke Ke @@ -17256,13 +17245,13 @@ tq tq tq Ke -QB -QB +id +id jq Ta El -QB -QB +id +id Zu Zu ty @@ -17279,17 +17268,17 @@ Bc Bc hS oW -QB +id pE -Nu -aA -pB -My -fg -fg -fg -Is -aA +VH +nI +Eh +ir +hu +hu +hu +Ar +nI pE Ix ye @@ -17298,33 +17287,33 @@ nc Ao pE Dp -aA -NG -IM -IM -kq -Is -aA -Nu +nI +UF +Wm +Wm +PY +Ar +nI +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id kU -aC -Xw -sk -tz -OZ -QB -QB +Ld +tl +BE +QW +KI +id +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -17333,13 +17322,13 @@ tq tq tq Ke -QB -QB +id +id DG IY -QB -QB -QB +id +id +id wh Zu Zu @@ -17356,17 +17345,17 @@ qa Aq WC Mu -QB +id pE -Nu -aA -aA -bO -aA -aA -aA -aA -aA +VH +nI +nI +KB +nI +nI +nI +nI +nI pE gC ag @@ -17375,33 +17364,33 @@ ag lD pE xV -Sh -aA -aA -aA -bO -aA -aA -Nu +zf +nI +nI +nI +KB +nI +nI +VH pE -QB -QB -QB -QB -QB -QB -gZ +id +id +id +id +id +id +JK kU qT -Wl +TG kU -QB +id kU ZV kU -QB -QB -QB +id +id +id Ke tq tq @@ -17410,14 +17399,14 @@ tq tq Ke Ke -QB -FI +id +NB bl -FI -QB -QB -lZ -Pk +NB +id +id +az +SM Zu Zu WH @@ -17432,18 +17421,18 @@ Hg Tw vw Mu -QB -QB +id +id pE -Nu -aA -NG -pw -fg -fg -fg -Is -aA +VH +nI +UF +sl +hu +hu +hu +Ar +nI pE da da @@ -17452,33 +17441,33 @@ da da pE PC -aA -NG -IM -IM -mK -Is -aA -Nu +nI +UF +Wm +Wm +Hc +Ar +nI +VH pE -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id fb VX qT aD kX -QB -QB +id +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -17486,14 +17475,14 @@ tq (48,1,1) = {" tq Ke -QB -QB -QB +id +id +id eF -QB -QB -nR -Qr +id +id +As +XB lg ae ae @@ -17510,52 +17499,52 @@ Hg zH Bc Bc -QB +id pE -Nu -aA -aA -bO -aA -aA -aA -aA -aA +VH +nI +nI +KB +nI +nI +nI +nI +nI UD -aA -aA -aA -aA -aA +nI +nI +nI +nI +nI MV -xm -aA -aA -aA -aA -bO -aA -aA -Nu +KE +nI +nI +nI +nI +KB +nI +nI +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id lK lK lK -lv -DL +DZ +lF lK lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -17563,15 +17552,15 @@ tq (49,1,1) = {" tq Ke -QB -QB -QB +id +id +id eF -QB -lZ -Qr -wH -DB +id +az +XB +Kg +iw xU xU xU @@ -17579,47 +17568,47 @@ ls Mh PN Zu -gU -nA +Up +mj Zu Zu KF mh -QB -QB -QB +id +id +id pE UD -aA -aA -bO -aA -aA -aA -aA -aA +nI +nI +KB +nI +nI +nI +nI +nI HR -aA -aA -aA -aA -aA +nI +nI +nI +nI +nI HR -xm -aA -aA -aA -aA -bO -aA -aA +KE +nI +nI +nI +nI +KB +nI +nI UD pE -QB -QB -QB -QB -QB +id +id +id +id +id lK Pj pi @@ -17627,12 +17616,12 @@ vu Cm AE lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -17640,63 +17629,63 @@ tq (50,1,1) = {" tq Ke -QB -QB -QB +id +id +id eF -QB +id wh Pp -CR -gU -Ol +ZS +Up +vz Zu JI JI JI bt JI -Xs -nV -ur +cv +QF +ts Zu hS yL -QB -Ii -QB +id +cC +id pE Rs -zP -zP -Dh -Ih -Ih -Ih -Ih -pc -Pb -Ih -Ih -CK -Ih -Ih -Pb -cl -Ih -Ih -Ih -Ih -Qj -zP -zP +uU +uU +cV +FJ +FJ +FJ +FJ +Rl +rt +FJ +FJ +Bq +FJ +FJ +rt +pM +FJ +FJ +FJ +FJ +Zg +uU +uU yn pE -QB -QB -QB -QB -QB +id +id +id +id +id lK kK fS @@ -17704,12 +17693,12 @@ Kn jG WS lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -17718,20 +17707,20 @@ tq tq Ke Ke -QB -QB +id +id eF -QB +id fa Nn tL Zu -fv -io +aa +Ut ty ty ty -ed +Ww ty ty ty @@ -17739,41 +17728,41 @@ ty Zu EP ps -QB -QB -QB +id +id +id pE UD -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -TQ -iX -tF -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +zv +kw +oR +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI UD pE -QB -QB -QB -QB -QB +id +id +id +id +id lK ho lK @@ -17781,12 +17770,12 @@ Vl BU lK lK -FI +NB Rp -FI -QB -QB -QB +NB +id +id +id Ke tq tq @@ -17795,16 +17784,16 @@ tq tq tq Ke -QB -QB +id +id eF -QB +id Zu Zy nm Zu -fv -Hy +aa +Mx Aw Jk mn @@ -17816,41 +17805,41 @@ Aw Bc hS Pg -QB -QB -QB +id +id +id pE -Nu -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -aA -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA -Nu +VH +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +nI +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id lK Lz lK @@ -17858,12 +17847,12 @@ xA Ju YB lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -17872,16 +17861,16 @@ tq tq tq Ke -QB -QB +id +id eF -QB +id Zu Nn tL Zu -JT -Si +wV +oF ty gO ty @@ -17893,41 +17882,41 @@ ty Bc EP FM -QB -QB -QB +id +id +id pE -Nu -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -aA -aA -aA -aA -Nu -aA -aA -aA -FA -xm -aA -aA -Nu +VH +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +nI +nI +nI +nI +VH +nI +nI +nI +IK +KE +nI +nI +VH pE -QB -QB -QB -QB -QB +id +id +id +id +id lK mv lK @@ -17935,13 +17924,13 @@ fF HS fI lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -17949,16 +17938,16 @@ tq tq tq Ke -QB -FI +id +NB bl -FI +NB QI Au nm Zu -fv -Hy +aa +Mx ty ty ty @@ -17970,37 +17959,37 @@ ty Bc hS bn -QB -QB -QB +id +id +id pE -Nu -aA -aA -yW -MF -Nu -Nu -Nu -ww -Nu -Nu -Nu -Nu -Nu -Nu -Nu -ww -Nu -Nu -Nu -rE -GH -aA -aA -Nu +VH +nI +nI +Sj +ig +VH +VH +VH +BG +VH +VH +VH +VH +VH +VH +VH +BG +VH +VH +VH +Rb +Wo +nI +nI +VH pE -QB +id lK lK lK @@ -18008,33 +17997,33 @@ lK lK FB lK -vy +vr lK lK lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq "} (55,1,1) = {" tq -QB +id Ke -QB -QB +id +id wp Rj NI GE HL Zu -fv +aa Ms Aw Jk @@ -18048,36 +18037,36 @@ Bc EP FM AN -QB -QB +id +id pE -Nu -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA -Nu +VH +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI +VH pE -QB +id lK nJ KL @@ -18087,13 +18076,13 @@ Om uJ nh lK -RN +SE lK -QB +id ZV -QB -QB -QB +id +id +id Ke Ke tq @@ -18101,17 +18090,17 @@ tq "} (56,1,1) = {" tq -QB +id Ke Ke -QB +id BS yr TM zR pN Zu -fv +aa Ms ty gO @@ -18125,36 +18114,36 @@ Bc hS bn cj -QB -QB +id +id pE -Nu -aA -aA -qj -IV -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -MO -wU -aA -aA -Nu +VH +nI +nI +ZO +Bx +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +Qh +ri +nI +nI +VH pE -QB +id lK qf oy @@ -18164,24 +18153,24 @@ mP RD MA lK -xr +jS lK -QB +id ZV -QB -QB -QB +id +id +id Ke Qo tq tq "} (57,1,1) = {" -QB -QB +id +id tq Ke -QB +id wp GQ KX @@ -18201,53 +18190,53 @@ ty Bc EP FM -QB -QB -QB +id +id +id pE UD -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI UD pE -QB +id lK Zk ze -km +Xt lK eW nd pj -na +KK rk lK -QB +id ZV -QB -QB -QB +id +id +id Ke Qo tq @@ -18258,9 +18247,9 @@ tq tq tq Ke -FI +NB bl -FI +NB LB tA kZ @@ -18278,37 +18267,37 @@ Aw Bc hS bn -QB -QB -QB +id +id +id pE Rs -zP -Ql -qU -aA -aA -aA -aA -Nu -Nu -Nu -Nu -Gq -Nu -Nu -Nu -Nu -aA -aA -aA -aA -qU -Ql -zP +uU +pT +zK +nI +nI +nI +nI +VH +VH +VH +VH +Vn +VH +VH +VH +VH +nI +nI +nI +nI +zK +pT +uU yn pE -QB +id lK PI RE @@ -18320,11 +18309,11 @@ Ex Tt fJ lK -QB +id ZV -QB -QB -QB +id +id +id Ke Qo tq @@ -18335,9 +18324,9 @@ tq tq tq Ke -QB +id RL -QB +id WH Nn BW @@ -18355,39 +18344,39 @@ ty Bc EP FM -QB -QB -QB +id +id +id pE UD -aA -aA -qU -aA -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA +nI +nI +zK +nI +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI UD pE -QB +id lK -JQ +Ov Rr LM lK @@ -18397,11 +18386,11 @@ EZ Ym oK lK -QB +id ZV -QB -QB -QB +id +id +id Ke Qo tq @@ -18412,9 +18401,9 @@ tq tq tq Ke -QB +id RL -QB +id WH Zy kZ @@ -18432,53 +18421,53 @@ ty Bc hS yL -QB -QB -QB +id +id +id pE -Nu -aA -aA -yW -IV -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -MO -GH -aA -aA -Nu +VH +nI +nI +Sj +Bx +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +Qh +Wo +nI +nI +VH pE -QB +id lK mE CX cw Pl -gM +Yi GF zC Ym zk lK -QB +id ZV -QB -QB -QB +id +id +id Ke Ke tq @@ -18489,9 +18478,9 @@ tq tq tq Ke -QB +id RL -QB +id WH Nn Fz @@ -18499,7 +18488,7 @@ Bc Bc ty VI -Oe +fP bg Pa bV @@ -18509,37 +18498,37 @@ Aw Bc EP ps -QB -QB -QB +id +id +id pE -Nu -aA -aA -xm -FA -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA -Nu +VH +nI +nI +KE +IK +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI +VH pE -QB +id lK co Sn @@ -18551,12 +18540,12 @@ pf ZD Cr lK -FI +NB Rp -FI -QB -QB -QB +NB +id +id +id Ke tq tq @@ -18566,9 +18555,9 @@ tq tq tq Ke -QB +id RL -QB +id WH HA qb @@ -18576,7 +18565,7 @@ Ey Bc ty ky -Sm +ew ty Pa WG @@ -18586,37 +18575,37 @@ ty Bc hS ZY -QB -QB -QB +id +id +id pE -Nu -aA -aA -qj -MF -Nu -Nu -Nu -ww -Nu -Nu -Nu -Nu -Nu -Nu -Nu -ww -Nu -Nu -Nu -rE -wU -aA -aA -Nu +VH +nI +nI +ZO +ig +VH +VH +VH +BG +VH +VH +VH +VH +VH +VH +VH +BG +VH +VH +VH +Rb +ri +nI +nI +VH pE -QB +id lK xC ei @@ -18628,24 +18617,24 @@ rI OS kp lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq "} (63,1,1) = {" tq -QB +id Ke Ke -QB +id RL -QB +id Bc Bc TO @@ -18655,7 +18644,7 @@ ty ty ty ty -Xn +en ty ty ty @@ -18663,37 +18652,37 @@ ty Bc CV Mu -QB -QB -QB +id +id +id pE -Nu -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -aA -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA -Nu +VH +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +nI +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI +VH pE -QB +id lK FX LN @@ -18705,13 +18694,13 @@ lK Bk lK lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -18719,11 +18708,11 @@ tq tq tq Ke -QB -QB +id +id RL -QB -QB +id +id Bc Bc af @@ -18733,44 +18722,44 @@ Bc Bc WH xL -qN -EF -EF +Vb +Bi +Bi uv Bc jt -QB -QB -QB -QB +id +id +id +id pE -Nu -aA -aA -xm -aA -aA -aA -aA -Nu -aA -aA -aA -aA -aA -aA -aA -Nu -aA -aA -aA -aA -xm -aA -aA -Nu +VH +nI +nI +KE +nI +nI +nI +nI +VH +nI +nI +nI +nI +nI +nI +nI +VH +nI +nI +nI +nI +KE +nI +nI +VH pE -QB +id lK dP pL @@ -18782,13 +18771,13 @@ lK Lw zb lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -18796,12 +18785,12 @@ tq tq tq Ke -QB -QB +id +id RL -QB -QB -QB +id +id +id in Ic aZ @@ -18816,38 +18805,38 @@ WH WH lg aL -QB -QB -QB -QB +id +id +id +id pE UD -aA -aA -xm -aA -aA -aA -aA -Nu -aA -nK -aA -aA -aA -nK -aA -Nu -aA -aA -aA -aA -xm -aA -aA +nI +nI +KE +nI +nI +nI +nI +VH +nI +eu +nI +nI +nI +eu +nI +VH +nI +nI +nI +nI +KE +nI +nI UD pE -QB +id lK dP uc @@ -18855,17 +18844,17 @@ dP kE xw lK -YV +UL Lw WK lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -18873,11 +18862,11 @@ tq tq tq Ke -QB -QB +id +id RL -QB -QB +id +id Bc JP bV @@ -18893,56 +18882,56 @@ gF gF fX Sd -QB -QB -QB -QB +id +id +id +id pE Rs -zP -zP -op -Ih -Ih -Ih -Ih -Ih -Ih -Qg -Ih -Pb -Ih -HC -Ih -Ih -Ih -Ih -Ih -Ih -CB -zP -zP +uU +uU +UP +FJ +FJ +FJ +FJ +FJ +FJ +vd +FJ +rt +FJ +SR +FJ +FJ +FJ +FJ +FJ +FJ +GP +uU +uU yn pE -QB +id lK dP Lw dP -Wy +lU xw lK Dx Lw Su lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -18950,11 +18939,11 @@ tq tq tq Ke -QB -FI +id +NB bl -FI -QB +NB +id Bc iA gN @@ -18969,39 +18958,39 @@ Tw Tw Vj WP -QB -QB -QB -QB -QB +id +id +id +id +id pE UD -aA -aA -zP -aA -aA -aA -aA -aA -aA -aA -aA -Ql -aA -aA -aA -aA -aA -aA -aA -aA -zP -aA -aA +nI +nI +uU +nI +nI +nI +nI +nI +nI +nI +nI +pT +nI +nI +nI +nI +nI +nI +nI +nI +uU +nI +nI UD pE -QB +id lK fy ga @@ -19009,16 +18998,16 @@ fy gm TR lK -uX +PZ QQ pC lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -19027,11 +19016,11 @@ tq tq Ke Ke -QB +id kU fo -QB -QB +id +id Bc DT Vt @@ -19040,45 +19029,45 @@ Zu Zu Zu FP -fv -xM -jr -jr +aa +nG +VG +VG Zu bN -QB -QB -QB -QB -QB +id +id +id +id +id pE -Nu -aA -aA -zP -aA -aA -aA -aA -aA -aA -aA -aA -zP -aA -aA -aA -aA -aA -aA -aA -aA -zP -aA -aA -Nu +VH +nI +nI +uU +nI +nI +nI +nI +nI +nI +nI +nI +uU +nI +nI +nI +nI +nI +nI +nI +nI +uU +nI +nI +VH pE -QB +id lK lK lK @@ -19090,12 +19079,12 @@ lK lK lK lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -19103,108 +19092,108 @@ tq (69,1,1) = {" Ke Ke -QB +id yg wg pH -QB -QB +id +id Bc Bc Vr VR Zu -fv -fv -Ol +aa +aa +vz yh -fv -fv -fv +aa +aa +aa Zu Zu IP -QB -QB -QB -QB +id +id +id +id pE -Nu -Nu +VH +VH UD ll UD -Nu -Nu -Nu -Nu -Nu -Nu +VH +VH +VH +VH +VH +VH UD ll UD -Nu -Nu -Nu -Nu -Nu -Nu +VH +VH +VH +VH +VH +VH UD ll UD -Nu -Nu +VH +VH pE -QB +id lK sv cK -vX -eo -Gv -Ae -OK -Kr +SJ +Rq +ya +Mm +oY +Jr GR lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq "} (70,1,1) = {" Ke -QB -QB +id +id xx kU -QB -QB +id +id Bc Bc Bc ZR ps -fv +aa Zu Zu -NN +Kb yh Zu Zu Zu -NN +Kb xJ Zu -sI -QB -QB -QB +oH +id +id +id pE XF pE @@ -19232,7 +19221,7 @@ pE pE pE pE -QB +id lK Xf HF @@ -19242,24 +19231,24 @@ RG sh Lk BH -et +JJ lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq "} (71,1,1) = {" Ke -QB -FI +id +NB gD -aY +Yj ty ty ty @@ -19267,74 +19256,74 @@ ty ph TW ps -jr +VG Zu Zu -qg -SH +vD +cZ Zu Zu Zu -Pv -SH +lH +cZ wM -Qc -Ky -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +lx +Ql +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id lK PT Td ih mp -kr +TK YX Ty NP -aU +VU lK -FI +NB Rp -FI -QB -QB -QB +NB +id +id +id Ke tq tq "} (72,1,1) = {" Ke -QB -QB +id +id ZV ty yH @@ -19344,49 +19333,49 @@ PB ZE Bo ps -gU -VA +Up +Nx Zu -xa +jx Zu Zu FP Zu -Uf +Mq Zu Zu -Ol -nA -RZ -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +vz +mj +VT +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id lK nl Vq @@ -19398,20 +19387,20 @@ oA oS TH lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq "} (73,1,1) = {" Ke -QB -QB +id +id ZV ty Iv @@ -19421,13 +19410,13 @@ lu Bc Jl XR -jr -xM +VG +nG Zu Zu fa -VA -nA +Nx +mj Zu Zu fa @@ -19439,30 +19428,30 @@ ty ty yh wr -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id lK lK VJ @@ -19475,20 +19464,20 @@ yd VS Oq lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq "} (74,1,1) = {" Ke -QB -QB +id +id ZV ty FS @@ -19498,13 +19487,13 @@ lu Bc hS RK -Ol +vz Zu Zu -Ol -Be -gU -jr +vz +Rf +Up +VG fa fa fa @@ -19516,48 +19505,48 @@ PM ty ty jK -AD -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +bx +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id lK Fq sc GZ -EO +Hm tg AL GO -mU +AV NZ sJ lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -19565,7 +19554,7 @@ tq (75,1,1) = {" Ke Ke -QB +id ZV ty gJ @@ -19575,48 +19564,48 @@ eP du zM yh -Ol +vz Zu -NN +Kb Zu Zu fa -fv -NN +aa +Kb Zu Zu -fv -fv +aa +aa Ft pq Gf AI ty -vZ -Mk -QB -QB -QB -QB -QB -QB +qC +YL +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id Qo Qo Qo -QB +id lK qR Cp @@ -19629,20 +19618,20 @@ DX gw ne lK -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} (76,1,1) = {" tq Ke -QB +id ZV ty ty @@ -19652,66 +19641,66 @@ ty Gn Zu jy -Ol +vz Zu -er -SH +hA +cZ fa fa -Ol -oV -SH +vz +RP +cZ Zu -fv -fv +aa +aa Ft pq pq vI ty -sf -Mk -QB -QB -QB -QB -QB +qu +YL +id +id +id +id +id Qo -QB +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id Qo Qo Qo -QB -QB +id +id lK ul NH xO KR -nO +ry KR KR Wj XD lK lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -19719,27 +19708,27 @@ tq (77,1,1) = {" tq Ke -FI +NB Rp -FI -QB +NB +id Bc WH WH WH wO -fv -fv +aa +aa Zu -Uf +Mq Zu fa -fv -Tu -Uf +aa +PS +Mq Zu Zu -Bz +sW EL ty sN @@ -19748,47 +19737,47 @@ pq zS Eg fK -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id Qo Qo -QB +id lK lK -BP -BP -BP +JO +JO +JO lK -Yo -Yo -Yo +Dy +Dy +Dy lK lK lK -QB +id ZV -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -19796,27 +19785,27 @@ tq (78,1,1) = {" tq Ke -QB +id nj la -QB +id Bc WH WH hy Zu -fv -aP +aa +He Zu -Ol -Ol -Ol +vz +vz +vz Zu -sF -Ol +fk +vz Zu -Ol -AD +vz +bx yh Gw pq @@ -19824,31 +19813,31 @@ Gf ty ty AG -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id lK Lw Lw @@ -19858,13 +19847,13 @@ Lw Lw Lw lK -QB -QB -QB +id +id +id ZV -QB -QB -QB +id +id +id Ke Ke tq @@ -19876,56 +19865,56 @@ Ke Ke HP cL -QB +id Bc WH WH Tz Zu -gU -nA -Ol +Up +mj +vz Zu Zu -Ol -Ol -QT +vz +vz +WE Zu fa yh yh yh ty -ke +vh IQ ty -rh -gU -QB -QB -QB -QB +Kj +Up +id +id +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id lK pe pl @@ -19935,13 +19924,13 @@ pe Ax rO lK -QB -QB -QB +id +id +id ZV -QB -QB -QB +id +id +id Ke Qo tq @@ -19951,58 +19940,58 @@ tq tq tq Ke -QB +id ZV -QB +id Bc Bc WH Zu Zu -fv -VA -VA -Qc +aa +Nx +Nx +lx bb Zu -Ol -fv +vz +aa fa fa -VA -fv +Nx +aa yh ty un TT ty -oN -UR -QB -QB +PL +ca +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id lK Lw Lw @@ -20012,13 +20001,13 @@ Lw Lw Lw lK -QB -QB -FI +id +id +NB Rp -FI -QB -QB +NB +id +id Ke Qo tq @@ -20030,56 +20019,56 @@ tq Ke Ke ZV -QB +id Bc Bc Bc Zu Zu JI -jg +ZU xz -Ro -Ol -Ol +Yh +vz +vz yh fa -fv +aa rY fa -fv -Mk +aa +YL ty un bk ty -To -Qc -QB -QB +gR +lx +id +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id lK lK lK @@ -20090,12 +20079,12 @@ lK lK lK lK -QB -QB +id +id ZV -QB -QB -QB +id +id +id Ke Ke tq @@ -20107,8 +20096,8 @@ tq tq Ke ZV -QB -QB +id +id Bc WH WH @@ -20116,64 +20105,64 @@ bN ty ty ty -VF +Op ty -QD +iW KC KC Ik Ik Ik -gU -AM +Up +cI ty un IX ty Mg WH -QB -QB +id +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Qo Qo Qo Qo -QB -QB -QB -QB -QB +id +id +id +id +id cW Fc -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -20184,8 +20173,8 @@ tq Ke Ke ZV -QB -QB +id +id WH WH WH @@ -20195,7 +20184,7 @@ ai Vm gH rD -AD +bx yh Zu Zu @@ -20209,49 +20198,49 @@ Fg ty CU WH -QB -QB +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Qo Qo bv Qo Qo -QB -QB -QB -QB -QB +id +id +id +id +id VV OL -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq "} @@ -20259,10 +20248,10 @@ tq tq tq Ke -QB +id ZV -QB -QB +id +id Ek WH Zu @@ -20285,49 +20274,49 @@ ty ty ty CU -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id EI Qo cH Qo Qo Qo -QB -QB -QB -QB +id +id +id +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke Ke tq @@ -20336,11 +20325,11 @@ tq tq tq Ke -QB +id ZV -QB -QB -QB +id +id +id fn Zu Ms @@ -20351,10 +20340,10 @@ lV rD yh WO -Xo -gQ -gQ -Xo +zA +zL +zL +zA Zu fa fa @@ -20362,64 +20351,64 @@ NM qs We zX -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id IB -GA +NE IB IB Qo Qo Qo Qo -QB +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq "} (86,1,1) = {" tq -QB +id Ke -QB +id ZV -QB -QB -QB -jR -fv +id +id +id +hv +aa Ms ty sM @@ -20428,75 +20417,75 @@ Jv rD yh Zu -Ol -Qc -Qc +vz +lx +lx fs Zu fa tv -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id Qo Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Cg sV dg IB Qo -QB -QB -QB -QB +id +id +id +id ZV -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq "} (87,1,1) = {" tq -QB +id Ke -QB +id ZV -QB -QB -QB -QB -hF +id +id +id +id +Ny Ms ty ty @@ -20505,60 +20494,60 @@ ty ty xB Zu -QT -Qc +WE +lx Zu Zu -Qc +lx Jx -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id lh TI lh -QB -QB -QB -QB -QB -FI +id +id +id +id +id +NB Rp -FI -QB -QB -QB -QB +NB +id +id +id +id Ke tq tq @@ -20567,12 +20556,12 @@ tq tq tq Ke -FI +NB Rp -FI -QB -QB -QB +NB +id +id +id UJ fa Zu @@ -20585,57 +20574,57 @@ KC KC KC WO -Xo -za -QB -QB -QB -QB -QB -QB +zA +Ba +id +id +id +id +id +id Qo Qo -QB -QB -QB -QB +id +id +id +id Qo -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id Qo -QB -QB -QB +id +id +id kU -QB -QB -FI +id +id +NB kU kU -QB -QB -Zx +id +id +kM ES hl zc -Zx -QB -QB -QB -FI +kM +id +id +id +NB kU Ox -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -20644,51 +20633,51 @@ tq tq tq Ke -QB +id eB kU -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id yh yh JI JI -cr -sd -QB -QB -QB -QB -QB -QB +cT +Gh +id +id +id +id +id +id Qo Qo -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id Qo -QB -QB -QB +id +id +id yg Bw Ti @@ -20699,7 +20688,7 @@ od od Zp eH -jI +Sv eH Zp od @@ -20708,11 +20697,11 @@ od my MX pH -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -20721,75 +20710,75 @@ tq tq Ke Ke -QB +id Ci Iu HW -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Qo Qo -QB -QB -QB +id +id +id mq bM kU -FI -QB -QB -QB -QB -Zx +NB +id +id +id +id +kM vm ij Jy -Zx -QB -QB -QB -FI -QB -QB -QB -QB -QB -QB -QB +kM +id +id +id +NB +id +id +id +id +id +id +id Ke Ke tq @@ -20797,77 +20786,77 @@ tq (91,1,1) = {" tq Ke -QB -QB -QB +id +id +id kU oa kU -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Qo Qo -QB -QB -QB -QB +id +id +id +id xx kU kU -QB -QB -QB -QB -Zx +id +id +id +id +kM Te ev YU Tx -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id Ke tq "} @@ -20877,57 +20866,57 @@ Ke Ke Ke Ke -QB +id Ci Iu HW -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id ZV kU kU -QB -QB -QB -QB -QB +id +id +id +id +id rj qK GD @@ -20938,73 +20927,73 @@ IB IB IB IB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id Ke Ke tq "} (93,1,1) = {" tq -QB -QB +id +id tq Ke Ke -QB +id kU oa kU -FI -QB -QB -QB -QB -FI -QB -QB -QB -Oy -QB -QB -QB -QB -QB -QB -FI -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +NB +id +id +id +id +NB +id +id +id +LQ +id +id +id +id +id +id +NB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id ZV kU kU -QB -QB -QB -QB -Zx +id +id +id +id +kM wB qK Uk @@ -21012,28 +21001,28 @@ Mj IB Ez Ma -ym +jk gP IB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id Ke tq tq "} (94,1,1) = {" tq -QB +id tq tq tq Ke Ke -QB +id Ci CC my @@ -21043,7 +21032,7 @@ od od my EG -SF +Th EG my od @@ -21055,48 +21044,48 @@ od my WW HW -QB -QB -QB -QB -FI -QB -QB -QB -QB -QB -QB -FI -QB -QB -QB -QB -QB -FI +id +id +id +id +NB +id +id +id +id +id +id +NB +id +id +id +id +id +NB kU Ox kU -QB -QB -QB -QB -QB -QB -Zx -QB +id +id +id +id +id +id +kM +id IB -WU +HN IB OO SW qy pp IB -QB -QB -QB -QB -QB +id +id +id +id +id Ke Ke tq @@ -21104,32 +21093,32 @@ tq "} (95,1,1) = {" tq -QB +id tq tq tq tq Ke Ke -QB -QB -FI -QB -QB -QB -QB -FI +id +id +NB +id +id +id +id +NB Xk GM ox -FI -QB -QB -QB -QB -QB -QB -FI +NB +id +id +id +id +id +id +NB kU qQ od @@ -21152,15 +21141,15 @@ od my MX pH -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id IB Zv nv @@ -21169,11 +21158,11 @@ Xl KW DH IB -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -21181,55 +21170,55 @@ tq "} (96,1,1) = {" tq -QB +id tq tq tq tq tq Ke -QB -QB -QB -QB -QB -FI -QB +id +id +id +id +id +NB +id Zc Ig xg vk Zc -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -FI -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +NB +id +id +id +id +id kU -FI -QB -QB -QB -QB -QB -FI +NB +id +id +id +id +id +NB kU -QB -QB +id +id lr lr lr @@ -21246,10 +21235,10 @@ jl wt mi IB -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -21258,18 +21247,18 @@ tq "} (97,1,1) = {" tq -QB +id tq tq tq tq tq Ke -QB -QB -QB -QB -FI +id +id +id +id +NB qq ZW GG @@ -21284,29 +21273,29 @@ lk VQ cQ cQ -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id lr vW hz @@ -21323,10 +21312,10 @@ JY Xv if IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -21340,18 +21329,18 @@ tq tq tq tq -QB +id Ke -QB -QB -QB -QB -QB +id +id +id +id +id FL nu If -XN -yk +If +Hi WB DE DE @@ -21361,29 +21350,29 @@ DE aK DE cQ -FI -QB -QB -QB +NB +id +id +id mx -QB -Oy +id +LQ ws ws ws -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id lr rK oE @@ -21397,13 +21386,13 @@ jV RU IE cb -lQ +Nd Me IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -21417,13 +21406,13 @@ tq tq tq tq -QB +id Ke Ke Ke Ke -QB -QB +id +id FL xe GW @@ -21449,18 +21438,18 @@ cS cS yA EJ -FI +NB Zc Zc Zc Zc Zc Zc -QB -QB -QB -QB -QB +id +id +id +id +id lr vW hz @@ -21472,15 +21461,15 @@ bu IB Ef lp -Zh +oz Tv nS pp IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -21493,14 +21482,14 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq Ke -QB -QB +id +id FL wq Fa @@ -21530,14 +21519,14 @@ ZX Zc Sk bX -hX +Ya xk Zc -QB -QB -QB -QB -QB +id +id +id +id +id lr lr lr @@ -21554,10 +21543,10 @@ Un sG sG IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -21568,16 +21557,16 @@ tq tq tq tq -QB -QB -QB -QB -QB +id +id +id +id +id tq Ke Ke -QB -QB +id +id FL wq yC @@ -21610,15 +21599,15 @@ dq rQ Dr Zc -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id IB gs sA @@ -21631,13 +21620,13 @@ OT uO IH IB -QB -QB -QB -QB +id +id +id +id Ke Ke -QB +id tq tq "} @@ -21646,15 +21635,15 @@ tq tq tq tq -QB -QB +id +id tq tq tq Ke -QB -QB -QB +id +id +id FL wq yC @@ -21679,23 +21668,23 @@ Ss Ss BB wq -Wg +Ve ZX Zc UM bX -aR +mD XZ Zc -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id IB Oa IB @@ -21704,15 +21693,15 @@ IB IB SK hJ -BI -tQ +ao +Xh Ul IB -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -21722,16 +21711,16 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq tq Ke -QB -QB -QB +id +id +id FL PJ yC @@ -21756,7 +21745,7 @@ Ss Ss BB MG -Ay +HE cQ Zc Zc @@ -21764,32 +21753,32 @@ Zc Zc Zc Zc -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id IB -kx -no -lj -em +pU +kv +Kq +rn IB IB IB -nM +sZ IB IB IB -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -21798,8 +21787,8 @@ tq (104,1,1) = {" tq tq -QB -QB +id +id tq tq tq @@ -21807,8 +21796,8 @@ tq tq Ke Ke -QB -FI +id +NB mQ Qi yC @@ -21833,27 +21822,27 @@ Ss Ss BB Qi -rs +MD DE -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id IB -kx +pU FZ -lj +Kq IC IB lw @@ -21862,11 +21851,11 @@ rN CN vU IB -QB -QB -QB -QB -QB +id +id +id +id +id Ke tq tq @@ -21875,7 +21864,7 @@ tq (105,1,1) = {" tq tq -QB +id tq tq tq @@ -21884,8 +21873,8 @@ tq tq tq Ke -QB -QB +id +id FL Qi yC @@ -21912,21 +21901,21 @@ BB Qi DE DE -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id IB nE ol @@ -21939,10 +21928,10 @@ OB pk tM IB -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -21961,8 +21950,8 @@ tq tq tq Ke -QB -QB +id +id FL kY yC @@ -21988,22 +21977,22 @@ Ss BB Qi DE -mW -FI +Ll +NB aH kU kU kU MB -FI +NB Ko uN -NR -NR +CJ +CJ uN eX -FI -QB +NB +id IB db UA @@ -22016,10 +22005,10 @@ dw cu tM IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22038,7 +22027,7 @@ tq tq tq Ke -QB +id ZA TE Qi @@ -22075,8 +22064,8 @@ JV JV DM Bf -ap -ap +nn +nn Bf Yk zt @@ -22093,10 +22082,10 @@ dw Ki YO IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22113,10 +22102,10 @@ tq tq tq tq -QB +id Ke -QB -QB +id +id FL Qi yC @@ -22170,10 +22159,10 @@ zn Dz tM IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22188,12 +22177,12 @@ tq tq tq tq -QB -QB -QB +id +id +id Ke Ke -QB +id FL Qi yC @@ -22233,10 +22222,10 @@ Se XJ XJ XJ -YG +zs OV Mc -jd +CT kS ch mz @@ -22247,10 +22236,10 @@ Hn kR vO IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22265,12 +22254,12 @@ tq tq tq tq -QB -QB -QB +id +id +id tq Ke -FI +NB WR Co yC @@ -22296,22 +22285,22 @@ Ss BB Qi an -kI -FI +Zj +NB BV -QB -QB -QB -QB -FI +id +id +id +id +NB WX np AA np nr MB -FI -QB +NB +id IB IB IB @@ -22324,10 +22313,10 @@ IB IB IB IB -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22347,8 +22336,8 @@ tq tq tq Ke -QB -QB +id +id oU yC Ss @@ -22374,37 +22363,37 @@ BB Qi DE sS -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke Ke @@ -22424,8 +22413,8 @@ tq tq tq Ke -QB -QB +id +id Zs mk Ss @@ -22451,59 +22440,59 @@ BB Qi Yg sS -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -Ke -Ke -Ke -Ke -Ke -QB -QB -QB -QB -QB -QB -QB -Ke -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +Ke +Ke +Ke +Ke +Ke +id +id +id +id +id +id +id +Ke +id tq "} (113,1,1) = {" tq tq tq -QB -QB +id +id tq tq tq tq tq -QB +id Ke -QB -QB -FI +id +id +NB hb Ss Ss @@ -22528,38 +22517,38 @@ BB eA DW uw -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq tq tq Ke -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id Ke Ke tq @@ -22568,19 +22557,19 @@ tq (114,1,1) = {" tq tq -QB -QB -QB -QB +id +id +id +id tq tq tq tq -QB +id Ke -QB -QB -QB +id +id +id OR Ss Ss @@ -22604,26 +22593,26 @@ Ss iv Wu of -FI -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB -QB +NB +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id +id Ke Ke tq @@ -22632,10 +22621,10 @@ tq tq Ke Ke -QB -QB -QB -QB +id +id +id +id Ke Ke tq @@ -22644,12 +22633,12 @@ tq "} (115,1,1) = {" tq -QB -QB -QB -QB -QB -QB +id +id +id +id +id +id tq tq tq @@ -22657,41 +22646,41 @@ tq Ke Ke Ke -QB -ki -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -uk -xF -QB -QB -QB -QB +id +Qq +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +SS +QO +id +id +id +id Ke Ke Ke Ke Ke -QB -QB -QB -QB +id +id +id +id Ke Ke Ke @@ -22699,7 +22688,7 @@ Ke Ke Ke Ke -QB +id Ke Ke tq @@ -22709,10 +22698,10 @@ tq tq tq Ke -QB -QB -QB -QB +id +id +id +id Ke tq tq @@ -22721,11 +22710,11 @@ tq "} (116,1,1) = {" tq -QB -QB -QB -QB -QB +id +id +id +id +id tq tq tq @@ -22756,7 +22745,7 @@ kU kU kU hK -QB +id Ke Ke Ke @@ -22784,11 +22773,11 @@ tq tq tq tq -QB +id Ke -QB -QB -QB +id +id +id Ke Ke tq @@ -22800,7 +22789,7 @@ tq tq tq tq -QB +id tq tq tq @@ -22812,40 +22801,40 @@ tq tq tq Ke -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn -hn +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk +Hk Ke Ke tq tq tq tq -QB -QB -QB -QB +id +id +id +id tq -QB -QB +id +id tq tq tq @@ -22865,7 +22854,7 @@ tq Ke Ke Ke -QB +id Ke tq tq @@ -22916,12 +22905,12 @@ tq tq tq tq -QB -QB -QB +id +id +id tq tq -QB +id tq tq tq diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm index dc7fd7e0b454..a8413ce407c3 100644 --- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm @@ -950,19 +950,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall/maint) -"dJ" = ( -/obj/effect/decal/cleanable/blood/gibs/body, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "dK" = ( /obj/effect/decal/cleanable/blood/gibs, /obj/structure/cable{ @@ -1324,16 +1311,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/shop) -"eT" = ( -/obj/structure/rack, -/obj/effect/turf_decal/corner/transparent/black/diagonal, -/obj/item/paper{ - name = "Cheap Kalixcian Phrasebook"; - default_raw_text = "Rsku suok sz zalo - My sugarcube is full of eels." - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/spacemall/shop) "eU" = ( /obj/structure/mirror{ pixel_y = -30 @@ -1877,16 +1854,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/ruin/space/has_grav/spacemall/maint) -"hh" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "hj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 6 @@ -2161,6 +2128,16 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall/shop2) +"ii" = ( +/obj/effect/decal/cleanable/blood/gibs/body, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/spacemall/maint) "im" = ( /obj/effect/turf_decal/corner/transparent/red/diagonal, /obj/structure/disposalpipe/junction/yjunction{ @@ -2972,18 +2949,6 @@ "ll" = ( /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall) -"lm" = ( -/obj/machinery/door/window{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/spacemall/shop) "ln" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/thinplating/dark/end{ @@ -3044,6 +3009,15 @@ /obj/structure/table, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall) +"lw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/spacemall/maint) "lx" = ( /obj/effect/turf_decal/corner/transparent/black/diagonal, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -4693,22 +4667,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall) -"rp" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "rq" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -5174,19 +5132,6 @@ }, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/spacemall) -"sZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/spacemall/shop) "td" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -5225,6 +5170,21 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/dorms) +"tj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/spacemall/maint) "tl" = ( /obj/structure/rack, /obj/structure/window/reinforced/spawner, @@ -5929,24 +5889,6 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/spacemall) -"vO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/spacemall/dorms) "vQ" = ( /mob/living/simple_animal/hostile/poison/giant_spider{ environment_smash = 0 @@ -6266,6 +6208,22 @@ /obj/effect/turf_decal/box/white, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/shop) +"xh" = ( +/obj/effect/turf_decal/corner/opaque/blue/half, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/has_grav/spacemall/shop2) "xo" = ( /obj/structure/rack, /obj/effect/turf_decal/siding/thinplating/dark, @@ -6898,21 +6856,6 @@ /obj/effect/decal/cleanable/plasma, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall) -"zA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/spacemall/shop) "zB" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/spider/stickyweb, @@ -7798,25 +7741,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/shop) -"Dd" = ( -/obj/effect/turf_decal/corner/opaque/blue/half, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/spacemall/shop2) "Df" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 @@ -8121,22 +8045,6 @@ }, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/shop) -"Ei" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "Ek" = ( /obj/machinery/camera/autoname{ dir = 6; @@ -9061,6 +8969,16 @@ /obj/effect/turf_decal/corner/transparent/green/diagonal, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/spacemall) +"Ht" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/spacemall/shop) "Hv" = ( /obj/structure/grille, /obj/structure/window/reinforced/fulltile/indestructable, @@ -9245,6 +9163,16 @@ name = "bathroom floor" }, /area/ruin/space/has_grav/spacemall) +"Im" = ( +/obj/structure/rack, +/obj/effect/turf_decal/corner/transparent/black/diagonal, +/obj/item/paper{ + name = "Cheap Kalixcian Phrasebook"; + default_raw_text = "Rsku suok sz zalo - My sugarcube is full of eels." + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/spacemall/shop) "In" = ( /obj/structure/cable{ icon_state = "4-8" @@ -9379,22 +9307,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall/maint) -"IN" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 6 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "IO" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 1 @@ -9774,6 +9686,19 @@ }, /turf/open/floor/plasteel/white, /area/ruin/space/has_grav/spacemall) +"KJ" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 9 + }, +/obj/structure/catwalk/over/plated_catwalk, +/turf/open/floor/plating, +/area/ruin/space/has_grav/spacemall/maint) "KL" = ( /obj/effect/turf_decal/corner/transparent/blue{ dir = 4 @@ -10366,6 +10291,15 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall) +"ME" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/spacemall/shop) "MF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 10 @@ -11034,24 +10968,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall/shop) -"Pc" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "Pe" = ( /obj/structure/cable{ icon_state = "4-8" @@ -11686,6 +11602,21 @@ /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall) +"Rj" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/spacemall/maint) "Rk" = ( /obj/machinery/door/airlock/external/glass, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, @@ -11940,6 +11871,22 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/ruin/space/has_grav/spacemall/maint) +"Ss" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/spacemall) "St" = ( /obj/effect/turf_decal/corner/opaque/blue/three_quarters{ dir = 8 @@ -13241,32 +13188,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /turf/open/floor/plasteel, /area/ruin/space/has_grav/spacemall/dorms) -"Xz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) -"XB" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "XC" = ( /obj/structure/table/reinforced, /turf/open/floor/plasteel, @@ -13497,24 +13418,6 @@ /obj/structure/table, /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/spacemall/shop2) -"Yz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 2 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/spacemall/maint) "YA" = ( /obj/item/storage/toolbox/electrical, /obj/item/stack/sheet/mineral/uranium/five, @@ -14760,7 +14663,7 @@ tZ tZ yt ly -vO +qr fR dn BH @@ -16098,7 +16001,7 @@ QS fi YP zY -Yz +tj zY ED fl @@ -16184,7 +16087,7 @@ Kh Kh Hv bA -IN +vn YI Yo Bg @@ -16287,7 +16190,7 @@ Ge HY Yo PB -rp +KJ Hn Pq ki @@ -16394,11 +16297,11 @@ QL Vy Yo wE -dJ +ii pe he td -sZ +Ht VW hQ RH @@ -16444,11 +16347,11 @@ xZ Vy Yo sL -Xz +lw pe xY Sm -lm +ME LY Ac pe @@ -16466,7 +16369,7 @@ vS Wr xp TZ -Dd +xh Yo ZS Wb @@ -16535,7 +16438,7 @@ Kh qK sy sT -XB +NX NX PM og @@ -16618,7 +16521,7 @@ pQ St nh Yo -Ei +ZS cr Hv Kh @@ -16953,7 +16856,7 @@ nM iT pe UW -AG +Ss kv pU XD @@ -17144,7 +17047,7 @@ FM kj qK aA -Ei +ZS pe zS XC @@ -17199,7 +17102,7 @@ pe cA eW LP -zA +DU kr RG dO @@ -17494,7 +17397,7 @@ cD In Yo Yo -Pc +Rj pe pe pe @@ -17716,7 +17619,7 @@ to OV sp ny -hh +Vt Lt bQ Hv @@ -17747,7 +17650,7 @@ mt ps Wd pe -eT +Im TX LS Qf diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm index d91f8f24b4b6..5b3bedb82a7d 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm @@ -868,15 +868,6 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/plasteel/tech, /area/ruin/wasteplanet/abandoned_mechbay/engineering) -"iG" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 2 - }, -/turf/open/floor/concrete/slab_4, -/area/ruin/wasteplanet/abandoned_mechbay/mainhall) "iR" = ( /obj/effect/turf_decal/trimline/transparent/neutral/filled/warning{ dir = 8 @@ -1196,9 +1187,6 @@ }, /turf/open/floor/concrete/slab_4, /area/ruin/wasteplanet/abandoned_mechbay/mainhall) -"ms" = ( -/turf/closed/mineral/random/wasteplanet, -/area/ruin/wasteplanet/abandoned_mechbay) "mx" = ( /obj/machinery/camera/autoname{ dir = 10 @@ -1359,6 +1347,9 @@ }, /turf/open/floor/concrete/slab_1, /area/ruin/wasteplanet/abandoned_mechbay/mainhall) +"oI" = ( +/turf/closed/mineral/random/wasteplanet, +/area/ruin/wasteplanet/abandoned_mechbay) "oL" = ( /obj/effect/turf_decal/trimline/transparent/neutral/filled/warning{ dir = 4 @@ -2589,9 +2580,6 @@ "DU" = ( /turf/closed/wall/concrete, /area/ruin/wasteplanet/abandoned_mechbay/mechlab) -"DV" = ( -/turf/closed/mineral/random/wasteplanet, -/area/overmap_encounter/planetoid/cave/explored) "DY" = ( /obj/machinery/door/airlock/engineering{ name = "Mech Lab"; @@ -3504,6 +3492,13 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/concrete/slab_1, /area/overmap_encounter/planetoid/cave/explored) +"Pl" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/turf/open/floor/concrete/slab_4, +/area/ruin/wasteplanet/abandoned_mechbay/mainhall) "PF" = ( /obj/effect/turf_decal/trimline/transparent/neutral/filled/warning{ dir = 4 @@ -3892,6 +3887,9 @@ dir = 1 }, /area/ruin/wasteplanet/abandoned_mechbay/bay2) +"Ur" = ( +/turf/closed/mineral/random/wasteplanet, +/area/overmap_encounter/planetoid/cave/explored) "UH" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating/asteroid/wasteplanet, @@ -4317,12 +4315,12 @@ vd vd vd vd -DV +Ur vd -DV +Ur PK -DV -DV +Ur +Ur vd vd vd @@ -4360,19 +4358,19 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur vd vd vd @@ -4408,21 +4406,21 @@ vd vd vd vd -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur vd vd vd @@ -4456,22 +4454,22 @@ vd vd vd vd -DV -DV +Ur +Ur PK -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur PK PK -DV +Ur vd vd vd @@ -4504,24 +4502,24 @@ vd vd vd vd -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur eb -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK -DV -DV +Ur +Ur vd vd PK @@ -4552,30 +4550,30 @@ vd vd vd vd -DV -DV +Ur +Ur PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur eb eb tM Hh eb -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK -DV -DV +Ur +Ur vd -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -4600,13 +4598,13 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur eb tM eb @@ -4616,19 +4614,19 @@ yy yy yy qb -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd vd vd @@ -4648,13 +4646,13 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur eb kJ eb @@ -4665,20 +4663,20 @@ pG aw pG Tb -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur PK -DV +Ur PK -DV +Ur vd vd vd @@ -4695,14 +4693,14 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur eb eb tM @@ -4724,14 +4722,14 @@ dR dR eb eb -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd vd au -ms +oI vd vd vd @@ -4744,13 +4742,13 @@ vd vd vd vd -DV -DV -DV +Ur +Ur +Ur PK -DV -DV -DV +Ur +Ur +Ur tM eb ib @@ -4773,13 +4771,13 @@ DU dR dR eb -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK vd -ms +oI vd vd vd @@ -4793,11 +4791,11 @@ vd vd vd vd -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur eb Hh tM @@ -4822,15 +4820,15 @@ DU DU dR dR -DV -DV +Ur +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd -ms +oI vd vd "} @@ -4841,12 +4839,12 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur tM eb tM @@ -4873,12 +4871,12 @@ TL dR dR PK -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur PK vd vd @@ -4889,12 +4887,12 @@ vd vd vd vd -DV -DV -DV +Ur +Ur +Ur PK -DV -DV +Ur +Ur tM eb kJ @@ -4922,13 +4920,13 @@ uO Hm dR dR -DV -DV -DV +Ur +Ur +Ur PK -DV -DV -DV +Ur +Ur +Ur vd vd "} @@ -4938,12 +4936,12 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur eb eb Og @@ -4973,26 +4971,26 @@ NW dR dR PK -DV -DV -DV -DV -DV -ms -ms +Ur +Ur +Ur +Ur +Ur +oI +oI "} (15,1,1) = {" vd vd vd vd -DV -DV -DV +Ur +Ur +Ur PK -DV -DV -DV +Ur +Ur +Ur eb eb eb @@ -5022,11 +5020,11 @@ Kj Lv dR dR -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd "} @@ -5035,13 +5033,13 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur tM eb eb @@ -5071,11 +5069,11 @@ wq wq wq wq -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK vd "} @@ -5084,13 +5082,13 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur eb eb eb @@ -5120,26 +5118,26 @@ QM lt wq wq -DV +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd "} (18,1,1) = {" vd vd vd -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur PK -DV +Ur eb eb eb @@ -5169,26 +5167,26 @@ kD fY wq wq -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd "} (19,1,1) = {" vd vd -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur tM Hh tM @@ -5218,9 +5216,9 @@ DN IY wq wq -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -5229,14 +5227,14 @@ vd (20,1,1) = {" vd vd -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur tM eb eb @@ -5267,9 +5265,9 @@ DN Jf wq wq -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -5278,13 +5276,13 @@ vd (21,1,1) = {" vd vd -DV +Ur PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur tM eb eb @@ -5316,8 +5314,8 @@ BA pa wq wq -DV -DV +Ur +Ur vd vd vd @@ -5325,16 +5323,16 @@ vd vd "} (22,1,1) = {" -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur eb eb kJ @@ -5365,8 +5363,8 @@ UK wq wq wq -DV -DV +Ur +Ur vd vd vd @@ -5374,16 +5372,16 @@ vd vd "} (23,1,1) = {" -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur eb eb eb @@ -5414,8 +5412,8 @@ HK sG Hj wq -DV -DV +Ur +Ur PK vd vd @@ -5424,14 +5422,14 @@ vd "} (24,1,1) = {" vd -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur Og eb eb @@ -5463,30 +5461,30 @@ eR vj ec wq -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd "} (25,1,1) = {" vd vd -DV +Ur vd vd -DV -DV -DV +Ur +Ur +Ur eb eb Hh eb Og -DV -DV +Ur +Ur KG VG VG @@ -5512,10 +5510,10 @@ WT wq wq wq -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK vd vd @@ -5528,13 +5526,13 @@ vd vd vd vd -DV +Ur xz xz eb eb -DV -DV +Ur +Ur KG KG eA @@ -5549,7 +5547,7 @@ ir DC fd zE -iG +Pl aM iU YX @@ -5561,11 +5559,11 @@ Bw fX wq wq -DV +Ur PK -DV -DV -DV +Ur +Ur +Ur vd vd "} @@ -5579,10 +5577,10 @@ vd vd vd xz -DV -DV -DV -DV +Ur +Ur +Ur +Ur KG KG VG @@ -5610,10 +5608,10 @@ zR Vx wq wq -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd vd vd @@ -5629,8 +5627,8 @@ vd vd vd PK -DV -DV +Ur +Ur KG KG Dk @@ -5659,8 +5657,8 @@ Yf qH wq wq -DV -DV +Ur +Ur PK vd vd @@ -5678,8 +5676,8 @@ vd vd vd vd -DV -DV +Ur +Ur KG VG Om @@ -5708,10 +5706,10 @@ hv tW wq wq -DV -DV +Ur +Ur vd -DV +Ur vd vd vd @@ -5728,7 +5726,7 @@ vd vd vd vd -DV +Ur KG VG VG @@ -5757,8 +5755,8 @@ Ec YP wq wq -DV -DV +Ur +Ur vd vd vd @@ -5777,7 +5775,7 @@ vd vd vd vd -DV +Ur aX nF nF @@ -5806,12 +5804,12 @@ wq wq wq wq -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur vd "} (32,1,1) = {" @@ -5825,7 +5823,7 @@ vd vd vd vd -DV +Ur PK aX nF @@ -5855,10 +5853,10 @@ ET gJ Im Im -DV +Ur PK -DV -DV +Ur +Ur vd vd vd @@ -5872,10 +5870,10 @@ vd vd vd vd -DV -DV +Ur +Ur PK -DV +Ur aX nF JY @@ -5903,10 +5901,10 @@ uQ Vk gJ Im -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK vd vd @@ -5922,9 +5920,9 @@ vd vd vd xz -DV -DV -DV +Ur +Ur +Ur aX nF ey @@ -5952,11 +5950,11 @@ uQ Iq gJ Im -DV +Ur PK -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -6001,10 +5999,10 @@ uQ Iq gJ Im -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd vd vd @@ -6050,9 +6048,9 @@ uQ Hn gJ Im -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -6099,10 +6097,10 @@ Js CM gJ Im -DV -DV +Ur +Ur PK -DV +Ur vd vd vd @@ -6148,11 +6146,11 @@ iB CM gJ Im -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd vd @@ -6197,10 +6195,10 @@ Im Im Im Im -DV -DV -DV -DV +Ur +Ur +Ur +Ur vd vd vd @@ -6216,39 +6214,39 @@ vd vd vd vd -DV -DV -DV +Ur +Ur +Ur uu -DV -DV +Ur +Ur PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur Im Ad Im -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV +Ur vd vd vd @@ -6265,38 +6263,38 @@ vd vd vd vd -DV -DV -DV +Ur +Ur +Ur uu -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur PK -DV +Ur vd -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur Im Im Im PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd vd @@ -6313,38 +6311,38 @@ vd vd vd vd -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV +Ur +Ur +Ur +Ur PK -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur vd vd PK -DV -DV -DV -DV -DV -DV -DV -DV -DV +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur +Ur PK -DV -DV +Ur +Ur vd vd vd @@ -6368,30 +6366,30 @@ vd vd vd vd -DV +Ur vd -DV -DV +Ur +Ur vd -DV -DV -DV +Ur +Ur +Ur PK vd -DV -DV +Ur +Ur vd vd vd PK -DV +Ur vd vd -DV +Ur vd -DV -DV -DV +Ur +Ur +Ur vd vd vd @@ -6418,28 +6416,28 @@ vd vd vd vd -DV +Ur vd vd -DV +Ur vd vd PK -DV +Ur vd vd -DV +Ur vd vd vd vd vd PK -DV +Ur vd vd PK -DV +Ur vd vd vd @@ -6470,7 +6468,7 @@ vd vd vd vd -DV +Ur vd vd vd diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index fa90eedff88a..11542625c870 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,5 +1,5 @@ /// VERY IMPORTANT FOR RUNNING FAST IN PRODUCTION! -/// If you define this flag, more things will init during initializations rather than when they're needed, such as planetoids. +/// If you define this flag, centcom will load. It's also supposed to preload planetoids, but that is disabled. //#define FULL_INIT #ifdef FULL_INIT @@ -8,10 +8,8 @@ #include "map_files\generic\blank.dmm" #endif -#ifndef LOWMEMORYMODE - #ifdef ALL_MAPS - #ifdef CIBUILDING - #include "templates.dm" - #endif +#ifdef ALL_MAPS + #ifdef CIBUILDING + #include "templates.dm" #endif #endif diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/deprecated/Ruins/lavaland_biodome_beach.dmm similarity index 100% rename from _maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm rename to _maps/deprecated/Ruins/lavaland_biodome_beach.dmm diff --git a/_maps/deprecated/Ruins/lavaland_surface_syndicate_base1.dmm b/_maps/deprecated/Ruins/lavaland_surface_syndicate_base1.dmm new file mode 100644 index 000000000000..be604192e5bd --- /dev/null +++ b/_maps/deprecated/Ruins/lavaland_surface_syndicate_base1.dmm @@ -0,0 +1,9168 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"ac" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"af" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ag" = ( +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -25 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ah" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 1 + }, +/obj/structure/sign/barsign{ + pixel_y = -32; + req_access = null + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ai" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/medical/syndicate_access, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ak" = ( +/obj/machinery/vending/boozeomat/syndicate_access, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/bar) +"al" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/medical/syndicate_access, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ap" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aq" = ( +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"as" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"at" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/poddoor{ + id = "lavalandsyndi_chemistry" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aL" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"aM" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/fullupgrade, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"aN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "150"; + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"aR" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"aW" = ( +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "lavalandsyndi_arrivals"; + name = "Arrivals Blast Door Control"; + pixel_y = -26; + req_access_txt = "150" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"bd" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"bf" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"bv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"by" = ( +/obj/structure/closet/l3closet, +/obj/machinery/power/apc/syndicate{ + dir = 8; + name = "Chemistry APC"; + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"bM" = ( +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_syndicatelava{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ca" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"cA" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/chemistry, +/obj/item/book/manual/wiki/chemistry, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"cG" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/machinery/chem_master, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"cI" = ( +/obj/machinery/power/apc/syndicate{ + name = "Experimentation Lab APC"; + pixel_y = -25 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"cJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + name = "CO2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cK" = ( +/obj/machinery/power/compressor{ + comp_id = "syndie_lavaland_incineratorturbine"; + dir = 1; + luminosity = 2 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cN" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi_bar"; + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"cP" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/plasma, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"cU" = ( +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Virology APC"; + pixel_y = 25 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"cV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dc" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"di" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dn" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"do" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/beakers/bluespace, +/obj/item/storage/box/beakers/bluespace, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"du" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/button/door{ + id = "lavalandsyndi_chemistry"; + name = "Chemistry Blast Door Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dv" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/chem_heater, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dw" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dx" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 6 + }, +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dy" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dE" = ( +/obj/structure/table/glass, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_y = 2 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5; + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bottle/charcoal{ + pixel_x = 6 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dG" = ( +/obj/structure/catwalk, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"dI" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dK" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/structure/closet/crate/secure/gear{ + req_access_txt = "150" + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/storage/belt/military, +/obj/item/storage/belt/military, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/glasses/night, +/obj/item/clothing/glasses/night, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dL" = ( +/obj/machinery/airalarm/syndicate{ + pixel_y = 25 + }, +/obj/structure/closet/crate, +/obj/item/extinguisher{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/extinguisher{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/extinguisher{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/flashlight{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/radio/headset/syndicate/alt, +/obj/item/radio/headset/syndicate/alt{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dM" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 4 + }, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "150"; + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/industrial/hatch/yellow, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"dP" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"dQ" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + heat_proof = 1; + name = "Experimentation Room"; + req_access_txt = "150" + }, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dS" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"dU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dY" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"dZ" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 25 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/screwdriver/nuke{ + pixel_y = 18 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ea" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/structure/closet/crate/secure/weapon{ + req_access_txt = "150" + }, +/obj/item/ammo_box/c10mm{ + pixel_y = 6 + }, +/obj/item/ammo_box/c10mm, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = -5; + pixel_y = 5 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/ammo_box/magazine/m10mm{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eb" = ( +/obj/structure/closet/crate, +/obj/item/storage/toolbox/electrical{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ec" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/structure/closet/crate/medical, +/obj/item/storage/firstaid/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/brute, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ed" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/rad_collector, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ee" = ( +/obj/structure/rack, +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/flashlight, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eg" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eh" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ei" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ej" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"ek" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"el" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"em" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/button/door{ + id = "lavalandsyndi"; + name = "Syndicate Experimentation Lockdown Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"en" = ( +/obj/machinery/igniter/incinerator_syndicatelava, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"eo" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/paper/crumpled{ + info = "Explosive testing on site is STRICTLY forbidden, as this outpost's walls are lined with explosives intended for intentional self-destruct purposes that may be set off prematurely through careless experiments."; + name = "Explosives Testing Warning"; + pixel_x = -6; + pixel_y = -3 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"ep" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eq" = ( +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs, +/obj/item/taperecorder, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"es" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"et" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eu" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 5 + }, +/obj/machinery/chem_heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ev" = ( +/obj/effect/turf_decal/corner/opaque/white, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"ew" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/syndichem, +/obj/effect/turf_decal/corner/opaque/white/three_quarters, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eE" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/box/lights/bulbs, +/obj/item/wrench, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eG" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eH" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eI" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eJ" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"eK" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eL" = ( +/obj/machinery/door/airlock/hatch{ + name = "Monkey Pen"; + req_access_txt = "150"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eQ" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/item/storage/box/monkeycubes/syndicate, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"eS" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/chem_master, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eT" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/structure/chair/office/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eU" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_dispenser/fullupgrade, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white/three_quarters, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"eX" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/oxygen/yellow, +/obj/item/tank/internals/oxygen/yellow, +/obj/item/tank/internals/oxygen/yellow, +/obj/item/tank/internals/emergency_oxygen/double, +/obj/item/tank/internals/emergency_oxygen/double, +/obj/item/tank/internals/emergency_oxygen/double, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eY" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"eZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/rad_collector, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fa" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fe" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/turf/open/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ff" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fj" = ( +/obj/structure/table/glass, +/obj/structure/reagent_dispensers/virusfood{ + pixel_y = 28 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fn" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fo" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Chemistry" + }, +/obj/machinery/door/window/southleft{ + dir = 1; + name = "Chemistry"; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fp" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"fq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/assist, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fs" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/storage/box/stockparts/deluxe, +/obj/item/storage/box/stockparts/deluxe, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/circuitboard/machine/processor, +/obj/item/circuitboard/machine/gibber, +/obj/item/circuitboard/machine/deep_fryer, +/obj/item/circuitboard/machine/cell_charger, +/obj/item/circuitboard/machine/smoke_machine, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ft" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/structure/closet/crate, +/obj/item/reagent_containers/food/drinks/waterbottle/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/waterbottle/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/reagent_containers/food/drinks/waterbottle/large{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fu" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -25 + }, +/obj/structure/table, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fw" = ( +/obj/effect/turf_decal/industrial/warning/corner, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fx" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"fy" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fz" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fB" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fC" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fD" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/virology) +"fE" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/structure/closet/l3closet, +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/syndicate{ + pixel_y = 25 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fF" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/shower{ + pixel_y = 14 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"fM" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"fO" = ( +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gb" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gc" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gd" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150"; + dir = 8 + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gf" = ( +/obj/structure/sign/warning/vacuum{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gg" = ( +/obj/structure/sign/warning/fire{ + pixel_y = 32 + }, +/obj/structure/sign/warning/xeno_mining{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gh" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + req_access_txt = "150"; + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gj" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"gp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gq" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gD" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"gM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gO" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gP" = ( +/obj/machinery/photocopier, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gS" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/button/door{ + id = "lavalandsyndi_cargo"; + name = "Cargo Bay Blast Door Control"; + pixel_x = 26; + req_access_txt = "150" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"gT" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Monkey Pen"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gU" = ( +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -25 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gV" = ( +/obj/structure/chair/office/light, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"gY" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "lavaland_syndie_virology_interior"; + idSelf = "lavaland_syndie_virology_control"; + name = "Virology Access Button"; + pixel_x = -25; + pixel_y = 8; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"gZ" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ha" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"hb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red/three_quarters{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hd" = ( +/obj/effect/turf_decal/corner/opaque/red, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"he" = ( +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hg" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hh" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hi" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hj" = ( +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hl" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hn" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"ho" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/computer/helm, +/turf/open/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 4 + }, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hr" = ( +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 8 + }, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hs" = ( +/obj/machinery/computer/pandemic, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door{ + id = "lavalandsyndi_virology"; + name = "Virology Blast Door Control"; + pixel_x = -26; + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"ht" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/hand_labeler, +/obj/item/pen/red, +/obj/item/restraints/handcuffs, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hu" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma{ + amount = 5 + }, +/obj/item/stack/sheet/mineral/uranium{ + amount = 10 + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 10 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hv" = ( +/obj/machinery/disposal/bin, +/obj/structure/sign/warning/deathsposal{ + pixel_x = 32 + }, +/obj/effect/turf_decal/industrial/fire/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hw" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hy" = ( +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hz" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hA" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hB" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Bay"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hD" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hE" = ( +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 1 + }, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hF" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white/three_quarters, +/mob/living/carbon/monkey{ + faction = list("neutral","Syndicate") + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hH" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi_virology" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/virology) +"hI" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hK" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/fire{ + pixel_x = 32 + }, +/obj/structure/closet/emcloset/anchored, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/flashlight/seclite, +/obj/item/clothing/mask/gas, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hM" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hN" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hO" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hP" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hQ" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"hR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"hS" = ( +/obj/structure/table/reinforced, +/obj/item/folder, +/obj/item/suppressor, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/ears/earmuffs, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hT" = ( +/obj/machinery/vending/toyliberationstation{ + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hU" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/obj/structure/tank_dispenser/plasma, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hV" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"hW" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 10 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"hX" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"hY" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"ia" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ib" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ic" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"id" = ( +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ie" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate/comms{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"if" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ig" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 9 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"ih" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"ii" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ik" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"il" = ( +/obj/machinery/door/airlock{ + name = "Cabin 2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"im" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"in" = ( +/obj/machinery/door/airlock{ + name = "Cabin 4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ip" = ( +/obj/effect/turf_decal/industrial/fire/corner, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iq" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"ir" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/fire{ + dir = 9 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/machinery/turretid{ + ailock = 1; + control_area = "/area/ruin/unpowered/syndicate_lava_base/main"; + dir = 1; + icon_state = "control_kill"; + lethal = 1; + name = "Base turret controls"; + pixel_y = 30; + req_access = null; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"is" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/circuit/red, +/area/ruin/unpowered/syndicate_lava_base/main) +"it" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/fire{ + dir = 5 + }, +/obj/structure/filingcabinet, +/obj/item/folder/syndicate/mining, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"iu" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"iv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"iy" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories"; + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iz" = ( +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iB" = ( +/obj/machinery/airalarm/syndicate{ + pixel_y = 25 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iF" = ( +/obj/machinery/washing_machine, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iH" = ( +/obj/effect/turf_decal/industrial/fire{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/caution/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iI" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault{ + id_tag = "syndie_lavaland_vault"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"iJ" = ( +/turf/open/floor/circuit/red, +/area/ruin/unpowered/syndicate_lava_base/main) +"iK" = ( +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered/syndicate_lava_base/main) +"iM" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"iN" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/main) +"iO" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"iW" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"iY" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"ja" = ( +/obj/effect/turf_decal/industrial/fire/corner{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "syndie_lavaland_vault"; + name = "Vault Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 25; + pixel_y = 8; + req_access_txt = "150"; + specialfunctions = 4; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/fire{ + dir = 10 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"jc" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit/red, +/area/ruin/unpowered/syndicate_lava_base/main) +"jd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/fire{ + dir = 6 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/main) +"je" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"jf" = ( +/obj/machinery/door/airlock{ + name = "Cabin 1" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jh" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jj" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jk" = ( +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"jl" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jn" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jq" = ( +/obj/effect/mob_spawn/human/lavaland_syndicate{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jr" = ( +/obj/machinery/vending/snack/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ju" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jv" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jw" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/toolcloset{ + anchored = 1 + }, +/obj/item/crowbar, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jx" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi_bar" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jy" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jz" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jA" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/ammo_box/magazine/sniper_rounds, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jB" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jC" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"jD" = ( +/obj/machinery/vending/cola/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jK" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id = "lavalandsyndi_cargo"; + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"jL" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/lighter{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = -3 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jM" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "lavalandsyndi_bar"; + name = "Bar Blast Door Control"; + pixel_y = 26; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jN" = ( +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jP" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jR" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"jT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/engineering, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"jU" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/shower{ + desc = "The HS-452. Installed recently by the DonkCo Hygiene Division."; + dir = 4; + name = "emergency shower" + }, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/radiation/rad_area{ + pixel_y = -32 + }, +/obj/effect/turf_decal/industrial/warning, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"jY" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"jZ" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ka" = ( +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kb" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/box/lights/bulbs, +/obj/item/stack/rods{ + amount = 50 + }, +/obj/item/clothing/head/welding, +/obj/item/stock_parts/cell/high/plus, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ko" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kq" = ( +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 25 + }, +/obj/machinery/vending/coffee{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ks" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"ku" = ( +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kw" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/combat{ + pixel_y = -6 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/clothing/mask/breath{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"kC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kD" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + frequency = 1442; + id_tag = "syndie_lavaland_co2_out"; + internal_pressure_bound = 5066; + name = "CO2 out" + }, +/turf/open/floor/engine/co2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kF" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/n2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kG" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kH" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kJ" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kK" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kM" = ( +/obj/machinery/vending/cigarette{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"kP" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/obj/item/soap/syndie, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"kQ" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kS" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kT" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"kU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kV" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/power/smes/engineering, +/obj/structure/sign/warning/electricshock{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kW" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/machinery/power/smes/engineering, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kY" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"kZ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"la" = ( +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 6; + name = "N2 to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lb" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 8; + frequency = 1442; + id_tag = "syndie_lavaland_n2_out"; + internal_pressure_bound = 5066; + name = "Nitrogen Out" + }, +/turf/open/floor/engine/n2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ld" = ( +/turf/open/floor/engine/co2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"le" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"lf" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lg" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lh" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"li" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = -6; + pixel_y = 6 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lj" = ( +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lk" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 30 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lm" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ln" = ( +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lo" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table, +/obj/item/storage/firstaid/fire, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ls" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lt" = ( +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + name = "O2 to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lu" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 9; + name = "N2 to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lv" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"lw" = ( +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plating{ + baseturfs = /turf/open/lava/smooth/lava_land_surface; + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"lx" = ( +/obj/structure/bookcase/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"ly" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lz" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/rag{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lA" = ( +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lC" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/obj/item/kitchen/rollingpin, +/obj/item/kitchen/knife{ + pixel_x = 6 + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lG" = ( +/obj/structure/table, +/obj/item/storage/box/syringes, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/gun/syringe/syndicate, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lI" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lK" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"lL" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 30 + }, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/welding, +/obj/item/weldingtool/largetank, +/obj/item/analyzer, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lP" = ( +/obj/effect/turf_decal/corner/opaque/blue, +/obj/effect/turf_decal/corner/opaque/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lQ" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/o2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lR" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/o2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"lS" = ( +/obj/machinery/porta_turret/syndicate{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"lT" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"lU" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lV" = ( +/obj/structure/chair/stool/bar, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"lZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"md" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"me" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mf" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mg" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/effect/decal/cleanable/dirt, +/obj/item/pipe_dispenser{ + pixel_y = 12 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mi" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "O2 to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mk" = ( +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + name = "O2 to Mix" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ml" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/blue, +/obj/effect/turf_decal/corner/opaque/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4; + name = "O2 Layer Manifold" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 8; + frequency = 1442; + id_tag = "syndie_lavaland_o2_out"; + internal_pressure_bound = 5066; + name = "Oxygen Out" + }, +/turf/open/floor/engine/o2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mn" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mo" = ( +/turf/closed/wall/mineral/plastitanium/explosive, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mp" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi_telecomms" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mq" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mr" = ( +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ms" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/sign/warning/fire{ + pixel_x = 32 + }, +/obj/structure/closet/emcloset/anchored, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/flashlight/seclite, +/obj/item/clothing/mask/gas, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mt" = ( +/obj/machinery/computer/arcade/orion_trail, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mu" = ( +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mv" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/obj/machinery/power/apc/syndicate{ + name = "Bar APC"; + pixel_y = -25 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mw" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mx" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"my" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mA" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood/OMinus, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mE" = ( +/obj/structure/table/reinforced, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 9 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"mF" = ( +/obj/machinery/atmospherics/components/unary/portables_connector, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mH" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mI" = ( +/obj/effect/turf_decal/industrial/warning/corner, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Plasma to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mJ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10; + name = "Plasma to Mix" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"mM" = ( +/turf/open/floor/circuit/green, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mN" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mP" = ( +/obj/structure/filingcabinet/security, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mQ" = ( +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mR" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/multitool, +/obj/machinery/button/door{ + id = "lavalandsyndi_telecomms"; + name = "Telecomms Blast Door Control"; + pixel_x = 26; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"mS" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mT" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mU" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"mX" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"mZ" = ( +/obj/machinery/sleeper/syndie{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"na" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nb" = ( +/obj/structure/table/optable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nc" = ( +/obj/machinery/atmospherics/pipe/simple/yellow, +/obj/machinery/computer/turbine_computer{ + dir = 1; + id = "syndie_lavaland_incineratorturbine" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ne" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_syndicatelava{ + pixel_x = -8; + pixel_y = -26 + }, +/obj/machinery/button/ignition/incinerator/syndicatelava{ + pixel_x = 6; + pixel_y = -25; + dir = 1 + }, +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/incinerator_vent_syndicatelava_aux{ + pixel_x = 22; + pixel_y = -8; + dir = 8 + }, +/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ + pixel_x = 22; + pixel_y = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nf" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ng" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5; + name = "Plasma to Mix" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nh" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ni" = ( +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nj" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications Control"; + req_access_txt = "150"; + dir = 8 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nm" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 27 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nn" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"no" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"np" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nq" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nv" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nB" = ( +/obj/structure/table/reinforced, +/obj/item/surgicaldrill, +/obj/item/cautery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nC" = ( +/obj/structure/table/reinforced, +/obj/item/retractor, +/obj/item/hemostat, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"nE" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"nH" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nI" = ( +/obj/machinery/computer/camera_advanced, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nJ" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"nW" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nX" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"nZ" = ( +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oa" = ( +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ob" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"oc" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/power/apc/syndicate{ + dir = 4; + name = "Medbay APC"; + pixel_x = 25 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"od" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/layer_manifold{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"of" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/binary/pump/on{ + target_pressure = 4500 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 8 + }, +/obj/machinery/airlock_sensor/incinerator_syndicatelava{ + pixel_x = 22 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"og" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oh" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"oi" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"oj" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/directional/north{ + freerange = 1; + name = "Syndicate Radio Intercom" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ok" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/power/apc/syndicate{ + name = "Telecommunications APC"; + pixel_y = -25 + }, +/obj/structure/cable, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ol" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/structure/rack{ + dir = 8 + }, +/obj/item/clothing/suit/space/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/head/helmet/space/syndicate, +/obj/item/mining_scanner, +/obj/item/pickaxe, +/turf/open/floor/mineral/plastitanium, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"on" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oo" = ( +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"op" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"or" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/belt/medical, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"ou" = ( +/obj/machinery/computer/message_monitor{ + dir = 1 + }, +/obj/item/paper/monitorkey, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ov" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"ox" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor{ + id = "lavalandsyndi_arrivals" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos{ + dir = 1; + id = "syndie_lavaland_inc_in" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oC" = ( +/obj/machinery/door/poddoor/incinerator_syndicatelava_aux, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oD" = ( +/obj/structure/sign/warning/xeno_mining{ + pixel_x = -32 + }, +/obj/structure/sign/warning/fire{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oF" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oG" = ( +/obj/machinery/power/turbine{ + luminosity = 2 + }, +/obj/structure/cable, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oH" = ( +/obj/machinery/door/poddoor/incinerator_syndicatelava_main, +/turf/open/floor/engine/vacuum, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"oI" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"oL" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"oO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/virology{ + frequency = 1449; + id_tag = "lavaland_syndie_virology_exterior"; + name = "Virology Lab Exterior Airlock"; + req_access_txt = "150"; + dir = 4 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "lavaland_syndie_virology_exterior"; + idSelf = "lavaland_syndie_virology_control"; + name = "Virology Access Button"; + pixel_y = -25; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"oP" = ( +/obj/structure/sign/departments/chemistry, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"pD" = ( +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "lavaland_syndie_virology_exterior"; + idInterior = "lavaland_syndie_virology_interior"; + idSelf = "lavaland_syndie_virology_control"; + name = "Virology Access Console"; + pixel_x = 25; + pixel_y = -5; + req_access_txt = "150" + }, +/obj/effect/turf_decal/industrial/caution/red{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"pJ" = ( +/turf/open/floor/engine/n2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"pQ" = ( +/obj/structure/sign/warning/explosives/alt{ + pixel_x = 32 + }, +/turf/open/floor/circuit/red, +/area/ruin/unpowered/syndicate_lava_base/main) +"pY" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 5 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"qC" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"qG" = ( +/obj/structure/sign/warning/explosives/alt{ + pixel_x = -32 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"qJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"qL" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"rc" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"rg" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/plasma, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"rF" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"rL" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"rO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"sk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay"; + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"so" = ( +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Engineering APC"; + pixel_y = 25 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ta" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 8; + frequency = 1442; + id_tag = "syndie_lavaland_o2_out"; + internal_pressure_bound = 5066; + name = "Plasma Out" + }, +/turf/open/floor/engine/plasma, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"th" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"tq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"tu" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"tM" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"tW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"uB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"uW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"vd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"vu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"vx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"vz" = ( +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"vD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/hatch{ + name = "Experimentation Lab"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"vE" = ( +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -25 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"vX" = ( +/obj/machinery/atmospherics/pipe/simple/orange{ + dir = 8 + }, +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"wi" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8; + volume_rate = 200 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"wA" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"xm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 9 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"xJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"xK" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ye" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"yg" = ( +/turf/open/floor/engine/o2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ys" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/corner/opaque/white, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"yH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"zq" = ( +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ + req_access = null + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"zK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"zM" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"zX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + dir = 6; + pixel_x = 23; + pixel_y = -23 + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"Av" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"AS" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Bd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Bk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Bl" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/corner/opaque/white, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"Bp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Bz" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"BC" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/co2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"BF" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi"; + name = "Syndicate Research Experimentation Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"BG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"BP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Cg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Cx" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"CC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Dormitories"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"CG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Db" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"DC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Chemistry Lab"; + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"DF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"DL" = ( +/obj/structure/sign/warning/explosives/alt{ + pixel_x = 32 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Ec" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Ed" = ( +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Ep" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"ED" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + frequency = 1449; + id_tag = "lavaland_syndie_virology_interior"; + name = "Virology Lab Interior Airlock"; + req_access_txt = "150"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/virology) +"EN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"EZ" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Fk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Fy" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Fz" = ( +/obj/machinery/door/airlock/maintenance{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"FJ" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"Gq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"Hu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"HG" = ( +/obj/effect/turf_decal/industrial/hatch/yellow, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_access_txt = "150" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"HX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + name = "CO2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"IH" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating/airless, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"II" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"IJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 1 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"IX" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Je" = ( +/obj/docking_port/stationary{ + dir = 4; + height = 15; + dwidth = 8; + width = 15 + }, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) +"JB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4; + name = "Plasma Layer Manifold" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Kx" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"KZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay"; + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/ruin/unpowered/syndicate_lava_base/medbay) +"La" = ( +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/stack/wrapping_paper{ + pixel_y = 5 + }, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Lg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Lp" = ( +/obj/machinery/atmospherics/pipe/simple/yellow, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Ls" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Lz" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/computer/monitor/secret{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"LG" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"LQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"LR" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Mf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Mg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"Mo" = ( +/obj/machinery/power/apc/syndicate{ + dir = 8; + name = "Primary Hallway APC"; + pixel_x = -25 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"MG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Ng" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Nj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/visible, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Nm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/power/apc/syndicate{ + name = "Dormitories APC"; + pixel_y = -25 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"Nw" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"NB" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"NL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"NU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Ov" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Pf" = ( +/obj/effect/turf_decal/industrial/warning/corner, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Pi" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Pk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/mining/glass{ + name = "Warehouse"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Qc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Qh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Qr" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "150" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Qv" = ( +/obj/structure/closet/firecloset/full{ + anchored = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"QN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"Ro" = ( +/obj/structure/grille, +/obj/structure/window/plasma/reinforced/plastitanium, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "lavalandsyndi_bar"; + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Rq" = ( +/turf/open/floor/engine/plasma, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"RE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"RK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"RM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"RV" = ( +/obj/structure/sign/warning/fire, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Sb" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/dormitories) +"St" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + req_access_txt = "150" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"SA" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/closet/crate, +/obj/item/vending_refill/snack{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/vending_refill/snack{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/vending_refill/coffee, +/obj/item/vending_refill/cola, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/bar) +"SE" = ( +/obj/effect/turf_decal/industrial/warning, +/obj/effect/turf_decal/industrial/stand_clear{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"SX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Td" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/corner/transparent/neutral/full, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"Tp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"TC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/ruin/unpowered/syndicate_lava_base/testlab) +"TG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"TV" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"Ub" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Uc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/wood, +/area/ruin/unpowered/syndicate_lava_base/bar) +"Us" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"UX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Vb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Ve" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"VE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/unpowered/syndicate_lava_base/main) +"WD" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/pump, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"WE" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications"; + req_access_txt = "150"; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/corner/transparent/neutral, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ruin/unpowered/syndicate_lava_base/telecomms) +"Xd" = ( +/obj/structure/closet/radiation, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Xg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/corner/opaque/white/three_quarters, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"XI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/virology) +"XR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Ya" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Yd" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/corner/opaque/white{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/chemistry) +"Ym" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Cargo Bay APC"; + pixel_y = 25 + }, +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/cargo) +"Yz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/main) +"Zj" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 6 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"Zo" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/main) +"Zv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/syndicate{ + dir = 1; + name = "Arrival Hallway APC"; + pixel_y = 25 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/red{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/ruin/unpowered/syndicate_lava_base/arrivals) +"ZN" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/engine/co2, +/area/ruin/unpowered/syndicate_lava_base/engineering) +"ZU" = ( +/obj/machinery/meter/turf, +/turf/open/floor/engine/n2, +/area/ruin/unpowered/syndicate_lava_base/engineering) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(4,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mn +mn +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(5,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mn +mM +nh +mM +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mM +mM +ni +mM +mM +mn +ab +ab +ab +ab +ab +ab +aa +aa +"} +(7,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eh +eh +eh +eh +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mn +mn +mN +nj +mn +mn +mn +ab +ab +ab +ab +ab +ab +ab +aa +"} +(8,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +tM +ff +eI +aj +eh +eh +eh +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mP +ni +nH +oh +mn +mn +ab +ab +ab +ab +ab +ab +aa +"} +(9,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eH +Xg +fy +gp +eI +hp +hE +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mP +nk +nI +oi +ou +mn +ab +ab +ab +ab +ab +ab +ab +"} +(10,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +eI +eI +eI +gq +gT +hq +hF +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mQ +nl +nJ +oj +ov +mn +ab +ab +ab +ab +ab +ab +ab +"} +(11,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +eG +fh +eI +gr +eI +hr +hG +eh +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +mp +mR +nm +yH +ok +mn +mn +ab +ab +ab +ab +ab +ab +ab +"} +(12,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eH +fg +fz +gs +eh +gj +eh +eh +ab +ab +ab +ab +ab +ab +dG +dG +dG +dG +dG +dG +lS +mn +mn +mo +WE +mn +mn +ab +ab +ab +ab +ab +ab +ab +ab +"} +(13,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +eh +eh +eI +eI +gt +gU +hs +hH +ab +ab +ab +ab +ab +ab +dG +dG +ig +iu +iu +iu +lv +lT +mq +mS +nn +Db +mT +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(14,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ac +eh +cU +FJ +XI +gV +ht +hH +ab +ab +ab +ab +ab +dG +dG +ig +je +iv +jk +le +lw +lT +mr +mS +nn +EN +ol +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(15,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ei +eJ +fj +fB +TV +gW +hu +hH +ab +ab +ab +ab +dG +dG +ig +je +jk +jx +cN +jy +jy +jy +ms +mT +no +EN +ol +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(16,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ac +ab +ac +ac +ae +ae +ae +ae +fC +zX +pD +hv +hH +ab +ab +ab +dG +dG +ig +je +jk +jx +Ro +kG +lf +lx +jy +jy +jy +np +Pf +mT +mT +mT +oF +ab +ab +ab +ab +ab +ab +"} +(17,1,1) = {" +ab +ab +ab +ab +ab +ae +ae +ae +ae +ae +ae +ae +ej +eK +ae +fD +ED +eh +eh +eh +hW +dG +dG +dG +ig +je +iv +jx +Ro +kn +kH +jN +jZ +lU +mt +mU +np +SE +EZ +oI +oD +St +ab +ab +ab +ab +ab +aa +"} +(18,1,1) = {" +ab +ab +ab +ab +ae +ae +aq +aq +qG +dc +aq +dQ +ek +eL +ae +fE +Bz +gY +hw +hI +hX +ig +iu +iu +je +jk +jx +cN +jN +jZ +jN +jZ +jN +jZ +kn +mU +nq +LR +mT +mT +mT +oF +ab +ab +ab +ab +ab +aa +"} +(19,1,1) = {" +ab +ab +ab +ab +ae +ap +aq +Lg +aq +Lg +aq +dR +el +rO +ae +fF +LG +gZ +hw +hJ +hY +ih +iv +iM +iv +iv +jx +jL +jY +jN +kI +lg +ly +lV +mu +mU +nr +Mf +om +mT +ab +ab +ab +ab +ab +ab +aa +aa +"} +(20,1,1) = {" +aa +ab +ab +ab +ae +aq +aq +aF +aq +aF +aq +ae +em +eN +ae +ae +oO +ha +ha +hK +ha +ha +ha +ha +ha +ha +jP +jM +jN +jZ +kJ +lh +lz +oL +mv +jy +jy +NU +on +mT +ab +ab +ab +ab +ab +ab +ab +aa +"} +(21,1,1) = {" +aa +ab +ab +ab +ae +aq +aq +Tp +aq +Cg +aq +dS +eo +eO +cI +ae +vd +hb +ha +iN +ha +ii +AS +iO +hB +jl +jz +jN +jZ +ko +kK +li +lA +Qc +mw +ah +jy +QN +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(22,1,1) = {" +aa +ab +ab +ab +ae +ap +aq +CG +vu +TC +LQ +BF +ep +eP +Td +vD +Zo +Av +vE +zM +Ub +lZ +tq +Us +hd +jm +jz +fM +jN +kp +kL +lj +lB +th +lA +ai +jP +Fk +op +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(23,1,1) = {" +aa +ab +ab +ab +ae +ae +aq +aq +DL +di +aq +dS +eq +eQ +ae +dQ +tu +hd +hy +hy +ia +ik +if +ca +hz +hz +jy +jy +ka +kq +kM +lk +lC +Uc +mx +jy +jy +xK +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(24,1,1) = {" +aa +ab +ab +ab +ab +ae +ae +ae +ae +ae +aL +ae +ae +ae +oP +fH +Bk +he +hz +hz +hz +hz +iy +CC +hz +jn +jA +jy +jy +jy +jy +jy +ak +aN +jy +jy +qL +II +oo +ox +ab +ab +ab +ab +ab +ab +ab +ab +"} +(25,1,1) = {" +aa +ab +ab +ab +ab +ab +ac +ac +as +do +by +xm +Yd +Mg +DC +UX +zK +he +hz +hM +ib +hz +iz +Sb +jf +jo +jB +hz +kb +jy +kN +jZ +lE +xJ +my +jy +Zv +nW +aW +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(26,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +as +as +du +dB +dU +es +eS +fn +fO +Bk +hf +hz +hN +ic +il +iA +gD +hz +hz +hz +hz +Yz +Qr +Qh +Ov +SA +zq +jy +jy +QN +nX +oo +mT +ab +ab +ab +ab +ab +ab +ab +ab +"} +(27,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +at +aM +dv +dC +dV +et +eT +fo +fO +Bk +hg +hz +hz +hz +hz +iB +rL +Cx +Bd +Bd +Vb +bf +jy +jy +jy +jy +jy +jy +mX +vz +aQ +mT +mT +ab +ab +ab +ab +ab +ab +ab +aa +"} +(28,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +at +cA +dw +dC +dX +eu +eU +fn +fH +Bk +he +hA +hz +id +im +iC +Nm +hz +hz +hz +hz +Bp +Vb +Vb +Vb +Bd +Bd +IX +uW +ys +nZ +mT +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(29,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +at +cG +dx +dE +dY +ev +eV +fp +fH +ca +he +hz +hz +hz +hz +rc +iW +jh +jo +jC +hz +MG +ks +kP +kQ +kQ +kQ +kQ +kT +KZ +sk +kQ +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(30,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +as +as +as +dI +dZ +ew +as +as +as +Ep +hh +hz +hP +ic +in +iE +iX +hz +jq +jA +hz +BG +kt +kQ +kQ +lG +md +mA +mZ +vx +oa +or +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(31,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ac +as +as +as +as +as +fq +dy +qC +he +hz +hQ +ie +hz +iF +iY +hz +hO +hz +hz +Fz +ha +kQ +lm +lH +me +mB +na +Gq +ob +al +kQ +ab +ab +ab +ab +ab +ab +ab +ab +"} +(32,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ac +dy +dK +ea +Ls +NL +Hu +Pi +fm +he +hz +hz +hz +hz +hz +hz +hz +jr +jD +jR +ca +ku +kR +ln +lI +lI +mC +lI +Bl +oc +kQ +kQ +ac +ab +ab +ab +ab +ab +ab +ab +"} +(33,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +dy +dL +eb +qJ +eX +fs +fa +gM +hi +hB +hB +hB +ag +iG +SX +Mo +BP +wA +Ya +RM +kv +kS +ln +lJ +mf +mD +lI +nB +kQ +kQ +ac +ab +ab +ab +ab +ab +ab +ab +ab +"} +(34,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +dy +dM +ec +bv +eY +ft +dP +gN +hj +hj +hR +af +ip +iH +ja +jj +jj +ca +Qv +kj +kw +kT +lo +lK +kQ +mE +nb +nC +kQ +ac +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(35,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +dy +dy +ed +Dk +eZ +dy +dy +gO +hk +hC +dy +ha +iq +iI +iq +ha +ha +dO +jT +ju +gn +IJ +IJ +IJ +kU +IJ +IJ +IJ +uB +ju +ju +ju +ab +ab +ab +ab +ab +ab +ab +"} +(36,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ac +dy +dy +Pk +fa +dy +La +gP +gQ +hl +hS +ha +ir +iJ +jb +ha +Xd +ye +jU +ju +Lz +kV +Ve +lL +mg +mF +nc +Lp +od +Lp +oz +ju +ju +nf +ab +ab +ab +ab +aa +"} +(37,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +ee +cV +fb +fu +gb +gQ +hl +gQ +hT +ha +is +iK +jc +ha +jv +dn +jV +ju +Kx +kW +Zj +WD +bd +XR +Nw +Fy +bM +NB +en +cK +oG +oH +ab +ab +ab +ab +ab +"} +(38,1,1) = {" +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +Ym +VE +fc +fv +fv +gR +gQ +hl +hU +ha +it +pQ +jd +ha +jw +pY +nv +HG +Nj +kX +lr +lN +mi +mH +ne +nE +of +nE +oB +ju +ju +nf +ab +ab +ab +ab +ab +"} +(39,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +eg +eD +fd +fw +gc +gS +hn +gQ +hV +ha +Wt +DF +DF +DF +kl +kl +kl +kl +so +kY +ls +lO +mj +mI +RV +tW +RE +ju +oC +nf +ab +ab +ab +ab +ab +ab +ab +"} +(40,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +dy +eE +fe +dy +gd +dy +ho +hD +dy +dy +wi +ac +ac +ju +ld +kE +rF +HX +cJ +kZ +Ng +lt +mk +mJ +ng +TG +Ec +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(41,1,1) = {" +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +jK +jK +dy +gf +dy +jK +jK +dy +ab +ab +ab +ab +ju +ZN +BC +IH +Ed +kC +la +lu +lP +ml +mK +JB +RK +og +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +"} +(42,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +dy +gg +dy +ab +ab +ab +ab +ab +ab +ab +ju +ju +ju +ju +ju +kD +aR +ju +kD +lb +ju +vX +IH +ju +ju +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(43,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +fx +gh +fx +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +ZU +lc +ju +lQ +mm +ju +ta +rg +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(44,1,1) = {" +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +Je +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +kF +pJ +ju +lR +yg +ju +cP +Rq +ju +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(45,1,1) = {" +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ju +ju +ju +ju +ju +ju +ju +ju +ju +ju +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +"} +(46,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(47,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +"} +(48,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +"} +(49,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(50,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(51,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(52,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(53,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(54,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(55,1,1) = {" +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(56,1,1) = {" +aa +aa +aa +aa +ab +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(57,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(58,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(59,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(60,1,1) = {" +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(61,1,1) = {" +aa +aa +aa +aa +aa +aa +ab +ab +aa +aa +aa +aa +ab +ab +aa +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(62,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/shuttles/misc/infiltrator_advanced.dmm b/_maps/deprecated/Ships/infiltrator_advanced.dmm similarity index 100% rename from _maps/shuttles/misc/infiltrator_advanced.dmm rename to _maps/deprecated/Ships/infiltrator_advanced.dmm diff --git a/_maps/deprecated/deprecated_datums.dm b/_maps/deprecated/deprecated_datums.dm index c9cd175d81a9..b1128719e113 100644 --- a/_maps/deprecated/deprecated_datums.dm +++ b/_maps/deprecated/deprecated_datums.dm @@ -98,3 +98,18 @@ id = "tumblr-sexyman" description = "After a logging incident gone wrong, the Syndicate invade this factory to stop the beast." suffix = "jungle_surface_tumblr_sexyman.dmm" + +/datum/map_template/ruin/lavaland/biodome/beach + name = "Biodome Beach" + id = "biodome-beach" + description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \ + Comes with a rustic wooden bar and suicidal bartender." + suffix = "lavaland_biodome_beach.dmm" + +/datum/map_template/ruin/lavaland/syndicate_base + name = "Syndicate Lava Base" + id = "lava-base" + description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." + suffix = "lavaland_surface_syndicate_base1.dmm" + cost = 20 + allow_duplicates = FALSE diff --git a/_maps/outpost/hangar/test_20x20.dmm b/_maps/outpost/hangar/test_20x20.dmm index c4301d8bceea..118bb8afa821 100644 --- a/_maps/outpost/hangar/test_20x20.dmm +++ b/_maps/outpost/hangar/test_20x20.dmm @@ -51,7 +51,7 @@ /turf/open/floor/plasteel, /area/hangar) "r" = ( -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general, /turf/closed/indestructible/reinforced, /area/hangar) "s" = ( diff --git a/_maps/outpost/hangar/test_2_20x20.dmm b/_maps/outpost/hangar/test_2_20x20.dmm index e9b8744419eb..544771691347 100644 --- a/_maps/outpost/hangar/test_2_20x20.dmm +++ b/_maps/outpost/hangar/test_2_20x20.dmm @@ -1,22 +1,18 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ar" = ( -/obj/machinery/door/airlock/highsecurity, -/turf/open/floor/plasteel/dark, -/area/hangar) -"aE" = ( +"af" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/warning/corner, -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 8 - }, -/obj/item/pipe/binary{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 }, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/hangar) +"ar" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/open/floor/plasteel/dark, +/area/hangar) "bg" = ( /obj/effect/decal/cleanable/garbage{ pixel_x = -12; @@ -55,15 +51,6 @@ }, /turf/open/floor/plasteel/tech, /area/hangar) -"de" = ( -/obj/effect/turf_decal/steeldecal/steel_decals_central2{ - pixel_y = 2 - }, -/obj/item/pipe/binary{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/hangar) "dU" = ( /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, @@ -174,17 +161,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/concrete/slab_1, /area/hangar) -"fZ" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/item/pipe/binary, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) "gf" = ( /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) @@ -220,15 +196,6 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"gX" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary{ - dir = 5 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) "ha" = ( /obj/effect/turf_decal/industrial/loading, /turf/open/floor/plasteel/dark, @@ -255,13 +222,6 @@ "iZ" = ( /turf/closed/indestructible/reinforced, /area/hangar) -"ja" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "109" - }, -/obj/item/pipe/binary, -/turf/open/floor/plating, -/area/hangar) "jc" = ( /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, @@ -318,15 +278,6 @@ /obj/effect/landmark/outpost/hangar_dock, /turf/open/floor/plating, /area/hangar) -"ki" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/blood/old, -/obj/item/pipe/binary, -/turf/open/floor/plating, -/area/hangar) "kA" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -349,6 +300,15 @@ /obj/effect/landmark/outpost/elevator, /turf/open/floor/plasteel/elevatorshaft, /area/hangar) +"ln" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/hangar) "lF" = ( /obj/effect/turf_decal/techfloor{ dir = 8 @@ -440,20 +400,30 @@ icon_state = "panelscorched" }, /area/hangar) -"pB" = ( -/obj/effect/decal/cleanable/dirt, +"pX" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) +"qe" = ( /obj/effect/turf_decal/steeldecal/steel_decals_central2{ pixel_y = 2 }, -/obj/item/pipe/binary{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/hangar) -"pX" = ( +"qk" = ( /obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/warning/corner, +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 10 }, /turf/open/floor/plating{ icon_state = "panelscorched" @@ -542,6 +512,13 @@ color = "#808080" }, /area/hangar) +"sr" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + req_access_txt = "109" + }, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating, +/area/hangar) "sv" = ( /obj/effect/decal/fakelattice{ color = "#808080" @@ -641,6 +618,20 @@ "uq" = ( /turf/open/floor/plating, /area/hangar) +"uM" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "uU" = ( /obj/structure/marker_beacon{ picked_color = "Teal" @@ -654,6 +645,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hangar) +"vo" = ( +/obj/effect/turf_decal/steeldecal/steel_decals_central2{ + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hangar) "vE" = ( /obj/machinery/door/poddoor/multi_tile/four_tile_ver, /turf/closed/indestructible/reinforced, @@ -669,19 +669,12 @@ /obj/machinery/light/floor/hangar, /turf/open/floor/plasteel/dark, /area/hangar) -"vS" = ( +"vT" = ( /obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/warning{ +/obj/machinery/atmospherics/pipe/simple/general{ dir = 4 }, -/obj/effect/turf_decal/industrial/warning{ - dir = 8 - }, -/obj/item/pipe/binary, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/turf/open/floor/plating, /area/hangar) "we" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/arrow_cw{ @@ -807,9 +800,35 @@ /obj/effect/turf_decal/steeldecal/steel_decals6, /turf/open/floor/plasteel/dark, /area/hangar) +"Az" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 6 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/hangar) "AK" = ( /turf/open/floor/plating/asteroid/icerock/smooth, /area/hangar) +"Bg" = ( +/obj/effect/turf_decal/techfloor{ + dir = 6 + }, +/obj/structure/table/reinforced{ + color = "#c1b6a5" + }, +/obj/machinery/fax, +/turf/open/floor/plasteel/dark, +/area/hangar) +"Bo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/steeldecal/steel_decals_central2{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/dark, +/area/hangar) "BQ" = ( /obj/effect/decal/fakelattice{ color = "#808080" @@ -827,19 +846,6 @@ color = "#808080" }, /area/hangar) -"BV" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/warning{ - dir = 10 - }, -/obj/item/pipe/binary{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) "BZ" = ( /obj/machinery/vending/cigarette, /turf/open/floor/concrete/reinforced, @@ -1042,6 +1048,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/hangar) +"Hy" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "HT" = ( /turf/open/floor/plating/catwalk_floor, /area/hangar) @@ -1138,6 +1155,19 @@ icon_state = "foam_plating" }, /area/hangar) +"LI" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/warning{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "LM" = ( /obj/effect/turf_decal/techfloor{ dir = 9 @@ -1199,38 +1229,24 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hangar) -"NV" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) "Od" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/arrow_ccw, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hangar) -"Os" = ( -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/hangar) -"Ot" = ( -/obj/effect/turf_decal/techfloor{ - dir = 6 - }, -/obj/structure/table/reinforced{ - color = "#c1b6a5" - }, -/obj/machinery/fax, -/turf/open/floor/plasteel/dark, -/area/hangar) "OF" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning, /turf/open/floor/plasteel/dark, /area/hangar) +"OV" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 5 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "Pc" = ( /obj/effect/turf_decal/steeldecal/steel_decals2, /turf/open/floor/plasteel/dark, @@ -1244,6 +1260,20 @@ icon_state = "panelscorched" }, /area/hangar) +"Pz" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/glass, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 9 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "PE" = ( /obj/effect/turf_decal/industrial/hatch/yellow, /obj/structure/fermenting_barrel{ @@ -1261,24 +1291,6 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"PL" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 1 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/glass, -/obj/item/pipe/binary, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) -"Qk" = ( -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/hangar) "Qn" = ( /obj/structure/mopbucket, /obj/item/mop{ @@ -1469,6 +1481,15 @@ "Xg" = ( /turf/open/floor/plasteel/tech, /area/hangar) +"Xx" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating, +/area/hangar) "XA" = ( /obj/effect/decal/fakelattice{ color = "#808080" @@ -1522,15 +1543,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/hangar) -"Ya" = ( -/obj/effect/turf_decal/steeldecal/steel_decals_central2{ - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/hangar) "Yr" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning{ dir = 8 @@ -1841,8 +1853,8 @@ iZ iZ oV mR -Os -Ya +Az +vo Od uq uq @@ -1877,13 +1889,13 @@ iZ mY iZ Pt -gX +OV iZ GX Lb Ug -dU -pB +vT +Bo cF uq uq @@ -1923,8 +1935,8 @@ iZ Tb HT tN -Qk -pB +ln +Bo DT uq uq @@ -1959,13 +1971,13 @@ iZ iZ Gk Gk -BV +LI iZ iZ sI ft -NV -pB +af +Bo Od uq uq @@ -2000,13 +2012,13 @@ iZ iZ Gk Gk -aE -vS -ja -ki -fZ -PL -de +qk +uM +sr +Xx +Hy +Pz +qe Od uU uq @@ -2837,7 +2849,7 @@ ri GC Zy GD -Ot +Bg iZ Gk Gk diff --git a/_maps/outpost/hangar/test_2_40x20.dmm b/_maps/outpost/hangar/test_2_40x20.dmm index 6a724f987ee6..7520321a6d23 100644 --- a/_maps/outpost/hangar/test_2_40x20.dmm +++ b/_maps/outpost/hangar/test_2_40x20.dmm @@ -25,6 +25,17 @@ }, /turf/open/floor/plasteel/tech, /area/hangar) +"bL" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hangar) "bQ" = ( /obj/item/banner, /turf/open/floor/plasteel/dark, @@ -46,20 +57,6 @@ }, /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) -"cJ" = ( -/obj/item/pipe/binary{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/turf_decal/industrial/warning{ - dir = 4 - }, -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) "cR" = ( /obj/structure/table/reinforced{ color = "#c1b6a5" @@ -75,12 +72,18 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"dg" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"cX" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/stack/sheet/mineral/wood{ + pixel_x = -6 }, +/obj/item/stack/sheet/mineral/wood{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plasteel/tech/techmaint, /area/hangar) "dk" = ( /obj/machinery/computer/communications{ @@ -123,6 +126,15 @@ }, /turf/open/floor/plasteel/tech, /area/hangar) +"dv" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/hangar) "dD" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating/catwalk_floor, @@ -197,14 +209,6 @@ /obj/machinery/light/floor/hangar, /turf/open/floor/plasteel/dark, /area/hangar) -"fm" = ( -/obj/item/pipe/binary{ - dir = 8 - }, -/turf/open/floor/plasteel/stairs{ - dir = 4 - }, -/area/hangar) "fs" = ( /obj/effect/turf_decal/techfloor, /obj/effect/decal/cleanable/dirt, @@ -274,15 +278,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/hangar) -"gW" = ( -/obj/effect/turf_decal/industrial/warning{ - dir = 1 - }, -/obj/item/pipe/binary{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/hangar) "gY" = ( /obj/effect/turf_decal/techfloor{ dir = 6 @@ -375,16 +370,6 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"jx" = ( -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) "jS" = ( /obj/structure/flora/rock/icy, /turf/open/water/beach/deep, @@ -422,6 +407,13 @@ icon_state = "panelscorched" }, /area/hangar) +"kZ" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "lf" = ( /obj/effect/turf_decal/arrows, /turf/open/floor/plasteel/tech, @@ -439,23 +431,6 @@ /obj/machinery/light/floor/hangar, /turf/open/floor/plasteel/dark, /area/hangar) -"lP" = ( -/obj/effect/turf_decal/industrial/warning/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/pipe/binary{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/hangar) -"mh" = ( -/obj/item/pipe/binary, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) "mu" = ( /obj/effect/turf_decal/trimline/opaque/yellow/filled/arrow_cw, /obj/machinery/light/floor/hangar, @@ -469,10 +444,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, /area/hangar) -"mZ" = ( -/obj/item/pipe/binary{ - dir = 9 - }, +"nb" = ( /obj/item/kirbyplants{ icon_state = "plant-25"; pixel_x = 5 @@ -481,6 +453,9 @@ /obj/effect/decal/cleanable/robot_debris{ pixel_x = 8 }, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 9 + }, /turf/open/floor/plasteel/tech/techmaint, /area/hangar) "nq" = ( @@ -505,6 +480,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hangar) +"oy" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hangar) "oE" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/patterned/cargo_one, @@ -559,17 +544,6 @@ }, /turf/open/floor/wood/walnut, /area/hangar) -"qN" = ( -/obj/structure/railing{ - layer = 3.1 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/turf_decal/spline/fancy/opaque/black, -/obj/item/pipe/binary, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/hangar) "qO" = ( /obj/structure/girder/displaced, /obj/effect/turf_decal/techfloor{ @@ -615,12 +589,6 @@ /obj/effect/turf_decal/spline/fancy/opaque/black, /turf/open/floor/plasteel/tech, /area/hangar) -"ry" = ( -/obj/item/pipe/binary, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) "rK" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/structure/easel, @@ -663,6 +631,16 @@ /obj/effect/decal/cleanable/plastic, /turf/open/floor/plasteel/dark, /area/hangar) +"tH" = ( +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hangar) "tR" = ( /obj/effect/turf_decal/techfloor{ dir = 8 @@ -683,6 +661,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, /area/hangar) +"tY" = ( +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs{ + dir = 4 + }, +/area/hangar) "ue" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 @@ -786,15 +772,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood/walnut, /area/hangar) -"vL" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "109" - }, -/obj/item/pipe/binary, -/obj/structure/catwalk/over/plated_catwalk, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/plating, -/area/hangar) "vO" = ( /obj/machinery/door/poddoor/multi_tile/four_tile_ver, /turf/closed/indestructible/reinforced, @@ -848,6 +825,13 @@ /obj/structure/girder, /turf/open/floor/plating, /area/hangar) +"wO" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating, +/area/hangar) "xd" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -919,6 +903,14 @@ "zA" = ( /turf/open/floor/plating/ice/smooth, /area/hangar) +"zI" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 6 + }, +/turf/open/floor/plating, +/area/hangar) "zR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/opaque/yellow/filled/arrow_cw, @@ -945,6 +937,15 @@ /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel/tech/grid, /area/hangar) +"AH" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hangar) "AN" = ( /obj/structure/table/reinforced, /obj/item/stack/packageWrap{ @@ -1013,6 +1014,17 @@ /obj/effect/turf_decal/trimline/opaque/yellow/filled/arrow_cw, /turf/open/floor/plasteel/dark, /area/hangar) +"EG" = ( +/obj/structure/railing{ + layer = 3.1 + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/hangar) "ET" = ( /turf/open/floor/plasteel/stairs/wood, /area/hangar) @@ -1052,6 +1064,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) +"GT" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/hangar) "GU" = ( /obj/structure/railing/corner{ dir = 1 @@ -1094,6 +1114,13 @@ icon_state = "wood-broken7" }, /area/hangar) +"Hy" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hangar) "HC" = ( /obj/item/kirbyplants{ icon_state = "plant-09" @@ -1163,20 +1190,10 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/hangar) -"Kn" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary, -/obj/machinery/light/directional/east, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/hangar) -"KM" = ( -/obj/item/pipe/binary{ - dir = 6 - }, +"KA" = ( /obj/structure/catwalk/over/plated_catwalk, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general, /turf/open/floor/plating, /area/hangar) "KV" = ( @@ -1215,13 +1232,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/hangar) -"Ma" = ( +"Mi" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/sign/poster/contraband/energy_swords{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/hangar) +"MG" = ( /obj/effect/turf_decal/industrial/warning{ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/item/pipe/binary{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 }, /turf/open/floor/plasteel/dark, /area/hangar) @@ -1234,18 +1261,15 @@ }, /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) -"Ni" = ( -/obj/item/pipe/binary, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/stack/sheet/mineral/wood{ - pixel_x = -6 +"Ne" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 4 }, -/obj/item/stack/sheet/mineral/wood{ - pixel_x = 10; - pixel_y = 7 +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/tech/techmaint, /area/hangar) "NF" = ( /obj/structure/filingcabinet/chestdrawer, @@ -1385,16 +1409,6 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"Tb" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/hangar) "Tc" = ( /obj/machinery/door/airlock/highsecurity, /obj/effect/turf_decal/techfloor{ @@ -1416,6 +1430,16 @@ /obj/structure/barricade/wooden, /turf/open/floor/plating, /area/hangar) +"TG" = ( +/obj/structure/table/reinforced{ + color = "#c1b6a5" + }, +/obj/machinery/fax, +/obj/effect/turf_decal/techfloor{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hangar) "TM" = ( /obj/machinery/light/floor/hangar, /turf/open/floor/plasteel/tech, @@ -1432,6 +1456,20 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/hangar) +"TU" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 9 + }, +/turf/open/floor/plating, +/area/hangar) "Ud" = ( /obj/effect/turf_decal/techfloor, /obj/structure/railing{ @@ -1440,28 +1478,11 @@ }, /turf/open/floor/plasteel/dark, /area/hangar) -"Uz" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/hangar) "UG" = ( /obj/machinery/door/airlock, /obj/effect/landmark/outpost/elevator_machine, /turf/open/floor/plasteel, /area/hangar) -"UI" = ( -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/hangar) "UJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/opaque/yellow/filled/warning{ @@ -1493,6 +1514,15 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/wood/walnut, /area/hangar) +"Vp" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + req_access_txt = "109" + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/general, +/turf/open/floor/plating, +/area/hangar) "Wb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/outpost/hangar_numbers, @@ -1501,36 +1531,6 @@ "Wk" = ( /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) -"Wq" = ( -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) -"WI" = ( -/obj/structure/table/reinforced{ - color = "#c1b6a5" - }, -/obj/machinery/fax, -/obj/effect/turf_decal/techfloor{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/hangar) -"WJ" = ( -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/structure/catwalk/over/plated_catwalk, -/obj/effect/turf_decal/industrial/warning{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/hangar) "WP" = ( /obj/machinery/atmospherics/components/binary/pump/on, /obj/structure/catwalk/over/plated_catwalk, @@ -1580,6 +1580,16 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/plasteel/patterned/cargo_one, /area/hangar) +"XV" = ( +/obj/structure/catwalk/over/plated_catwalk, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/general{ + dir = 6 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/hangar) "Yb" = ( /obj/effect/turf_decal/industrial/warning/corner{ dir = 4 @@ -1604,16 +1614,6 @@ /obj/effect/turf_decal/industrial/loading, /turf/open/floor/plasteel/dark, /area/hangar) -"YT" = ( -/obj/structure/catwalk/over/plated_catwalk, -/obj/item/pipe/binary{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/energy_swords{ - pixel_y = -32 - }, -/turf/open/floor/plating/rust, -/area/hangar) "Zc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2127,11 +2127,11 @@ au au wv dQ -Uz -Kn -dg -qN -gW +XV +GT +kZ +EG +dv Cm ye ye @@ -2171,11 +2171,11 @@ ie ie bZ uw -Tb +Ne ie yV zp -Ma +MG Cm ye ye @@ -2215,11 +2215,11 @@ bb ie AN Pz -YT +Mi ie Yb Sk -lP +tH Cm ye ye @@ -2259,7 +2259,7 @@ bb ie ie xu -fm +tY he Hm Oq @@ -2297,13 +2297,13 @@ gu gu gu ie -KM -mh -ry -ry -vL -Ni -mZ +zI +wO +KA +KA +Vp +cX +nb he Hm Oq @@ -2341,7 +2341,7 @@ ie gu gu ie -jx +oy mx qQ ie @@ -2385,7 +2385,7 @@ ie gu gu ie -Wq +AH ie ie ie @@ -2429,7 +2429,7 @@ ie gu ie ie -UI +Hy ie au au @@ -2473,7 +2473,7 @@ ie ie ie au -WJ +bL ie au zA @@ -2517,7 +2517,7 @@ ie ie Yd WP -cJ +TU KV wc pb @@ -3814,7 +3814,7 @@ ie ie NF iW -WI +TG cR gY Tc diff --git a/_maps/outpost/hangar/test_2_40x40.dmm b/_maps/outpost/hangar/test_2_40x40.dmm index ada742d9f557..d5f4c069a61c 100644 --- a/_maps/outpost/hangar/test_2_40x40.dmm +++ b/_maps/outpost/hangar/test_2_40x40.dmm @@ -3,7 +3,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ req_access_txt = "109" }, -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/concrete/slab_3, /area/hangar) "ah" = ( @@ -748,7 +748,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/concrete/slab_3, /area/hangar) "FY" = ( @@ -778,7 +778,7 @@ /obj/structure/chair{ dir = 4 }, -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/concrete/slab_3, /area/hangar) "Hg" = ( diff --git a/_maps/outpost/hangar/test_40x20.dmm b/_maps/outpost/hangar/test_40x20.dmm index c50c8573660c..66b1a7d24b6f 100644 --- a/_maps/outpost/hangar/test_40x20.dmm +++ b/_maps/outpost/hangar/test_40x20.dmm @@ -34,7 +34,7 @@ /turf/open/floor/plasteel, /area/hangar) "n" = ( -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general, /turf/closed/indestructible/reinforced, /area/hangar) "o" = ( diff --git a/_maps/outpost/hangar/test_40x40.dmm b/_maps/outpost/hangar/test_40x40.dmm index 0bae3295e4e0..d38fcbb3d75d 100644 --- a/_maps/outpost/hangar/test_40x40.dmm +++ b/_maps/outpost/hangar/test_40x40.dmm @@ -46,7 +46,7 @@ /turf/closed/indestructible/reinforced, /area/hangar) "q" = ( -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general, /turf/closed/indestructible/reinforced, /area/hangar) "r" = ( diff --git a/_maps/outpost/hangar/test_56x20.dmm b/_maps/outpost/hangar/test_56x20.dmm index be5afd91fa78..143bbd3ef8d1 100644 --- a/_maps/outpost/hangar/test_56x20.dmm +++ b/_maps/outpost/hangar/test_56x20.dmm @@ -22,7 +22,7 @@ /turf/closed/indestructible/reinforced, /area/hangar) "h" = ( -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general, /turf/closed/indestructible/reinforced, /area/hangar) "k" = ( diff --git a/_maps/outpost/hangar/test_56x40.dmm b/_maps/outpost/hangar/test_56x40.dmm index 6ca87ef8e48a..80ba17bd26b6 100644 --- a/_maps/outpost/hangar/test_56x40.dmm +++ b/_maps/outpost/hangar/test_56x40.dmm @@ -49,7 +49,7 @@ /turf/open/floor/plasteel/tech, /area/hangar) "q" = ( -/obj/item/pipe/binary, +/obj/machinery/atmospherics/pipe/simple/general, /turf/closed/indestructible/reinforced, /area/hangar) "s" = ( diff --git a/_maps/outpost/outpost_test_1.dmm b/_maps/outpost/outpost_test_1.dmm index 009668fb5676..af5f62da3a98 100644 --- a/_maps/outpost/outpost_test_1.dmm +++ b/_maps/outpost/outpost_test_1.dmm @@ -1526,7 +1526,9 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, /turf/open/floor/plasteel/grimy, /area/outpost/crew/dorm) "ob" = ( @@ -3612,6 +3614,9 @@ /obj/effect/turf_decal/corner/opaque/bottlegreen{ dir = 5 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, /turf/open/floor/plasteel, /area/outpost/crew/dorm) "Gp" = ( diff --git a/_maps/outpost/outpost_test_2.dmm b/_maps/outpost/outpost_test_2.dmm index 5884b870792c..3dab58add4c0 100644 --- a/_maps/outpost/outpost_test_2.dmm +++ b/_maps/outpost/outpost_test_2.dmm @@ -1036,22 +1036,6 @@ }, /turf/open/floor/plasteel/dark, /area/outpost/cargo) -"ej" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/industrial/warning{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/rockvault, -/area/outpost/operations) "en" = ( /obj/structure/closet/firecloset/full{ anchored = 1; @@ -2093,6 +2077,24 @@ /obj/machinery/light/directional/south, /turf/open/floor/plasteel/tech/techmaint, /area/outpost/engineering/atmospherics) +"ij" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel/rockvault, +/area/outpost/operations) "il" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -2807,16 +2809,6 @@ }, /turf/open/floor/plasteel/patterned/grid, /area/outpost/vacant_rooms) -"kP" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/spline/fancy/opaque/black{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/plasteel/dark, -/area/outpost/operations) "kR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -3466,11 +3458,6 @@ }, /turf/open/floor/wood, /area/outpost/crew/library) -"mZ" = ( -/obj/structure/table/wood, -/obj/machinery/fax, -/turf/open/floor/plasteel, -/area/outpost/crew/canteen) "na" = ( /obj/structure/flora/rock/pile/largejungle{ pixel_x = 3; @@ -3597,6 +3584,11 @@ }, /turf/open/floor/grass, /area/outpost/crew/lounge) +"nB" = ( +/obj/structure/table/wood, +/obj/machinery/fax, +/turf/open/floor/plasteel, +/area/outpost/crew/canteen) "nC" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -10834,14 +10826,6 @@ /obj/structure/flora/stump, /turf/open/floor/grass/snow/safe, /area/outpost/hallway/starboard) -"Mn" = ( -/obj/machinery/photocopier/nt{ - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/industrial/hatch/yellow, -/turf/open/floor/plasteel/dark, -/area/outpost/security) "Mo" = ( /obj/structure/bed, /obj/structure/curtain/cloth/grey, @@ -12691,6 +12675,14 @@ icon_state = "panelscorched" }, /area/outpost/maintenance/fore) +"SO" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/industrial/hatch/yellow, +/turf/open/floor/plasteel/dark, +/area/outpost/security) "SP" = ( /obj/effect/turf_decal/techfloor/corner{ dir = 1 @@ -13547,6 +13539,18 @@ "VN" = ( /turf/open/floor/engine, /area/outpost/crew/cryo) +"VQ" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/outpost/operations) "VT" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -17850,7 +17854,7 @@ sR gP ua sI -mZ +nB IJ IJ gP @@ -18265,7 +18269,7 @@ vo tr jL Mt -Mn +SO zf rv ki @@ -18986,7 +18990,7 @@ JO BE Cv UO -ej +ij Sw Lo jR @@ -19053,7 +19057,7 @@ sx uK DV wT -kP +VQ HD gd Rg diff --git a/_maps/shuttles/shiptest/independent_junker.dmm b/_maps/shuttles/shiptest/independent_junker.dmm index d740a30838a9..006a74a2e3fb 100644 --- a/_maps/shuttles/shiptest/independent_junker.dmm +++ b/_maps/shuttles/shiptest/independent_junker.dmm @@ -98,16 +98,6 @@ /obj/item/cutting_board, /turf/open/floor/plastic, /area/ship/crew/canteen/kitchen) -"aX" = ( -/obj/structure/cable{ - icon_state = "6-10" - }, -/obj/machinery/computer/helm/retro, -/obj/item/paper/construction{ - default_raw_text = "Yeah, just so you know, I left the fuel and air pumps OFF when I dropped this thing of for you, you're gonna have to go outside and turn em on to start up the engines

The pumps are outside on the tank things to the left and right on the back of the ship, there's also one in each engine room you'll need to get going." - }, -/turf/open/floor/plating, -/area/ship/bridge) "bc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -217,6 +207,15 @@ icon_state = "wood-broken3" }, /area/ship/maintenance/starboard) +"cX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium/survival/nodiagonal, +/area/ship/storage/eva) "dm" = ( /turf/closed/wall/mineral/titanium/survival, /area/ship/cargo) @@ -355,17 +354,6 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating, /area/ship/bridge) -"gh" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/industrial/warning/dust, -/obj/machinery/airalarm/directional/east, -/obj/item/paper/construction{ - default_raw_text = "

Airlock Instructions


Because none of you numbnuts can remember them


1: Bolt the door behind you so you dont bump into it and lose all our air.
Bolt is the LEFT BUTTON
2: Go to the air alarm, set it to siphon
3: When at least most of the gas is out, turn OFF siphon
4: You can now open the shutters
I shouldnt have to tell you this, but theyre the RIGHT button

To go back IN


1: Close the shutters behind you
2: Set the air alarm to SIPHON again
3: When all of the dangerous gas is out, set the air alarm to FILL
3: Once the pressure is at least 50 kpa, you can set the air alarm back to normal, and unbolt the door

I still can't fucking believe I have to write this." - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/ship/cargo) "go" = ( /obj/machinery/atmospherics/pipe/simple/purple/hidden, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -1388,6 +1376,16 @@ }, /turf/open/floor/pod/dark, /area/ship/crew/canteen) +"yf" = ( +/obj/structure/cable{ + icon_state = "6-10" + }, +/obj/machinery/computer/helm/retro, +/obj/item/paper/construction{ + default_raw_text = "Yeah, just so you know, I left the fuel and air pumps OFF when I dropped this thing of for you, you're gonna have to go outside and turn em on to start up the engines

The pumps are outside on the tank things to the left and right on the back of the ship, there's also one in each engine room you'll need to get going." + }, +/turf/open/floor/plating, +/area/ship/bridge) "yp" = ( /turf/closed/wall/rust, /area/ship/engineering/electrical) @@ -2097,12 +2095,17 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/ship/crew/canteen/kitchen) -"Mu" = ( -/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ - dir = 8 +"Mz" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/industrial/warning/dust, +/obj/machinery/airalarm/directional/east, +/obj/item/paper/construction{ + default_raw_text = "

Airlock Instructions


Because none of you numbnuts can remember them


1: Bolt the door behind you so you dont bump into it and lose all our air.
Bolt is the LEFT BUTTON
2: Go to the air alarm, set it to siphon
3: When at least most of the gas is out, turn OFF siphon
4: You can now open the shutters
I shouldnt have to tell you this, but theyre the RIGHT button

To go back IN


1: Close the shutters behind you
2: Set the air alarm to SIPHON again
3: When all of the dangerous gas is out, set the air alarm to FILL
3: Once the pressure is at least 50 kpa, you can set the air alarm back to normal, and unbolt the door

I still can't fucking believe I have to write this." }, -/turf/open/floor/engine/hull, -/area/template_noop) +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/ship/cargo) "MW" = ( /obj/docking_port/stationary{ dwidth = 15; @@ -2151,40 +2154,6 @@ }, /turf/open/floor/pod/dark, /area/ship/maintenance/starboard) -"Og" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/stack/cable_coil/cut/red{ - pixel_x = -15; - pixel_y = -8 - }, -/obj/item/paper/crumpled{ - pixel_y = 4; - pixel_x = -23; - default_raw_text = "Attempt 301. Longitudinal traction was applied to the upper protruding flesh appendage. Muffled screaming (possibly Jeff?) was observed. Spontaneous amputation occurred and the screaming ceased. Duct tape applied.

Results: Reployer remains unfunctioning." - }, -/obj/item/paper/crumpled{ - pixel_y = -12; - pixel_x = -3; - default_raw_text = "Attempt 1180. Salt circle was established with regular rituals. 30mL of blood was dripped directly onto the reployer, and chanting begun 1 minute after the beginning of the attempt. Despite using only lighting from tallow candles, soapbucket scrying was ineffective in troubleshooting the problem.

Results: Reployer remains unfunctioning." - }, -/obj/effect/decal/cleanable/greenglow/filled, -/obj/item/screwdriver/old{ - pixel_y = -2; - pixel_x = -15 - }, -/obj/effect/decal/cleanable/blood, -/obj/machinery/light/small/directional/east, -/obj/item/trash/candle{ - pixel_y = 17; - pixel_x = -10 - }, -/obj/item/trash/candle{ - pixel_y = 17; - pixel_x = 10 - }, -/obj/structure/salvageable/protolathe/reployer, -/turf/open/floor/pod/dark, -/area/ship/crew/office) "Ol" = ( /turf/closed/wall/mineral/titanium/survival/nodiagonal, /area/ship/crew/canteen) @@ -2455,6 +2424,40 @@ /obj/effect/decal/cleanable/blood/footprints, /turf/open/floor/plating/rust, /area/ship/maintenance/starboard) +"VR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/stack/cable_coil/cut/red{ + pixel_x = -15; + pixel_y = -8 + }, +/obj/item/paper/crumpled{ + pixel_y = 4; + pixel_x = -23; + default_raw_text = "Attempt 301. Longitudinal traction was applied to the upper protruding flesh appendage. Muffled screaming (possibly Jeff?) was observed. Spontaneous amputation occurred and the screaming ceased. Duct tape applied.

Results: Reployer remains unfunctioning." + }, +/obj/item/paper/crumpled{ + pixel_y = -12; + pixel_x = -3; + default_raw_text = "Attempt 1180. Salt circle was established with regular rituals. 30mL of blood was dripped directly onto the reployer, and chanting begun 1 minute after the beginning of the attempt. Despite using only lighting from tallow candles, soapbucket scrying was ineffective in troubleshooting the problem.

Results: Reployer remains unfunctioning." + }, +/obj/effect/decal/cleanable/greenglow/filled, +/obj/item/screwdriver/old{ + pixel_y = -2; + pixel_x = -15 + }, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/small/directional/east, +/obj/item/trash/candle{ + pixel_y = 17; + pixel_x = -10 + }, +/obj/item/trash/candle{ + pixel_y = 17; + pixel_x = 10 + }, +/obj/structure/salvageable/protolathe/reployer, +/turf/open/floor/pod/dark, +/area/ship/crew/office) "VY" = ( /obj/machinery/atmospherics/pipe/simple/purple/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -2571,6 +2574,12 @@ }, /turf/closed/wall/mineral/wood, /area/ship/maintenance/central) +"Xu" = ( +/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{ + dir = 8 + }, +/turf/open/floor/engine/hull, +/area/ship/external) "XF" = ( /obj/structure/cable{ icon_state = "1-8" @@ -2592,15 +2601,6 @@ "XS" = ( /turf/closed/wall/mineral/titanium/survival/nodiagonal, /area/ship/storage/eva) -"XT" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/ship/storage/eva) "XV" = ( /obj/structure/cable{ icon_state = "5-10" @@ -3067,7 +3067,7 @@ bF bt HB YK -Og +VR JQ xx sh @@ -3180,7 +3180,7 @@ By mN qR Ye -gh +Mz Yr BZ BZ @@ -3272,7 +3272,7 @@ PE "} (19,1,1) = {" YB -aX +yf PR yD EG @@ -3288,7 +3288,7 @@ ay Wh Eb GI -XT +cX zz tB EZ @@ -3344,7 +3344,7 @@ IR hq ZK vd -Mu +Xu BZ Jn BZ diff --git a/_maps/shuttles/shiptest/independent_meta.dmm b/_maps/shuttles/shiptest/independent_meta.dmm index 8a640e7e64a4..8adc2aeb86a5 100644 --- a/_maps/shuttles/shiptest/independent_meta.dmm +++ b/_maps/shuttles/shiptest/independent_meta.dmm @@ -343,28 +343,6 @@ }, /turf/open/floor/plating, /area/ship/engineering) -"aP" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ship/engineering) "aQ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/airlock/external{ @@ -400,18 +378,6 @@ }, /turf/template_noop, /area/template_noop) -"bg" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/industrial/outline/yellow, -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 1; - piping_layer = 2 - }, -/obj/machinery/light/small/built/directional/south, -/turf/open/floor/plating, -/area/ship/engineering) "bh" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/industrial/outline/yellow, @@ -426,15 +392,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/plating, /area/ship/engineering) -"bi" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/blood, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plating, -/area/ship/engineering) "bj" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ @@ -619,51 +576,6 @@ /obj/machinery/light/small/built/directional/west, /turf/open/floor/plasteel, /area/ship/crew/canteen) -"bN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table, -/obj/item/trash/plate{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/trash/plate{ - pixel_x = -6 - }, -/obj/item/trash/plate{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/trash/plate{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/trash/plate{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/kitchen/fork{ - pixel_x = 12; - pixel_y = 3 - }, -/obj/item/kitchen/fork{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/turf_decal/corner/transparent/bar, -/obj/effect/turf_decal/corner/transparent/bar{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light_switch{ - pixel_x = -13; - pixel_y = 22 - }, -/turf/open/floor/plasteel, -/area/ship/crew/canteen) "bO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ @@ -1043,42 +955,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/plasteel, /area/ship/crew/canteen) -"cD" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/paper_bin{ - pixel_x = -4 - }, -/obj/item/pen{ - pixel_x = -4 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/item/camera{ - pixel_x = 12; - pixel_y = 6 - }, -/obj/item/storage/photo_album{ - pixel_x = 14 - }, -/obj/item/spacecash/bundle/c1000{ - pixel_x = 7 - }, -/obj/item/spacecash/bundle/c1000{ - pixel_x = 7 - }, -/obj/item/spacecash/bundle/c1000{ - pixel_x = 7 - }, -/obj/machinery/light/small/built/directional/west, -/obj/machinery/light_switch{ - pixel_x = -13; - pixel_y = 22 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plasteel/dark, -/area/ship/bridge) "cE" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt/dust, @@ -1174,19 +1050,6 @@ /obj/machinery/computer/helm/viewscreen/directional/south, /turf/open/floor/plasteel/dark, /area/ship/engineering) -"cJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light_switch{ - dir = 4; - pixel_y = 10; - pixel_x = -20 - }, -/turf/open/floor/plasteel/dark, -/area/ship/cargo) "cK" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -1534,29 +1397,6 @@ }, /turf/open/floor/plating, /area/ship/engineering) -"dJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/structure/closet/crate, -/obj/item/stack/sheet/metal/twenty, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/obj/effect/turf_decal/industrial/outline/yellow, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 11; - pixel_y = -16 - }, -/turf/open/floor/plating, -/area/ship/engineering) "dK" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -1867,28 +1707,6 @@ }, /turf/open/floor/plating, /area/ship/engineering) -"gr" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/corner/opaque/blue/diagonal{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/white/diagonal, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = -12; - pixel_y = -16 - }, -/turf/open/floor/plasteel, -/area/ship/crew) "hq" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/ntspaceworks_big/one{ @@ -2034,12 +1852,29 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/cargo) -"mL" = ( -/obj/machinery/porta_turret/ship/weak{ +"mk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10 + }, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, -/turf/closed/wall/mineral/titanium, -/area/ship/bridge) +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = 11; + pixel_y = -16 + }, +/turf/open/floor/plating, +/area/ship/engineering) "nK" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -2277,6 +2112,25 @@ }, /turf/open/floor/plasteel, /area/ship/crew) +"uB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ship/engineering) "ve" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/ntspaceworks_big/eight{ @@ -2377,6 +2231,28 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/crew/canteen) +"zw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/corner/opaque/blue/diagonal{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/white/diagonal, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = -12; + pixel_y = -16 + }, +/turf/open/floor/plasteel, +/area/ship/crew) "zC" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/ntspaceworks_big/four{ @@ -2384,18 +2260,42 @@ }, /turf/open/floor/plasteel/dark, /area/ship/cargo) -"zJ" = ( +"Ac" = ( +/obj/structure/table, /obj/effect/decal/cleanable/dirt/dust, +/obj/item/paper_bin{ + pixel_x = -4 + }, +/obj/item/pen{ + pixel_x = -4 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/plating, -/area/ship/engineering) +/obj/item/camera{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/storage/photo_album{ + pixel_x = 14 + }, +/obj/item/spacecash/bundle/c1000{ + pixel_x = 7 + }, +/obj/item/spacecash/bundle/c1000{ + pixel_x = 7 + }, +/obj/item/spacecash/bundle/c1000{ + pixel_x = 7 + }, +/obj/machinery/light/small/built/directional/west, +/obj/machinery/light_switch{ + pixel_x = -13; + pixel_y = 22 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) "Ag" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/corner/transparent/neutral/full, @@ -2437,6 +2337,15 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plasteel/dark, /area/ship/crew) +"AY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/ship/engineering) "By" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/blood, @@ -2466,6 +2375,51 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/cargo) +"EX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/trash/plate{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/trash/plate{ + pixel_x = -6 + }, +/obj/item/trash/plate{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/trash/plate{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/trash/plate{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/kitchen/fork{ + pixel_x = 12; + pixel_y = 3 + }, +/obj/item/kitchen/fork{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/corner/transparent/bar, +/obj/effect/turf_decal/corner/transparent/bar{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light_switch{ + pixel_x = -13; + pixel_y = 22 + }, +/turf/open/floor/plasteel, +/area/ship/crew/canteen) "Fb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -2588,6 +2542,12 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/cargo) +"Lo" = ( +/obj/machinery/porta_turret/ship/weak{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium, +/area/ship/bridge) "Lq" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ @@ -2602,6 +2562,12 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/cargo) +"LF" = ( +/obj/machinery/porta_turret/ship/weak{ + dir = 4 + }, +/turf/closed/wall/mineral/titanium, +/area/ship/bridge) "LK" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/north, @@ -2620,6 +2586,19 @@ }, /turf/open/floor/plasteel, /area/ship/crew) +"Mf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light_switch{ + dir = 4; + pixel_y = 10; + pixel_x = -20 + }, +/turf/open/floor/plasteel/dark, +/area/ship/cargo) "MC" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, @@ -2901,12 +2880,18 @@ /obj/machinery/light/small/built/directional/west, /turf/open/floor/plasteel/dark, /area/ship/crew) -"VT" = ( -/obj/machinery/porta_turret/ship/weak{ - dir = 4 +"Ws" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/closed/wall/mineral/titanium, -/area/ship/bridge) +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/light/small/built/directional/east, +/turf/open/floor/plating, +/area/ship/engineering) "Xs" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/ntspaceworks_big/two{ @@ -2940,6 +2925,18 @@ /obj/effect/turf_decal/corner/transparent/neutral/full, /turf/open/floor/plasteel/dark, /area/ship/crew) +"ZB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/industrial/outline/yellow, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1; + piping_layer = 2 + }, +/obj/machinery/light/small/built/directional/south, +/turf/open/floor/plating, +/area/ship/engineering) "ZR" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable{ @@ -3001,7 +2998,7 @@ ac ak az aM -bg +ZB ac aa ab @@ -3039,11 +3036,11 @@ aa "} (5,1,1) = {" aa -mL +Lo ac aB aO -bi +AY ac bH ac @@ -3053,7 +3050,7 @@ cH ac cZ JR -dJ +mk ac jJ aa @@ -3063,8 +3060,8 @@ aa aa am aC -aP -zJ +uB +Ws by dR rF @@ -3133,7 +3130,7 @@ tU Fb Ag cy -cJ +Mf cP db On @@ -3276,7 +3273,7 @@ aH Zf bq bD -bN +EX ca co cA @@ -3291,7 +3288,7 @@ aa "} (17,1,1) = {" aa -mL +Lo ai ai rU @@ -3361,7 +3358,7 @@ uw ai bF bQ -cD +Ac yZ cO bQ @@ -3421,7 +3418,7 @@ aj OX ku MM -gr +zw ai bQ cg @@ -3481,10 +3478,10 @@ aa (26,1,1) = {" aa aa -VT +LF ai ai -VT +LF aa aa aa @@ -3492,10 +3489,10 @@ aa aa aa aa -VT +LF bD bD -VT +LF aa aa "} diff --git a/_maps/shuttles/shiptest/independent_rigger.dmm b/_maps/shuttles/shiptest/independent_rigger.dmm index 6ebe28fedadc..fb969897dce3 100644 --- a/_maps/shuttles/shiptest/independent_rigger.dmm +++ b/_maps/shuttles/shiptest/independent_rigger.dmm @@ -231,6 +231,13 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/plasteel/white, /area/ship/crew/canteen) +"dH" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/west, +/obj/machinery/fax, +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/blue, +/area/ship/bridge) "dJ" = ( /obj/effect/turf_decal/industrial/outline/yellow, /obj/structure/closet/firecloset, @@ -972,6 +979,22 @@ }, /turf/open/floor/plasteel/grimy, /area/ship/security) +"mD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/closet/emcloset/wall{ + pixel_y = 28 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) "mH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 @@ -1604,13 +1627,6 @@ /obj/item/clothing/head/hardhat/dblue, /turf/open/floor/plating, /area/ship/engineering) -"un" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/west, -/obj/machinery/fax, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/blue, -/area/ship/bridge) "uy" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2274,31 +2290,6 @@ }, /turf/open/floor/plasteel/tech, /area/ship/engineering) -"AC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/structure/closet/emcloset/wall{ - pixel_y = 28 - }, -/obj/structure/catwalk/over, -/turf/open/floor/plating, -/area/ship/engineering) -"AH" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/structure/curtain/bounty, -/turf/open/floor/plasteel/grimy, -/area/ship/crew) "AQ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2847,15 +2838,6 @@ /obj/machinery/atmospherics/components/unary/portables_connector/layer4, /turf/open/floor/plating, /area/ship/engineering/atmospherics) -"Hn" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/structure/curtain/bounty, -/obj/structure/sign/poster/contraband/random{ - pixel_x = -32 - }, -/turf/open/floor/plasteel/grimy, -/area/ship/crew) "Ht" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2907,6 +2889,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plasteel/grimy, /area/ship/security) +"HN" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/structure/curtain/bounty, +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew) "HR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -3287,6 +3278,12 @@ }, /turf/open/floor/plasteel/dark, /area/ship/medical) +"Ne" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, +/obj/structure/curtain/bounty, +/turf/open/floor/plasteel/grimy, +/area/ship/crew) "Nh" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -4534,9 +4531,9 @@ bC FO cc Ce -Hn -AH -AH +HN +Ne +Ne Ry gc Fu @@ -4811,7 +4808,7 @@ pt JK cl ax -un +dH qd Vt QQ @@ -4992,7 +4989,7 @@ fh lx tx Tq -AC +mD cR CG jx diff --git a/_maps/shuttles/shiptest/independent_shepherd.dmm b/_maps/shuttles/shiptest/independent_shepherd.dmm index 611beb40135b..f9c1fd853ecd 100644 --- a/_maps/shuttles/shiptest/independent_shepherd.dmm +++ b/_maps/shuttles/shiptest/independent_shepherd.dmm @@ -48,16 +48,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/wood, /area/ship/crew/library) -"at" = ( -/obj/item/paper/natural{ - icon_state = "paper_words"; - default_raw_text = "

Trappist Recipe


By Pater Noster

Servings: 2 Prep Time: 10 mins Cook Time: 1-2 hrs Difficulty: Easy
Trappist beer is a rich and pleasant beer traditionally brewed by monks.

Ingredients


Ale:
Ale! The core of any good drink. Easily obtainable by fermenting oats in a barrel for a while. This will be the basis of our brew, giving it it's fruity taste and color!
Holy water:
This is what a makes a trappist a trappist and not a trapisst, the religion! Real easy to get if you are reading this where you are supposed to be reading this! If the chaplain can't bothered it's also easily harvestable from holymelons as long as you bother to separate it.
Sugar:
Sugar is what's gonna make it all come together sweetening the brew and mixing well with the ale from earlier. It's easy to obtain from grinding sugarcanes. Feel free to add liberally.

Preparation


1. Mix the ale and holy water together.
2. Add some sugar to the mix as you keep stirring it for 1 minute.
3. At this point you're free to just use it as is! But feel free to experiment by adding new flavours and really making it your own!

Closing statement


And that's it! Hopefully this guide has been somewhat helpful. A final tip I have is to drink it with bread and cheese, really finishes of the package."; - name = "paper - Trappist Recipe"; - pixel_x = 2; - pixel_y = 4 - }, -/turf/open/floor/wood/ebony, -/area/ship/crew/canteen) "av" = ( /obj/structure/table/wood, /obj/item/flashlight/lantern, @@ -1612,6 +1602,16 @@ /obj/item/reagent_containers/glass/bucket/wooden, /turf/open/floor/wood/ebony, /area/ship/crew/canteen) +"ok" = ( +/obj/item/paper/natural{ + icon_state = "paper_words"; + default_raw_text = "

Trappist Recipe


By Pater Noster

Servings: 2 Prep Time: 10 mins Cook Time: 1-2 hrs Difficulty: Easy
Trappist beer is a rich and pleasant beer traditionally brewed by monks.

Ingredients


Ale:
Ale! The core of any good drink. Easily obtainable by fermenting oats in a barrel for a while. This will be the basis of our brew, giving it it's fruity taste and color!
Holy water:
This is what a makes a trappist a trappist and not a trapisst, the religion! Real easy to get if you are reading this where you are supposed to be reading this! If the chaplain can't bothered it's also easily harvestable from holymelons as long as you bother to separate it.
Sugar:
Sugar is what's gonna make it all come together sweetening the brew and mixing well with the ale from earlier. It's easy to obtain from grinding sugarcanes. Feel free to add liberally.

Preparation


1. Mix the ale and holy water together.
2. Add some sugar to the mix as you keep stirring it for 1 minute.
3. At this point you're free to just use it as is! But feel free to experiment by adding new flavours and really making it your own!

Closing statement


And that's it! Hopefully this guide has been somewhat helpful. A final tip I have is to drink it with bread and cheese, really finishes of the package."; + name = "paper - Trappist Recipe"; + pixel_x = 2; + pixel_y = 4 + }, +/turf/open/floor/wood/ebony, +/area/ship/crew/canteen) "on" = ( /turf/open/floor/plasteel/stairs/right{ dir = 4 @@ -1807,6 +1807,14 @@ }, /turf/open/floor/wood, /area/ship/hallway/starboard) +"pN" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/corner/opaque/lightgrey/mono, +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ + dir = 8 + }, +/turf/open/floor/engine/air, +/area/ship/engineering/atmospherics) "pO" = ( /turf/closed/wall, /area/ship/crew/canteen) @@ -4998,15 +5006,6 @@ }, /turf/open/floor/plating, /area/ship/crew/chapel) -"Sa" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ - dir = 8; - piping_layer = 2 - }, -/obj/effect/turf_decal/corner/opaque/lightgrey/mono, -/turf/open/floor/engine/air, -/area/ship/engineering/atmospherics) "Sb" = ( /obj/effect/turf_decal/siding/wood{ color = "#332521"; @@ -6810,7 +6809,7 @@ xj xj Uf Gi -Sa +pN uq ti dM @@ -7457,7 +7456,7 @@ ZG ZG pO OO -at +ok uY QC ZG diff --git a/_maps/shuttles/shiptest/independent_tranquility.dmm b/_maps/shuttles/shiptest/independent_tranquility.dmm index 242267392e9b..a43c627176e4 100644 --- a/_maps/shuttles/shiptest/independent_tranquility.dmm +++ b/_maps/shuttles/shiptest/independent_tranquility.dmm @@ -27,6 +27,27 @@ }, /turf/open/floor/plasteel/white, /area/ship/crew/canteen) +"aE" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = 11; + pixel_y = -17 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ship/hallway/starboard) "aF" = ( /obj/structure/window/reinforced{ dir = 1 @@ -967,28 +988,6 @@ }, /turf/open/floor/plasteel/tech, /area/ship/crew/cryo) -"hk" = ( -/obj/structure/closet/wall/orange{ - pixel_y = 32 - }, -/obj/item/clothing/suit/fire/atmos, -/obj/item/clothing/mask/gas/atmos, -/obj/item/clothing/head/hardhat/atmos, -/obj/item/storage/belt/utility/atmostech, -/obj/item/clothing/head/beret/atmos, -/obj/item/circuitboard/machine/shieldwallgen/atmos, -/obj/item/circuitboard/machine/shieldwallgen/atmos, -/obj/item/stack/tape/industrial, -/obj/item/stack/tape/industrial, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/extinguisher/advanced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4{ - dir = 4 - }, -/obj/item/clothing/head/beret/atmos, -/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering/engine) "hn" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Workshop" @@ -1448,6 +1447,35 @@ }, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/port) +"kC" = ( +/obj/structure/chair/comfy/brown, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/closet/wall{ + dir = 4; + name = "Wardrobe"; + pixel_x = -28 + }, +/obj/item/clothing/head/wig/random, +/obj/item/clothing/under/color/jumpskirt/random, +/obj/item/clothing/under/color/random, +/obj/item/clothing/under/rank/command/captain/skirt, +/obj/item/clothing/under/rank/command/captain/suit, +/obj/item/pen/fountain/captain, +/obj/item/radio/headset/heads/captain, +/obj/item/storage/backpack/duffelbag/captain, +/obj/item/clothing/suit/hooded/wintercoat/captain, +/obj/item/clothing/suit/armor/vest/capcarapace/duster, +/obj/item/clothing/head/caphat/cowboy, +/obj/item/clothing/shoes/cowboy/fancy, +/obj/item/clothing/under/pants/camo, +/obj/item/clothing/suit/hooded/wintercoat/captain, +/turf/open/floor/wood, +/area/ship/crew/dorm/dormfive) "kK" = ( /obj/effect/spawner/structure/window/shuttle, /obj/machinery/door/poddoor/shutters/preopen{ @@ -1570,21 +1598,6 @@ }, /turf/open/floor/plasteel/tech/techmaint, /area/ship/engineering/engine) -"mb" = ( -/obj/effect/turf_decal/techfloor/orange{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/suit_storage_unit/independent/engineering, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - pixel_y = 21; - pixel_x = -12 - }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/engineering/electrical) "mc" = ( /obj/effect/turf_decal/techfloor{ dir = 6 @@ -1612,18 +1625,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/wood/birch, /area/ship/crew/crewfive) -"mv" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom/wideband/table{ - dir = 1 - }, -/obj/item/toy/plush/knight{ - name = "The Navigator"; - pixel_x = -9; - pixel_y = 5 - }, -/turf/open/floor/plasteel/tech/grid, -/area/ship/bridge) "mz" = ( /obj/effect/spawner/structure/window/shuttle, /obj/machinery/door/poddoor/shutters/preopen{ @@ -1752,6 +1753,19 @@ }, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/starboard) +"nz" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light_switch{ + pixel_x = 20; + dir = 8; + pixel_y = -12 + }, +/turf/open/floor/grass, +/area/ship/crew/hydroponics) "nN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -1828,26 +1842,6 @@ }, /turf/open/floor/carpet, /area/ship/crew/crewfive) -"oN" = ( -/obj/structure/closet/wall/blue{ - dir = 4; - name = "Personal Effects"; - pixel_x = -32 - }, -/obj/item/storage/belt/utility/full, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/item/clothing/under/misc/pj/red, -/obj/item/clothing/under/pants/black, -/obj/item/clothing/under/dress/blacktango, -/obj/item/clothing/suit/apron/overalls, -/obj/item/clothing/suit/gothcoat, -/obj/item/clothing/suit/ianshirt, -/obj/item/clothing/suit/nerdshirt, -/obj/item/clothing/head/beret/eng/hazard, -/obj/item/radio/headset/headset_eng, -/obj/item/cartridge/lawyer, -/turf/open/floor/carpet/nanoweave/red, -/area/ship/crew/dorm/dormfour) "oS" = ( /obj/structure/cable{ icon_state = "2-8" @@ -2006,6 +2000,31 @@ color = "#4c535b" }, /area/ship/hallway/port) +"pT" = ( +/obj/effect/turf_decal/techfloor/orange, +/obj/structure/closet/wall/orange{ + dir = 1; + pixel_y = -32 + }, +/obj/item/stack/tape/industrial/electrical, +/obj/item/stack/tape/industrial, +/obj/item/holosign_creator/engineering, +/obj/item/storage/backpack/duffelbag/engineering, +/obj/item/storage/belt/utility/full/engi, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/rcl/pre_loaded, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/geiger_counter, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/glass/twenty, +/obj/item/circuitboard/machine/cell_charger, +/obj/item/clothing/head/beret/eng, +/obj/item/clothing/head/beret/eng/hazard, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/turf/open/floor/plasteel/tech/grid, +/area/ship/engineering/electrical) "qa" = ( /turf/template_noop, /area/template_noop) @@ -2062,6 +2081,26 @@ }, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/port) +"qV" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/closet/wall{ + dir = 1; + name = "Wardrobe"; + pixel_y = -28 + }, +/obj/item/clothing/head/wig/random, +/obj/item/storage/box/syndie_kit/chameleon, +/obj/item/paper_bin/bundlenatural, +/obj/item/clothing/under/color/jumpskirt/random, +/obj/item/clothing/under/color/random, +/obj/item/clothing/suit/jacket/letterman, +/obj/item/clothing/suit/toggle/lawyer/brown, +/obj/item/clothing/under/suit/burgundy, +/obj/item/clothing/under/pants/red, +/obj/item/clothing/suit/nerdshirt, +/obj/item/storage/bag/books, +/turf/open/floor/wood, +/area/ship/crew/dorm/dormfive) "rc" = ( /obj/structure/bookcase/random/religion, /obj/effect/turf_decal/siding/wood{ @@ -2402,6 +2441,23 @@ }, /turf/open/floor/plating, /area/ship/medical/surgery) +"tU" = ( +/obj/effect/turf_decal/techfloor{ + dir = 10 + }, +/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{ + dir = 10 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/item/storage/overmap_ship/electric/directional/west, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = 11; + pixel_y = -17 + }, +/turf/open/floor/plasteel/tech, +/area/ship/bridge) "tX" = ( /obj/docking_port/stationary{ dwidth = 10; @@ -2568,14 +2624,6 @@ /obj/machinery/vending/boozeomat, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ship/crew/canteen) -"vv" = ( -/obj/machinery/light_switch{ - dir = 8; - pixel_x = 26; - pixel_y = 6 - }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ship/hallway/port) "vx" = ( /turf/open/floor/wood/ebony, /area/ship/crew/canteen) @@ -2871,6 +2919,28 @@ /obj/structure/cable, /turf/open/floor/carpet/nanoweave/red, /area/ship/crew/dorm/dormfour) +"xW" = ( +/obj/structure/closet/wall/orange{ + pixel_y = 32 + }, +/obj/item/clothing/suit/fire/atmos, +/obj/item/clothing/mask/gas/atmos, +/obj/item/clothing/head/hardhat/atmos, +/obj/item/storage/belt/utility/atmostech, +/obj/item/clothing/head/beret/atmos, +/obj/item/circuitboard/machine/shieldwallgen/atmos, +/obj/item/circuitboard/machine/shieldwallgen/atmos, +/obj/item/stack/tape/industrial, +/obj/item/stack/tape/industrial, +/obj/item/storage/backpack/duffelbag/engineering, +/obj/item/extinguisher/advanced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4{ + dir = 4 + }, +/obj/item/clothing/head/beret/atmos, +/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos, +/turf/open/floor/plasteel/tech/techmaint, +/area/ship/engineering/engine) "yg" = ( /obj/machinery/light/directional/north, /obj/structure/chair/sofa/corner, @@ -2915,23 +2985,6 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/plasteel/tech/grid, /area/ship/crew/crewfour) -"yz" = ( -/obj/effect/turf_decal/techfloor{ - dir = 10 - }, -/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{ - dir = 10 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/item/storage/overmap_ship/electric/directional/west, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 11; - pixel_y = -17 - }, -/turf/open/floor/plasteel/tech, -/area/ship/bridge) "yE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3201,31 +3254,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/port) -"Aq" = ( -/obj/effect/turf_decal/techfloor/orange, -/obj/structure/closet/wall/orange{ - dir = 1; - pixel_y = -32 - }, -/obj/item/stack/tape/industrial/electrical, -/obj/item/stack/tape/industrial, -/obj/item/holosign_creator/engineering, -/obj/item/storage/backpack/duffelbag/engineering, -/obj/item/storage/belt/utility/full/engi, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random, -/obj/item/rcl/pre_loaded, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/geiger_counter, -/obj/item/stack/sheet/metal/twenty, -/obj/item/stack/sheet/glass/twenty, -/obj/item/circuitboard/machine/cell_charger, -/obj/item/clothing/head/beret/eng, -/obj/item/clothing/head/beret/eng/hazard, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/turf/open/floor/plasteel/tech/grid, -/area/ship/engineering/electrical) "Ay" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/ship/crew/dorm/dormfour) @@ -3341,11 +3369,6 @@ }, /turf/open/floor/wood, /area/ship/crew/dorm/dormfive) -"BJ" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/grass, -/area/ship/crew/hydroponics) "BK" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -3366,25 +3389,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/starboard) -"BS" = ( -/obj/machinery/light/dim/directional/west, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/corner/opaque/bottlegreen{ - dir = 5 - }, -/obj/effect/turf_decal/corner/opaque/bottlegreen{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/light_switch{ - pixel_y = 21; - pixel_x = -12 - }, -/turf/open/floor/plasteel/white, -/area/ship/medical/surgery) "BV" = ( /obj/structure/table, /obj/structure/window/reinforced/spawner{ @@ -3617,35 +3621,6 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ship/engineering/electrical) -"Dp" = ( -/obj/structure/chair/comfy/brown, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/structure/closet/wall{ - dir = 4; - name = "Wardrobe"; - pixel_x = -28 - }, -/obj/item/clothing/head/wig/random, -/obj/item/clothing/under/color/jumpskirt/random, -/obj/item/clothing/under/color/random, -/obj/item/clothing/under/rank/command/captain/skirt, -/obj/item/clothing/under/rank/command/captain/suit, -/obj/item/pen/fountain/captain, -/obj/item/radio/headset/heads/captain, -/obj/item/storage/backpack/duffelbag/captain, -/obj/item/clothing/suit/hooded/wintercoat/captain, -/obj/item/clothing/suit/armor/vest/capcarapace/duster, -/obj/item/clothing/head/caphat/cowboy, -/obj/item/clothing/shoes/cowboy/fancy, -/obj/item/clothing/under/pants/camo, -/obj/item/clothing/suit/hooded/wintercoat/captain, -/turf/open/floor/wood, -/area/ship/crew/dorm/dormfive) "Du" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3789,17 +3764,6 @@ }, /turf/open/floor/plating, /area/ship/crew/crewfour) -"En" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/light_switch{ - pixel_y = 21; - pixel_x = -12 - }, -/turf/open/floor/plasteel/tech, -/area/ship/storage) "Eo" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable{ @@ -3935,28 +3899,17 @@ }, /turf/open/floor/plasteel/tech, /area/ship/security/armory) -"FW" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/power/apc/auto_name/directional/east, +"FR" = ( +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable{ - icon_state = "0-8" + icon_state = "0-2" }, /obj/machinery/light_switch{ - pixel_x = 20; - dir = 8; - pixel_y = -12 - }, -/turf/open/floor/grass, -/area/ship/crew/hydroponics) -"Ga" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/mob/living/simple_animal/parrot/Poly{ - name = "Polyphema" + pixel_y = 21; + pixel_x = -12 }, /turf/open/floor/plasteel/tech, -/area/ship/crew/crewfour) +/area/ship/storage) "Gb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/layer2{ dir = 4 @@ -4061,6 +4014,18 @@ }, /turf/open/floor/carpet, /area/ship/crew/crewfive) +"GN" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom/wideband/table{ + dir = 1 + }, +/obj/item/toy/plush/knight{ + name = "The Navigator"; + pixel_x = -9; + pixel_y = 5 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/bridge) "GO" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck/tarot{ @@ -4097,26 +4062,6 @@ }, /turf/open/floor/plating, /area/ship/crew/cryo) -"GW" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/closet/wall{ - dir = 1; - name = "Wardrobe"; - pixel_y = -28 - }, -/obj/item/clothing/head/wig/random, -/obj/item/storage/box/syndie_kit/chameleon, -/obj/item/paper_bin/bundlenatural, -/obj/item/clothing/under/color/jumpskirt/random, -/obj/item/clothing/under/color/random, -/obj/item/clothing/suit/jacket/letterman, -/obj/item/clothing/suit/toggle/lawyer/brown, -/obj/item/clothing/under/suit/burgundy, -/obj/item/clothing/under/pants/red, -/obj/item/clothing/suit/nerdshirt, -/obj/item/storage/bag/books, -/turf/open/floor/wood, -/area/ship/crew/dorm/dormfive) "GZ" = ( /obj/structure/window/reinforced, /obj/structure/sink/puddle, @@ -4278,6 +4223,21 @@ }, /turf/open/floor/wood/birch, /area/ship/crew/crewtwo) +"Ib" = ( +/obj/effect/turf_decal/techfloor/orange{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/suit_storage_unit/independent/engineering, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/light_switch{ + pixel_y = 21; + pixel_x = -12 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/engineering/electrical) "If" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -4358,20 +4318,6 @@ }, /turf/open/floor/plasteel/tech/grid, /area/ship/crew/crewfour) -"IF" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - color = "#792f27"; - dir = 9 - }, -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -20; - pixel_y = 12 - }, -/turf/open/floor/wood, -/area/ship/crew/canteen) "IJ" = ( /obj/item/kirbyplants/random, /turf/open/floor/carpet/nanoweave/beige, @@ -4940,6 +4886,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/carpet/nanoweave/beige, /area/ship/hallway/starboard) +"Nd" = ( +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 26; + pixel_y = 6 + }, +/turf/open/floor/carpet/nanoweave/beige, +/area/ship/hallway/port) "Ng" = ( /obj/structure/cable{ icon_state = "1-8" @@ -4976,6 +4930,40 @@ }, /turf/open/floor/wood, /area/ship/crew/canteen) +"Nl" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/suit_storage_unit/independent/engineering, +/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_y = 21; + pixel_x = -12 + }, +/turf/open/floor/plasteel/tech/techmaint, +/area/ship/engineering/engine) +"Nv" = ( +/obj/machinery/light/dim/directional/west, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/corner/opaque/bottlegreen{ + dir = 5 + }, +/obj/effect/turf_decal/corner/opaque/bottlegreen{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/light_switch{ + pixel_y = 21; + pixel_x = -12 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical/surgery) "Ny" = ( /obj/structure/cable{ icon_state = "1-8" @@ -5041,6 +5029,20 @@ }, /turf/open/floor/plasteel/white, /area/ship/crew/canteen) +"NX" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + color = "#792f27"; + dir = 9 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -20; + pixel_y = 12 + }, +/turf/open/floor/wood, +/area/ship/crew/canteen) "Of" = ( /obj/structure/table, /obj/item/reagent_containers/food/drinks/mug{ @@ -5060,20 +5062,14 @@ /turf/open/floor/plasteel, /area/ship/crew/cryo) "Om" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/suit_storage_unit/independent/engineering, -/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer4{ - dir = 6 +/obj/structure/chair/comfy/black{ + dir = 8 }, -/obj/machinery/light_switch{ - pixel_y = 21; - pixel_x = -12 +/mob/living/simple_animal/parrot/Polly{ + name = "Pollyphema" }, -/turf/open/floor/plasteel/tech/techmaint, -/area/ship/engineering/engine) +/turf/open/floor/plasteel/tech, +/area/ship/crew/crewfour) "Oz" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -5156,27 +5152,6 @@ /obj/machinery/vending/clothing, /turf/open/floor/plasteel/tech, /area/ship/crew/cryo) -"OV" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/light_switch{ - dir = 1; - pixel_x = 11; - pixel_y = -17 - }, -/turf/open/floor/carpet/nanoweave/beige, -/area/ship/hallway/starboard) "Pg" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable{ @@ -5402,6 +5377,11 @@ }, /turf/open/floor/wood, /area/ship/crew/dorm/dormfive) +"QH" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/grass, +/area/ship/crew/hydroponics) "QO" = ( /obj/machinery/door/airlock/external, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -5856,6 +5836,26 @@ "TC" = ( /turf/closed/wall/mineral/titanium, /area/ship/storage) +"TI" = ( +/obj/structure/closet/wall/blue{ + dir = 4; + name = "Personal Effects"; + pixel_x = -32 + }, +/obj/item/storage/belt/utility/full, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/item/clothing/under/misc/pj/red, +/obj/item/clothing/under/pants/black, +/obj/item/clothing/under/dress/blacktango, +/obj/item/clothing/suit/apron/overalls, +/obj/item/clothing/suit/gothcoat, +/obj/item/clothing/suit/ianshirt, +/obj/item/clothing/suit/nerdshirt, +/obj/item/clothing/head/beret/eng/hazard, +/obj/item/radio/headset/headset_eng, +/obj/item/cartridge/lawyer, +/turf/open/floor/carpet/nanoweave/red, +/area/ship/crew/dorm/dormfour) "TJ" = ( /obj/structure/closet/wall{ dir = 8; @@ -6923,8 +6923,8 @@ Aa lW fu Qb -BJ -FW +QH +nz Pr GZ Uy @@ -6970,9 +6970,9 @@ Uy Uy Uy Uy -mb +Ib Vn -Aq +pT aO Sp aq @@ -7032,7 +7032,7 @@ wf RI zI Pg -vv +Nd tY tY tY @@ -7134,7 +7134,7 @@ UU vx Ch oS -IF +NX cI Qe vj @@ -7167,7 +7167,7 @@ mA Io UI zF -yz +tU mA fY Fq @@ -7225,7 +7225,7 @@ MJ dD mV Fq -Om +Nl xs Sp aq @@ -7247,7 +7247,7 @@ qa qa qa kR -mv +GN fF ey IU @@ -7267,7 +7267,7 @@ xp rB Dx Fq -hk +xW JX Jq Gs @@ -7379,7 +7379,7 @@ Bm yY mc mA -OV +aE Fq Wk Nj @@ -7633,17 +7633,17 @@ qB bP QW xV -oN +TI Ay eC Lb jp pJ sb -BS +Nv Fl QQ -En +FR SC Ug aq @@ -7878,7 +7878,7 @@ iK QA AL uW -Dp +kC rt iK yr @@ -7921,10 +7921,10 @@ tA Gf XH pK -GW +qV iK XP -Ga +Om ZK mB ID diff --git a/_maps/shuttles/shiptest/inteq_talos.dmm b/_maps/shuttles/shiptest/inteq_talos.dmm index 92187aee8641..3bd00f00ed9a 100644 --- a/_maps/shuttles/shiptest/inteq_talos.dmm +++ b/_maps/shuttles/shiptest/inteq_talos.dmm @@ -553,6 +553,17 @@ /obj/effect/landmark/start/head_of_security, /turf/open/floor/plasteel/dark, /area/ship/bridge) +"dW" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ + dir = 5 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) "dZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -783,26 +794,6 @@ /obj/item/cigbutt, /turf/open/floor/plating/airless, /area/ship/maintenance/port) -"ft" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/structure/fireaxecabinet{ - dir = 1; - pixel_y = -32 - }, -/obj/item/paper/fluff{ - default_raw_text = "Artificer team: The AAC is finicky and has a habit of malfunctioning over time. If this happens, remember how to reset it. Swipe your ID card on the control unit and make sure all settings are correct. One airlock should be set to internal, one to external. Once this is done, cycle the airlock to re-enable automatic mode and lift any stuck bolts. If you aren't an artificer, don't mess with it. You shouldn't have access anyway." - }, -/turf/open/floor/plasteel/tech, -/area/ship/engineering) "fC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/opaque/yellow/warning{ @@ -1167,6 +1158,29 @@ }, /turf/open/floor/plasteel/elevatorshaft, /area/ship/hallway/central) +"hK" = ( +/obj/structure/table/reinforced, +/obj/machinery/fax, +/obj/machinery/button/door{ + id = "talos_bridge"; + name = "Bridge Shutters"; + pixel_x = 6; + pixel_y = 23 + }, +/obj/machinery/button/door{ + id = "talos_windows"; + name = "Window Lockdown"; + pixel_x = -6; + pixel_y = 23 + }, +/obj/effect/turf_decal/corner/opaque/brown{ + dir = 4 + }, +/obj/effect/turf_decal/corner/opaque/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) "hL" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ dir = 4 @@ -1178,18 +1192,6 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/plasteel/patterned, /area/ship/cargo) -"hO" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/structure/catwalk/over, -/turf/open/floor/plating, -/area/ship/engineering) "hQ" = ( /obj/structure/table/reinforced, /obj/item/storage/box/drinkingglasses{ @@ -1248,6 +1250,18 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating/airless, /area/ship/maintenance/starboard) +"im" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) "iu" = ( /obj/machinery/door/airlock/hatch{ dir = 4 @@ -1299,6 +1313,22 @@ }, /turf/open/floor/plasteel/tech, /area/ship/engineering/engine) +"iD" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/analyzer{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/engineering) "iE" = ( /obj/item/storage/backpack/industrial, /obj/item/clothing/suit/hazardvest, @@ -2093,6 +2123,26 @@ }, /turf/open/floor/plasteel/dark, /area/ship/bridge) +"ny" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/fireaxecabinet{ + dir = 1; + pixel_y = -32 + }, +/obj/item/paper/fluff{ + default_raw_text = "Artificer team: The AAC is finicky and has a habit of malfunctioning over time. If this happens, remember how to reset it. Swipe your ID card on the control unit and make sure all settings are correct. One airlock should be set to internal, one to external. Once this is done, cycle the airlock to re-enable automatic mode and lift any stuck bolts. If you aren't an artificer, don't mess with it. You shouldn't have access anyway." + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) "nz" = ( /obj/structure/cable{ icon_state = "4-8" @@ -3177,20 +3227,6 @@ /obj/item/trash/popcorn, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/port) -"tb" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ - dir = 5 - }, -/turf/open/floor/plasteel/tech, -/area/ship/engineering) "te" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ dir = 8 @@ -4999,19 +5035,6 @@ /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel/patterned/grid, /area/ship/hallway/central) -"Fu" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/analyzer{ - pixel_x = 6; - pixel_y = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ship/engineering) "Fx" = ( /obj/structure/chair{ dir = 8 @@ -5712,18 +5735,6 @@ dir = 4 }, /area/ship/cargo) -"KI" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/plasteel/tech, -/area/ship/engineering) "KQ" = ( /obj/effect/turf_decal/industrial/warning/fulltile, /obj/machinery/door/airlock/hatch{ @@ -6230,6 +6241,18 @@ "OF" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ship/engineering) +"OG" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/structure/catwalk/over, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/turf/open/floor/plating, +/area/ship/engineering) "OK" = ( /obj/machinery/cryopod{ dir = 8 @@ -6253,29 +6276,6 @@ }, /turf/open/floor/plasteel/dark, /area/ship/security) -"ON" = ( -/obj/structure/table/reinforced, -/obj/machinery/fax, -/obj/machinery/button/door{ - id = "talos_bridge"; - name = "Bridge Shutters"; - pixel_x = 6; - pixel_y = 23 - }, -/obj/machinery/button/door{ - id = "talos_windows"; - name = "Window Lockdown"; - pixel_x = -6; - pixel_y = 23 - }, -/obj/effect/turf_decal/corner/opaque/brown{ - dir = 4 - }, -/obj/effect/turf_decal/corner/opaque/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ship/bridge) "OP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, @@ -6455,19 +6455,6 @@ }, /turf/open/floor/plasteel/tech, /area/ship/engineering) -"Qt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "burn chamber input pump" - }, -/obj/machinery/atmospherics/pipe/simple/dark/visible/layer1{ - dir = 5 - }, -/turf/open/floor/plasteel/tech, -/area/ship/engineering/engine) "Qu" = ( /obj/effect/turf_decal/industrial/warning{ dir = 4 @@ -7324,6 +7311,22 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/airless, /area/ship/cargo/port) +"We" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "burn chamber input pump" + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering/engine) "Wf" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /obj/structure/cable, @@ -7877,8 +7880,8 @@ bM UG UM lO -tb -KI +dW +im cn pU pU @@ -7887,7 +7890,7 @@ pU pU pU Vk -Qt +We dl pm iA @@ -7911,8 +7914,8 @@ OF jf ak Uc -hO -Fu +OG +iD Lo dw ge @@ -8185,7 +8188,7 @@ Xg Ps sW eT -ft +ny xI Oq kD @@ -8624,7 +8627,7 @@ lC wE qW mX -ON +hK qM cf Lc diff --git a/_maps/shuttles/shiptest/inteq_vaquero.dmm b/_maps/shuttles/shiptest/inteq_vaquero.dmm index 4019964cc483..2e8d626d4e5a 100644 --- a/_maps/shuttles/shiptest/inteq_vaquero.dmm +++ b/_maps/shuttles/shiptest/inteq_vaquero.dmm @@ -1677,7 +1677,6 @@ /turf/open/floor/plasteel/dark, /area/ship/crew/office) "Ax" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/corner/opaque/yellow{ dir = 1 }, diff --git a/_maps/shuttles/shiptest/solgov_chronicle.dmm b/_maps/shuttles/shiptest/solgov_chronicle.dmm index a501fcd211f5..56b5e7d3df8a 100644 --- a/_maps/shuttles/shiptest/solgov_chronicle.dmm +++ b/_maps/shuttles/shiptest/solgov_chronicle.dmm @@ -175,8 +175,7 @@ /area/ship/cargo) "bs" = ( /obj/machinery/telecomms/broadcaster/preset_left{ - network = "SolNet"; - pixel_y = 0 + network = "SolNet" }, /obj/machinery/door/window/brigdoor/northright{ dir = 2; @@ -676,7 +675,6 @@ /area/ship/cargo) "gi" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/railing/wood{ @@ -759,7 +757,6 @@ "hp" = ( /obj/structure/table/wood, /obj/structure/railing/wood{ - dir = 2; color = "#792f27" }, /obj/item/reagent_containers/food/snacks/grown/cabbage{ @@ -1833,7 +1830,6 @@ /area/ship/cargo) "sq" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/cable{ @@ -1875,7 +1871,6 @@ /area/ship/security/armory) "sz" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/railing/wood{ @@ -2001,7 +1996,6 @@ req_one_access = list(61,11) }, /obj/machinery/telecomms/message_server{ - pixel_y = 0; autolinkers = list("solgovPDA"); network = "SolNet"; calibrating = 0 @@ -2087,7 +2081,6 @@ /area/ship/engineering) "uK" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/cable{ @@ -2240,7 +2233,6 @@ /obj/item/kirbyplants{ icon_state = "plant-11"; pixel_x = 10; - pixel_y = 0; layer = 2.89 }, /obj/structure/table/wood/fancy/purple, @@ -2571,9 +2563,6 @@ /obj/effect/turf_decal/atmos/oxygen{ layer = 2.04 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, @@ -2581,6 +2570,9 @@ dir = 1 }, /obj/effect/turf_decal/techfloor/orange, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/plasteel/tech/grid, /area/ship/engineering/engine) "zs" = ( @@ -2804,7 +2796,6 @@ /obj/machinery/telecomms/processor{ autolinkers = list("processor7"); network = "SolNet"; - pixel_y = 0; id = "Processor" }, /obj/structure/window/reinforced, @@ -3026,7 +3017,6 @@ /area/ship/crew/office) "Ds" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/cable{ @@ -3070,7 +3060,6 @@ }, /obj/machinery/firealarm/directional/north, /obj/machinery/light_switch{ - dir = 2; pixel_y = 22; pixel_x = -12 }, @@ -3220,7 +3209,6 @@ icon_state = "0-8" }, /obj/machinery/light_switch{ - dir = 2; pixel_y = 22; pixel_x = -12 }, @@ -3544,8 +3532,7 @@ "IH" = ( /obj/machinery/telecomms/server/presets/solgov{ autolinkers = list("solgov","sproingle"); - network = "SolNet"; - pixel_y = 0 + network = "SolNet" }, /obj/machinery/door/window/brigdoor/northleft{ dir = 2; @@ -3722,7 +3709,6 @@ /area/ship/engineering) "Kc" = ( /obj/effect/turf_decal/siding/wood{ - dir = 2; color = "#543C30" }, /obj/structure/cable{ @@ -3746,9 +3732,7 @@ /obj/effect/turf_decal/spline/fancy/wood{ dir = 4 }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 2 - }, +/obj/effect/turf_decal/siding/wood/end, /obj/structure/fluff/hedge, /turf/open/floor/wood/walnut, /area/ship/crew/crewtwo) @@ -4016,7 +4000,6 @@ "Nu" = ( /obj/structure/table/wood, /obj/structure/railing/wood{ - dir = 2; color = "#792f27" }, /obj/machinery/light/small/directional/west, @@ -4117,8 +4100,7 @@ pixel_y = -1 }, /obj/item/folder/solgov{ - pixel_x = 4; - pixel_y = 0 + pixel_x = 4 }, /obj/item/pen/solgov{ pixel_x = 2 @@ -4493,7 +4475,6 @@ dir = 8 }, /obj/machinery/light_switch{ - dir = 2; pixel_y = 22; pixel_x = -12 }, @@ -4560,7 +4541,6 @@ "SJ" = ( /obj/machinery/telecomms/receiver/preset_left{ network = "SolNet"; - pixel_y = 0; id = "Receiver" }, /obj/structure/window/reinforced{ @@ -4585,8 +4565,7 @@ pixel_y = -1 }, /obj/item/folder/solgov{ - pixel_x = 4; - pixel_y = 0 + pixel_x = 4 }, /obj/item/pen/solgov{ pixel_x = 2 @@ -5157,7 +5136,6 @@ dir = 8 }, /obj/machinery/light_switch{ - dir = 2; pixel_y = 22; pixel_x = -12 }, diff --git a/_maps/shuttles/shiptest/syndicate_aegis.dmm b/_maps/shuttles/shiptest/syndicate_aegis.dmm index 6f807bf52bd3..94ce81e53d3d 100644 --- a/_maps/shuttles/shiptest/syndicate_aegis.dmm +++ b/_maps/shuttles/shiptest/syndicate_aegis.dmm @@ -499,6 +499,28 @@ }, /turf/open/floor/wood/walnut, /area/ship/bridge) +"dB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/closet/firecloset/wall{ + pixel_y = 29 + }, +/obj/structure/catwalk/over, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ship/engineering) "dH" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -709,25 +731,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/plasteel/tech/techmaint, /area/ship/engineering) -"fH" = ( -/obj/structure/table/wood/reinforced, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = 11; - pixel_y = 9 - }, -/obj/item/radio/intercom/wideband/directional/north, -/obj/machinery/fax, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium/red{ - icon_state = "plastitanium" - }, -/area/ship/bridge) "fJ" = ( /obj/structure/closet/wall/orange{ name = "fuel locker"; @@ -2313,6 +2316,11 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ship/hallway/central) +"up" = ( +/obj/machinery/light/directional/north, +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet/red, +/area/ship/crew/canteen) "uA" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -2711,31 +2719,6 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/plasteel/tech/techmaint, /area/ship/engineering) -"yu" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/obj/structure/closet/firecloset/wall{ - pixel_y = 29 - }, -/obj/structure/catwalk/over, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ship/engineering) "yA" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -3196,14 +3179,6 @@ }, /turf/open/floor/carpet/red, /area/ship/crew/canteen) -"Ez" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/structure/chair/sofa/left, -/turf/open/floor/carpet/red, -/area/ship/crew/canteen) "EJ" = ( /obj/machinery/power/shuttle/engine/fueled/plasma{ dir = 1 @@ -4264,6 +4239,25 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ship/hallway/central) +"OW" = ( +/obj/structure/table/wood/reinforced, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 11; + pixel_y = 9 + }, +/obj/item/radio/intercom/wideband/directional/north, +/obj/machinery/fax, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium/red{ + icon_state = "plastitanium" + }, +/area/ship/bridge) "Pc" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -5585,7 +5579,7 @@ xO go qM hl -Ez +up iO Ee aP @@ -5925,7 +5919,7 @@ wk wk gq uM -fH +OW jW kI uM @@ -6077,7 +6071,7 @@ Xr XY Dt It -yu +dB ZJ FS gx diff --git a/_maps/shuttles/shiptest/syndicate_luxembourg.dmm b/_maps/shuttles/shiptest/syndicate_luxembourg.dmm index 2248c1f12c6b..1f8f1132f0d7 100644 --- a/_maps/shuttles/shiptest/syndicate_luxembourg.dmm +++ b/_maps/shuttles/shiptest/syndicate_luxembourg.dmm @@ -441,16 +441,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plasteel/tech/techmaint, /area/ship/crew/dorm) -"in" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 5 - }, -/obj/structure/catwalk/over/plated_catwalk, -/turf/open/floor/plating, -/area/ship/engineering) "it" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/shieldwallgen/atmos{ @@ -509,6 +499,22 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/ship/engineering) +"iZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 9 + }, +/obj/structure/catwalk/over/plated_catwalk/white, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ship/engineering) "jr" = ( /turf/open/floor/carpet/red_gold, /area/ship/hallway/central) @@ -541,17 +547,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/mono/dark, /area/ship/storage) -"kp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/rack, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/corner/opaque/neutral/mono, -/turf/open/floor/plasteel/mono/dark, -/area/ship/hallway/central) "ks" = ( /obj/structure/closet/crate, /obj/item/gun_voucher, @@ -714,19 +709,6 @@ /obj/item/radio/headset, /turf/open/floor/plasteel/dark, /area/ship/crew/dorm) -"nG" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 9 - }, -/obj/structure/catwalk/over/plated_catwalk/white, -/turf/open/floor/plating, -/area/ship/engineering) "ow" = ( /obj/effect/spawner/structure/window/plasma/reinforced/plastitanium, /obj/machinery/door/poddoor/shutters{ @@ -967,29 +949,6 @@ }, /turf/open/floor/plasteel/mono/dark, /area/ship/cargo) -"tc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!"; - name = "angry letter from upper management" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/mono/dark, -/area/ship/crew/canteen) "tx" = ( /obj/machinery/power/port_gen/pacman, /obj/structure/cable/yellow{ @@ -1498,6 +1457,14 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/plasteel/mono/dark, /area/ship/crew/canteen) +"DE" = ( +/obj/structure/rack, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/corner/opaque/neutral/mono, +/turf/open/floor/plasteel/mono/dark, +/area/ship/hallway/central) "DG" = ( /obj/machinery/light/directional/south, /obj/structure/rack, @@ -1587,6 +1554,19 @@ }, /turf/open/floor/plasteel/mono/dark, /area/ship/engineering) +"Fj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, +/obj/item/paper{ + desc = "A piece of paper depicting a extremely pissed up upper manager"; + default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!"; + name = "angry letter from upper management" + }, +/turf/open/floor/plasteel/patterned/cargo_one, +/area/ship/storage) "Fq" = ( /obj/structure/cable{ icon_state = "4-8" @@ -1923,6 +1903,29 @@ }, /turf/open/floor/plasteel/dark, /area/ship/hallway/central) +"Lr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/item/paper{ + desc = "A piece of paper depicting a extremely pissed up upper manager"; + default_raw_text = "YOU ARENT SUPPOSED TO BE MINING, HEAR ME!?!! YOU'RE SUPPOSED TO BE SELLING SHIT TO THE CONSUMERS YOU HEAR!! AS PUNISHMENT FOR THE LAST SHIFT, I HAVE REMOVED ALLL OF YOUR MINING TOOLS!! NOW GET BACK TO WORK!!"; + name = "angry letter from upper management" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/mono/dark, +/area/ship/crew/canteen) "Lu" = ( /obj/structure/chair/plastic{ dir = 1 @@ -2671,19 +2674,6 @@ }, /turf/open/floor/plasteel/patterned/cargo_one, /area/ship/storage) -"YX" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, -/obj/item/paper{ - desc = "A piece of paper depicting a extremely pissed up upper manager"; - default_raw_text = "YOU DAMNNED FOOLS! YOU ARENT SUPPOSED TO USE YOUR STOCK, YOU'RE SUPPOSED TO SELL THEM!! WE AREN'T WASTING MY MONEY ARE WE!?! NOW GET BACK TO WORK!!!"; - name = "angry letter from upper management" - }, -/turf/open/floor/plasteel/patterned/cargo_one, -/area/ship/storage) "YZ" = ( /obj/structure/closet/secure{ icon_state = "eng_secure"; @@ -2728,6 +2718,19 @@ /obj/structure/catwalk/over/plated_catwalk, /turf/open/floor/plating, /area/ship/engineering) +"ZV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ + dir = 5 + }, +/obj/structure/catwalk/over/plated_catwalk, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ship/engineering) (1,1,1) = {" Nr @@ -2890,7 +2893,7 @@ JU Ka JO iO -YX +Fj YO YK ks @@ -2926,7 +2929,7 @@ hm rU Ro uo -in +ZV mK vp pt @@ -3060,7 +3063,7 @@ dH Sn TP TP -kp +DE Jr PO vp @@ -3143,7 +3146,7 @@ YI YI qf HZ -tc +Lr Dw rq YI @@ -3157,7 +3160,7 @@ Ai FV Wh eL -nG +iZ bt CT vp diff --git a/_maps/shuttles/shiptest/syndicate_twinkleshine.dmm b/_maps/shuttles/shiptest/syndicate_twinkleshine.dmm index 3a7d800a4f22..6390f43501cd 100644 --- a/_maps/shuttles/shiptest/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/shiptest/syndicate_twinkleshine.dmm @@ -881,21 +881,6 @@ /obj/effect/turf_decal/trimline/opaque/syndiered/filled/line, /turf/open/floor/plasteel/dark, /area/ship/medical) -"fU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/effect/turf_decal/industrial/warning{ - dir = 1 - }, -/turf/open/floor/plasteel/tech, -/area/ship/hallway/central) "fV" = ( /obj/machinery/door/airlock/atmos/glass{ name = "Atmospherics"; @@ -5561,6 +5546,18 @@ /obj/structure/mecha_wreckage/ripley/deathripley, /turf/open/floor/plasteel/tech/grid, /area/ship/bridge) +"GW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ship/hallway/central) "GZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -6602,14 +6599,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ship/security) -"Nm" = ( -/obj/structure/table/reinforced, -/obj/machinery/fax, -/obj/effect/turf_decal/corner/opaque/syndiered/half{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/ship/bridge) "No" = ( /obj/effect/turf_decal/corner/transparent/bar/diagonal, /obj/machinery/holopad/emergency, @@ -8281,6 +8270,14 @@ /obj/effect/turf_decal/corner/opaque/syndiered, /turf/open/floor/mineral/plastitanium, /area/ship/bridge) +"Xc" = ( +/obj/structure/table/reinforced, +/obj/machinery/fax, +/obj/effect/turf_decal/corner/opaque/syndiered/half{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/ship/bridge) "Xf" = ( /obj/structure/rack, /obj/effect/turf_decal/box/white/corners{ @@ -9973,7 +9970,7 @@ IV Ya Sb RW -fU +GW pO je KI @@ -10008,7 +10005,7 @@ IV ql Yj RW -fU +GW kf je hb @@ -10119,7 +10116,7 @@ nb Pv pp nb -Nm +Xc Kk KB zp diff --git a/_maps/shuttles/subshuttles/independent_superpill.dmm b/_maps/shuttles/subshuttles/independent_superpill.dmm index 9677aeafed5e..fc0dacddc501 100644 --- a/_maps/shuttles/subshuttles/independent_superpill.dmm +++ b/_maps/shuttles/subshuttles/independent_superpill.dmm @@ -52,9 +52,6 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2, /obj/machinery/atmospherics/pipe/simple/general/visible/layer4, /obj/machinery/atmospherics/pipe/simple/general/visible, @@ -182,10 +179,6 @@ /obj/machinery/door/window{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 5 - }, /obj/structure/window/reinforced/tinted{ dir = 4 }, @@ -206,6 +199,9 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/clothing/head/helmet/space/orange, /obj/item/tank/internals/plasma/full, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, /turf/open/floor/plasteel/tech/grid, /area/ship/storage) diff --git a/check_regex.yaml b/check_regex.yaml index 7e5269c30a78..9f7232c04d0b 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -44,7 +44,7 @@ standards: ] - exactly: [0, "incorrect indentations", '^(?: +)(?!\*)'] - exactly: [0, "superflous whitespace", '[ \t]+$'] - - exactly: [8, "mixed indentation", '^( +\t+|\t+ +)'] + - exactly: [0, "mixed indentation", '^( +\t+|\t+ +)'] - exactly: [21, 'padding inside parentheses', '\(([\t ]+([^)"\n\\]*)|([^("\n]+)[\t ]+)\)'] - no_more: diff --git a/code/__DEFINES/atoms.dm b/code/__DEFINES/atoms.dm new file mode 100644 index 000000000000..3c7b67070f88 --- /dev/null +++ b/code/__DEFINES/atoms.dm @@ -0,0 +1,4 @@ +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index ae027233c9e7..8f1f667a79f7 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -62,7 +62,7 @@ #define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0 -#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + cd_time) +#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time)) //Returns true if the cooldown has run its course, false otherwise #define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index bb0510ea91ca..e0ac4b177001 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -138,6 +138,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define INDESTRUCTIBLE (1<<6) /// can't be frozen #define FREEZE_PROOF (1<<7) +/// Should this object not be destroyed when a shuttle lands on it? +#define LANDING_PROOF (1<<8) +/// Should this object be able to be in hyperspace without being deleted? +#define HYPERSPACE_PROOF (1<<9) //tesla_zap #define ZAP_MACHINE_EXPLOSIVE (1<<0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index e4f600dcea6a..99cff793a761 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -430,3 +430,6 @@ #define THROW_MODE_DISABLED 0 #define THROW_MODE_TOGGLE 1 #define THROW_MODE_HOLD 2 + +//Saves a proc call, life is suffering. If who has no targets_from var, we assume it's just who +#define GET_TARGETS_FROM(who) (who.targets_from ? who.get_targets_from() : who) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index dfecc6f8af6b..570edb76d8c4 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -2,18 +2,19 @@ #define EMAGGED (1<<0) -#define IN_USE (1<<1) // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! -#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? -#define BEING_SHOCKED (1<<3) // Whether this thing is currently (already) being shocked by a tesla -#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no -#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? -#define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing? -#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. +#define IN_USE (1<<1) //! If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! +#define CAN_BE_HIT (1<<2) //! can this be bludgeoned by items? +#define BEING_SHOCKED (1<<3) //! Whether this thing is currently (already) being shocked by a tesla +#define DANGEROUS_POSSESSION (1<<4) //! Admin possession yes/no +#define ON_BLUEPRINTS (1<<5) //! Are we visible on the station blueprints at roundstart? +#define UNIQUE_RENAME (1<<6) //! can you customize the description/name of the thing? +#define USES_TGUI (1<<7) //! put on things that use tgui on ui_interact instead of custom/old UI. #define FROZEN (1<<8) -#define BLOCK_Z_OUT_DOWN (1<<9) // Should this object block z falling from loc? -#define BLOCK_Z_OUT_UP (1<<10) // Should this object block z uprise from loc? -#define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above? -#define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below? +#define BLOCK_Z_OUT_DOWN (1<<9) //! Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<10) //! Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<11) //! Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<12) //! Should this object block z uprise from below? + // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index d6a08b3174f8..86c3ad465250 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -30,6 +30,13 @@ #define GC_QUEUE_HARDDELETE 3 //! short queue for things that hard delete instead of going thru the gc subsystem, this is purely so if they *can* softdelete, they will soft delete rather then wasting time with a hard delete. #define GC_QUEUE_COUNT 3 //! Number of queues, used for allocating the nested lists. Don't forget to increase this if you add a new queue stage + +// Defines for the ssgarbage queue items +#define GC_QUEUE_ITEM_QUEUE_TIME 1 //! Time this item entered the queue +#define GC_QUEUE_ITEM_REF 2 //! Ref to the item +#define GC_QUEUE_ITEM_GCD_DESTROYED 3 //! Item's gc_destroyed var value. Used to detect ref reuse. +#define GC_QUEUE_ITEM_INDEX_COUNT 3 //! Number of item indexes, used for allocating the nested lists. Don't forget to increase this if you add a new queue item index + // Defines for the time an item has to get its reference cleaned before it fails the queue and moves to the next. #define GC_FILTER_QUEUE 1 SECONDS #define GC_CHECK_QUEUE 5 MINUTES diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 184f7e754103..5fd64af432cf 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -87,6 +87,9 @@ ///Call qdel on the atom after intialization #define INITIALIZE_HINT_QDEL 2 +///Call qdel with a force of TRUE after initialization +#define INITIALIZE_HINT_QDEL_FORCE 3 + ///type and all subtypes should always immediately call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){ \ ..(); \ @@ -162,7 +165,6 @@ #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_SPACEDRIFT 30 -#define FIRE_PRIORITY_FIELDS 30 #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_NETWORKS 40 #define FIRE_PRIORITY_OBJ 40 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 529274a50b39..ea51a1c96113 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -216,6 +216,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOMOBSWAP "no-mob-swap" #define TRAIT_XRAY_VISION "xray_vision" #define TRAIT_THERMAL_VISION "thermal_vision" +/// We have some form of forced gravity acting on us +#define TRAIT_FORCED_GRAVITY "forced_gravity" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" #define TRAIT_SURGEON "surgeon" @@ -423,3 +425,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_SAFE_STORAGE "fish_case" /// Stuff that can go inside fish cases #define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" + +/// Trait granted by [mob/living/silicon/ai] +/// Applied when the ai anchors itself +#define AI_ANCHOR_TRAIT "ai_anchor" diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 314549a4f464..df8a952c05b5 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -35,6 +35,18 @@ SEND_TEXT(world.log, text) #endif +#if defined(REFERENCE_DOING_IT_LIVE) +#define log_reftracker(msg) log_harddel("## REF SEARCH [msg]") + +/proc/log_harddel(text) + WRITE_LOG(GLOB.harddel_log, text) + +#elif defined(REFERENCE_TRACKING) // Doing it locally +#define log_reftracker(msg) log_world("## REF SEARCH [msg]") + +#else //Not tracking at all +#define log_reftracker(msg) +#endif /* Items with ADMINPRIVATE prefixed are stripped from public logs. */ /proc/log_admin(text) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 1a3c6526150a..2b3f3e41e444 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -40,12 +40,23 @@ block( \ if(istype(T)) return T +///Returns a list with all the adjacent open turfs. /proc/get_adjacent_open_turfs(atom/center) - . = list(get_open_turf_in_dir(center, NORTH), - get_open_turf_in_dir(center, SOUTH), - get_open_turf_in_dir(center, EAST), - get_open_turf_in_dir(center, WEST)) - listclearnulls(.) + var/list/hand_back = list() + // Inlined get_open_turf_in_dir, just to be fast + var/turf/open/new_turf = get_step(center, NORTH) + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, SOUTH) + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, EAST) + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, WEST) + if(istype(new_turf)) + hand_back += new_turf + return hand_back /proc/get_adjacent_open_areas(atom/center) . = list() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 9ca24f24cb7e..ea9ceee0f417 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -379,16 +379,16 @@ Turf and target are separate in case you want to teleport some distance from a t break return turf_to_check -//Returns a list of all locations (except the area) the movable is within. -/proc/get_nested_locs(atom/movable/AM, include_turf = FALSE) +///Returns a list of all locations (except the area) the movable is within. +/proc/get_nested_locs(atom/movable/atom_on_location, include_turf = FALSE) . = list() - var/atom/location = AM.loc - var/turf/turf = get_turf(AM) - while(location && location != turf) + var/atom/location = atom_on_location.loc + var/turf/our_turf = get_turf(atom_on_location) + while(location && location != our_turf) . += location location = location.loc - if(location && include_turf) //At this point, only the turf is left, provided it exists. - . += location + if(our_turf && include_turf) //At this point, only the turf is left, provided it exists. + . += our_turf // returns the turf located at the map edge in the specified direction relative to A // used for mass driver diff --git a/code/__HELPERS/virtual_z_level.dm b/code/__HELPERS/virtual_z_level.dm index a218539de4b0..b00c77b80b83 100644 --- a/code/__HELPERS/virtual_z_level.dm +++ b/code/__HELPERS/virtual_z_level.dm @@ -24,6 +24,7 @@ return my_turf.virtual_z /atom/proc/get_virtual_level() + RETURN_TYPE(/datum/virtual_level) return /atom/movable/get_virtual_level() @@ -45,3 +46,7 @@ var/datum/virtual_level/vlevel = get_virtual_level() if(vlevel) return vlevel.parent_map_zone + +/atom/proc/get_relative_location() + var/datum/virtual_level/vlevel = get_virtual_level() + return vlevel?.get_relative_coords(src) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 4b661c80e6e7..0b73aa7172c3 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -15,9 +15,14 @@ //#define REFERENCE_TRACKING #ifdef REFERENCE_TRACKING +///Used for doing dry runs of the reference finder, to test for feature completeness +///Slightly slower, higher in memory. Just not optimal +//#define REFERENCE_TRACKING_DEBUG + ///Run a lookup on things hard deleting by default. //#define GC_FAILURE_HARD_LOOKUP #ifdef GC_FAILURE_HARD_LOOKUP +///Don't stop when searching, go till you're totally done #define FIND_REF_NO_CHECK_TICK #endif //ifdef GC_FAILURE_HARD_LOOKUP @@ -26,6 +31,16 @@ //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green #endif //ifdef TESTING +/// If this is uncommented, we set up the ref tracker to be used in a live environment +/// And to log events to [log_dir]/harddels.log +//#define REFERENCE_DOING_IT_LIVE +#ifdef REFERENCE_DOING_IT_LIVE +// compile the backend +#define REFERENCE_TRACKING +// actually look for refs +#define GC_FAILURE_HARD_LOOKUP +#endif // REFERENCE_DOING_IT_LIVE + //#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER #ifndef PRELOAD_RSC //set to: @@ -72,6 +87,14 @@ #define TESTING #endif +#ifdef UNIT_TESTS +//Hard del testing defines +#define REFERENCE_TRACKING +#define REFERENCE_TRACKING_DEBUG +#define FIND_REF_NO_CHECK_TICK +#define GC_FAILURE_HARD_LOOKUP +#endif + // A reasonable number of maximum overlays an object needs // If you think you need more, rethink it #define MAX_ATOM_OVERLAYS 100 diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 905fd5039ca5..406f0bb0b101 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -202,6 +202,11 @@ DEFINE_BITFIELD(obj_flags, list( "ON_BLUEPRINTS" = ON_BLUEPRINTS, "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, + "FROZEN" = FROZEN, + "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, + "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, + "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, )) DEFINE_BITFIELD(pass_flags, list( @@ -222,7 +227,9 @@ DEFINE_BITFIELD(resistance_flags, list( "UNACIDABLE" = UNACIDABLE, "ACID_PROOF" = ACID_PROOF, "INDESTRUCTIBLE" = INDESTRUCTIBLE, - "FREEZE_PROOF" = FREEZE_PROOF + "FREEZE_PROOF" = FREEZE_PROOF, + "LANDING_PROOF" = LANDING_PROOF, + "HYPERSPACE_PROOF" = HYPERSPACE_PROOF, )) DEFINE_BITFIELD(sight, list( diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index e83b4bfca48e..181752707d4d 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -49,6 +49,11 @@ GLOBAL_PROTECT(perf_log) GLOBAL_VAR(demo_log) GLOBAL_PROTECT(demo_log) +#ifdef REFERENCE_DOING_IT_LIVE +GLOBAL_VAR(harddel_log) +GLOBAL_PROTECT(harddel_log) +#endif + GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) GLOBAL_LIST_EMPTY(admin_log) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 2528c246dcf4..944847959158 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -104,7 +104,7 @@ */ /turf/proc/ClickCross(target_dir, border_only, target_atom = null, atom/movable/mover = null) for(var/obj/O in src) - if((mover && O.CanPass(mover,get_step(src,target_dir))) || (!mover && !O.density)) + if((mover && O.CanPass(mover, target_dir)) || (!mover && !O.density)) continue if(O == target_atom || O == mover || (O.pass_flags_self & LETPASSTHROW)) //check if there's a dense object present on the turf continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 8071bec684b7..e8e6daccf45b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -657,12 +657,13 @@ so as to remain in compliance with the most up-to-date laws." desc = "A body was created. You can enter it." icon_state = "template" timeout = 300 - var/atom/target = null + var/datum/weakref/target_ref var/action = NOTIFY_JUMP /atom/movable/screen/alert/notify_action/Click() if(!usr || !usr.client || usr != owner) return + var/atom/target = target_ref?.resolve() if(!target) return var/mob/dead/observer/G = usr diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 603754d2c093..01e4cd1de1f4 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -63,11 +63,15 @@ GLOBAL_LIST_INIT(patrons, world.file2list("[global.config.directory]/patrons.txt QDEL_IN(src, CREDIT_ROLL_SPEED) /atom/movable/screen/credit/proc/add_to_clients() - for(var/client/C in GLOB.clients) - if(C.prefs.show_credits) + for(var/client/C as anything in GLOB.clients) + if(C?.prefs.show_credits) C.screen += src /atom/movable/screen/credit/Destroy() + for(var/client/C as anything in GLOB.clients) + if(!C) + continue + C.screen -= src screen_loc = null return ..() diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ccdc23d552f9..457a7ad5a599 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -283,6 +283,12 @@ icon_state = "[base_icon_state]_[robot?.lamp_enabled ? "on" : "off"]" return ..() +/atom/movable/screen/robot/lamp/Destroy() + if(robot) + robot.lampButton = null + robot = null + return ..() + /atom/movable/screen/robot/modPC name = "Modular Interface" icon_state = "template" @@ -294,6 +300,12 @@ return robot.modularInterface?.interact(robot) +/atom/movable/screen/robot/modPC/Destroy() + if(robot) + robot.interfaceButton = null + robot = null + return ..() + /atom/movable/screen/robot/alerts name = "Alert Panel" icon = 'icons/hud/screen_ai.dmi' diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 7266013b35a8..557096d83c82 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -684,6 +684,8 @@ /atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy . = ..() + if(!istype(C)) + return holder = C diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6f55532aed39..a7cf982a8865 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -673,8 +673,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /datum/controller/master/StartLoadingMap() //disallow more than one map to load at once, multithreading it will just cause race conditions - while(map_loading) - stoplag() + UNTIL(!map_loading) for(var/S in subsystems) var/datum/controller/subsystem/SS = S SS.StartLoadingMap() diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 4351ad863ea9..56b50beee9ce 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -33,8 +33,17 @@ SUBSYSTEM_DEF(air) var/list/expansion_queue = list() var/list/deferred_airs = list() var/max_deferred_airs = 0 + + ///List of all currently processing atmos machinery that doesn't interact with the air around it var/list/obj/machinery/atmos_machinery = list() + ///List of all currently processing atmos machinery that interacts with its loc's air var/list/obj/machinery/atmos_air_machinery = list() + + ///Atmos machinery that will be added to atmos_machinery once maploading is finished + var/list/obj/machinery/deferred_atmos_machinery = list() + ///Air atmos machinery that will be added to atmos_air_machinery once maploading is finished + var/list/obj/machinery/deferred_atmos_air_machinery = list() + var/list/pipe_init_dirs_cache = list() //atmos singletons @@ -67,8 +76,6 @@ SUBSYSTEM_DEF(air) var/excited_group_pressure_goal = 1 - var/is_test_loading = FALSE - /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" msg += "HP:[round(cost_highpressure,1)]|" @@ -111,13 +118,13 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/auxtools_update_reactions() /proc/reset_all_air() - SSair.can_fire = 0 + SSair.can_fire = FALSE message_admins("Air reset begun.") for(var/turf/open/T in world) T.Initalize_Atmos(0) CHECK_TICK message_admins("Air reset done.") - SSair.can_fire = 1 + SSair.can_fire = TRUE /datum/controller/subsystem/air/proc/thread_running() return FALSE @@ -159,8 +166,7 @@ SUBSYSTEM_DEF(air) // This is only machinery like filters, mixers that don't interact with air if(currentpart == SSAIR_ATMOSMACHINERY) timer = TICK_USAGE_REAL - if(!is_test_loading) - process_atmos_machinery(resumed) + process_atmos_machinery(resumed) cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return @@ -197,8 +203,7 @@ SUBSYSTEM_DEF(air) currentpart = SSAIR_ATMOSMACHINERY_AIR if(currentpart == SSAIR_ATMOSMACHINERY_AIR) timer = TICK_USAGE_REAL - if(!is_test_loading) - process_atmos_air_machinery(resumed) + process_atmos_air_machinery(resumed) cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return @@ -284,14 +289,20 @@ SUBSYSTEM_DEF(air) * Arguments: * * machine - The machine to start processing. Can be any /obj/machinery. */ -/datum/controller/subsystem/air/proc/start_processing_machine(obj/machinery/machine) +/datum/controller/subsystem/air/proc/start_processing_machine(obj/machinery/machine, mapload) if(machine.atmos_processing) return machine.atmos_processing = TRUE if(machine.interacts_with_air) - atmos_air_machinery += machine + if(mapload) + deferred_atmos_air_machinery += machine + else + atmos_air_machinery += machine else - atmos_machinery += machine + if(mapload) + deferred_atmos_machinery += machine + else + atmos_machinery += machine /** * Removes a given machine to the processing system for SSAIR_ATMOSMACHINERY processing. @@ -305,8 +316,10 @@ SUBSYSTEM_DEF(air) machine.atmos_processing = FALSE if(machine.interacts_with_air) atmos_air_machinery -= machine + deferred_atmos_air_machinery -= machine else atmos_machinery -= machine + deferred_atmos_machinery -= machine // If we're currently processing atmos machines, there's a chance this machine is in // the currentrun list, which is a cache of atmos_machinery. Remove it from that list @@ -396,12 +409,8 @@ SUBSYSTEM_DEF(air) if(item in net.members) continue if(item.parent) - var/static/pipenetwarnings = 10 - if(pipenetwarnings > 0) - log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") - pipenetwarnings-- - if(pipenetwarnings == 0) - log_mapping("build_pipeline(): further messages about pipenets will be suppressed") + log_mapping("Doubled atmosmachine found at [AREACOORD(item)] with other contents: [json_encode(item.loc.contents)]") + item.stack_trace("Possible doubled atmosmachine") net.members += item border += item @@ -469,7 +478,7 @@ SUBSYSTEM_DEF(air) if(!M) atmos_air_machinery -= M if(M.process_atmos(seconds) == PROCESS_KILL) - atmos_air_machinery.Remove(M) + stop_processing_machine(M) if(MC_TICK_CHECK) return @@ -570,6 +579,14 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/StopLoadingMap() map_loading = FALSE + if(length(deferred_atmos_machinery)) + atmos_machinery += deferred_atmos_machinery + deferred_atmos_machinery.Cut() + + if(length(deferred_atmos_air_machinery)) + atmos_air_machinery += deferred_atmos_air_machinery + deferred_atmos_air_machinery.Cut() + /datum/controller/subsystem/air/proc/setup_allturfs() var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) var/times_fired = ++src.times_fired diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index fe73d2d60b1d..ee629f41fac1 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,8 +1,3 @@ -#define BAD_INIT_QDEL_BEFORE 1 -#define BAD_INIT_DIDNT_INIT 2 -#define BAD_INIT_SLEPT 4 -#define BAD_INIT_NO_HINT 8 - SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS @@ -96,6 +91,9 @@ SUBSYSTEM_DEF(atoms) if(INITIALIZE_HINT_QDEL) qdel(A) qdeleted = TRUE + if(INITIALIZE_HINT_QDEL_FORCE) + qdel(A, force = TRUE) + qdeleted = TRUE else BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT @@ -166,8 +164,3 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") - -#undef BAD_INIT_QDEL_BEFORE -#undef BAD_INIT_DIDNT_INIT -#undef BAD_INIT_SLEPT -#undef BAD_INIT_NO_HINT diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 94cf90aad7d2..895a8c1685fc 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -171,18 +171,19 @@ SUBSYSTEM_DEF(garbage) //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. for (var/i in 1 to length(queue)) var/list/L = queue[i] - if (length(L) < 2) + if (length(L) < GC_QUEUE_ITEM_INDEX_COUNT) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = L[1] - if(GCd_at_time > cut_off_time) + var/queued_at_time = L[GC_QUEUE_ITEM_QUEUE_TIME] + var/GCd_at_time = L[GC_QUEUE_ITEM_GCD_DESTROYED] + if(queued_at_time > cut_off_time) break // Everything else is newer, skip them count++ - var/refID = L[2] + var/refID = L[GC_QUEUE_ITEM_REF] var/datum/D D = locate(refID) @@ -230,12 +231,6 @@ SUBSYSTEM_DEF(garbage) #endif I.failures++ - if (I.qdel_flags & QDEL_ITEM_SUSPENDED_FOR_LAG) - #ifdef REFERENCE_TRACKING - if(ref_searching) - return //ref searching intentionally cancels all further fires while running so things that hold references don't end up getting deleted, so we want to return here instead of continue - #endif - continue if (GC_QUEUE_HARDDELETE) HardDelete(D) if (MC_TICK_CHECK) @@ -259,28 +254,33 @@ SUBSYSTEM_DEF(garbage) if (isnull(D)) return if (level > GC_QUEUE_COUNT) - HardDelete(D) + HardDelete(D, TRUE) return - var/gctime = world.time + var/queue_time = world.time + var/refid = "\ref[D]" + if (D.gc_destroyed <= 0) + D.gc_destroyed = queue_time - D.gc_destroyed = gctime var/list/queue = queues[level] - queue[++queue.len] = list(gctime, refid) // not += for byond reasons + queue[++queue.len] = list(queue_time, refid, D.gc_destroyed) // not += for byond reasons //this is mainly to separate things profile wise. -/datum/controller/subsystem/garbage/proc/HardDelete(datum/D) +/datum/controller/subsystem/garbage/proc/HardDelete(datum/D, force) ++delslasttick ++totaldels var/type = D.type var/refID = "\ref[D]" + var/datum/qdel_item/I = items[type] + + if (!force && I.qdel_flags & QDEL_ITEM_SUSPENDED_FOR_LAG) + return var/tick_usage = TICK_USAGE del(D) tick_usage = TICK_USAGE_TO_MS(tick_usage) - var/datum/qdel_item/I = items[type] I.hard_deletes++ I.hard_delete_time += tick_usage if (tick_usage > I.hard_delete_max) @@ -382,11 +382,11 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - SSgarbage.HardDelete(D) + SSgarbage.HardDelete(D, TRUE) #ifdef REFERENCE_TRACKING if (QDEL_HINT_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - D.find_references() //This breaks ci. Consider it insurance against somehow pring reftracking on accident + D.find_references() if (QDEL_HINT_IFFAIL_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled and the object fails to collect, display all references to this object. SSgarbage.Queue(D) SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm index bce3f2ced7c2..5c8bb49ab765 100644 --- a/code/controllers/subsystem/idlenpcpool.dm +++ b/code/controllers/subsystem/idlenpcpool.dm @@ -6,7 +6,7 @@ SUBSYSTEM_DEF(idlenpcpool) runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() - var/list/idle_mobs_by_virtual_level = list() + var/list/list/idle_mobs_by_virtual_level = list() /datum/controller/subsystem/idlenpcpool/stat_entry(msg) var/list/idlelist = GLOB.simple_animals[AI_IDLE] diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 05b07967e58d..28ab56d05211 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -260,6 +260,7 @@ SUBSYSTEM_DEF(mapping) S.space_spawn = TRUE shuttle_templates[S.file_name] = S + map_templates[S.file_name] = S #undef CHECK_STRING_EXISTS #undef CHECK_LIST_EXISTS diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index b80649a82490..ad8bad1e1d9b 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(persistence) var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() - LoadPoly() + LoadPolly() LoadTrophies() LoadRecentModes() LoadPhotoPersistence() @@ -22,8 +22,8 @@ SUBSYSTEM_DEF(persistence) LoadPanicBunker() return ..() -/datum/controller/subsystem/persistence/proc/LoadPoly() - for(var/mob/living/simple_animal/parrot/Poly/P in GLOB.alive_mob_list) +/datum/controller/subsystem/persistence/proc/LoadPolly() + for(var/mob/living/simple_animal/parrot/Polly/P in GLOB.alive_mob_list) twitterize(P.speech_buffer, "polytalk") break //Who's been duping the bird?! diff --git a/code/controllers/subsystem/processing/fields.dm b/code/controllers/subsystem/processing/fields.dm deleted file mode 100644 index a4c58b883a8a..000000000000 --- a/code/controllers/subsystem/processing/fields.dm +++ /dev/null @@ -1,6 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(fields) - name = "Fields" - wait = 2 - priority = FIRE_PRIORITY_FIELDS - flags = SS_KEEP_TIMING | SS_NO_INIT - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index e62e5bd30e3f..b5b8113384df 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -8,11 +8,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) wait = 10 runlevels = RUNLEVEL_GAME - var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ - var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad - var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process - var/list/quirk_blacklist = list() //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) - var/list/quirk_instances = list() //Assoc. list with instances of all roundstart quirk datum types; "name" = /path/ + var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ + var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad + var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process + var/list/quirk_blacklist = list() //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) + var/list/species_blacklist = list() //A list of quirks and the species they can't be used by /datum/controller/subsystem/processing/quirks/Initialize(timeofday) if(!quirks.len) @@ -25,6 +25,9 @@ PROCESSING_SUBSYSTEM_DEF(quirks) list("Alcohol Tolerance","Light Drinker"), \ list("Clown Fan","Mime Fan"), \ list("Bad Touch", "Friendly")) + + species_blacklist = list("Blood Deficiency" = list(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_VAMPIRE)) + for(var/client/client in GLOB.clients) client?.prefs.check_quirk_compatibility() return ..() @@ -37,7 +40,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/datum/quirk/T = V quirks[initial(T.name)] = T quirk_points[initial(T.name)] = initial(T.value) - quirk_instances[initial(T.name)] = new T /datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli, spawn_effects) var/badquirk = FALSE diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index e306da3ee4c2..9ec1ce5125b2 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -255,7 +255,7 @@ SUBSYSTEM_DEF(shuttle) var/result = new_shuttle.canDock(destination_port) if((result != SHUTTLE_CAN_DOCK)) WARNING("Template shuttle [new_shuttle] cannot dock at [destination_port] ([result]).") - new_shuttle.jumpToNullSpace() + qdel(new_shuttle, TRUE) return new_shuttle.initiate_docking(destination_port) return new_shuttle @@ -279,7 +279,7 @@ SUBSYSTEM_DEF(shuttle) if((result != SHUTTLE_CAN_DOCK) && (result != SHUTTLE_SOMEONE_ELSE_DOCKED)) //Someone else /IS/ docked, the old shuttle! WARNING("Template shuttle [new_shuttle] cannot dock at [old_shuttle_location] ([result]).") - new_shuttle.jumpToNullSpace() + qdel(new_shuttle, TRUE) return new_shuttle.timer = to_replace.timer //Copy some vars from the old shuttle @@ -291,7 +291,7 @@ SUBSYSTEM_DEF(shuttle) to_replace.assigned_transit = null new_shuttle.assigned_transit = old_shuttle_location - to_replace.jumpToNullSpace() //This will destroy the old shuttle + qdel(to_replace, TRUE) new_shuttle.initiate_docking(old_shuttle_location) //This will spawn the new shuttle return new_shuttle @@ -327,8 +327,8 @@ SUBSYSTEM_DEF(shuttle) for(var/obj/docking_port/P in T) if(istype(P, /obj/docking_port/mobile)) if(new_shuttle) + stack_trace("Map warning: Shuttle Template [template.mappath] has multiple mobile docking ports.") qdel(P, TRUE) - log_world("Map warning: Shuttle Template [template.mappath] has multiple mobile docking ports.") else new_shuttle = P if(istype(P, /obj/docking_port/stationary)) @@ -340,8 +340,7 @@ SUBSYSTEM_DEF(shuttle) T0.empty() message_admins(msg) - WARNING(msg) - return + CRASH(msg) new_shuttle.docking_points = stationary_ports new_shuttle.current_ship = parent //for any ships that spawn on top of us @@ -353,13 +352,13 @@ SUBSYSTEM_DEF(shuttle) var/obj/docking_port/mobile/transit_dock = generate_transit_dock(new_shuttle) if(!transit_dock) + qdel(src, TRUE) CRASH("No dock found/could be created for shuttle ([template.name]), aborting.") var/result = new_shuttle.canDock(transit_dock) if((result != SHUTTLE_CAN_DOCK)) - WARNING("Template shuttle [new_shuttle] cannot dock at [transit_dock] ([result]).") - new_shuttle.jumpToNullSpace() - return + qdel(src, TRUE) + CRASH("Template shuttle [new_shuttle] cannot dock at [transit_dock] ([result]).") new_shuttle.initiate_docking(transit_dock) new_shuttle.linkup(transit_dock, parent) diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 5e499069e71d..a37f7e1c0896 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -588,7 +588,7 @@ SUBSYSTEM_DEF(timer) if (callback.object != GLOBAL_PROC && QDELETED(callback.object) && !QDESTROYING(callback.object)) stack_trace("addtimer called with a callback assigned to a qdeleted object. In the future such timers will not \ - be supported and may refuse to run or run with a 0 wait - proc: [callback.delegate], args: [json_encode(callback.arguments)] , usr: [callback.user.resolve()]") + be supported and may refuse to run or run with a 0 wait - proc: [callback.delegate], args: [json_encode(callback.arguments)] , usr: [callback.user?.resolve()]") wait = max(CEILING(wait, world.tick_lag), world.tick_lag) diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm index 39feb5629428..a4b0fccae437 100644 --- a/code/controllers/subsystem/vis_overlays.dm +++ b/code/controllers/subsystem/vis_overlays.dm @@ -5,12 +5,10 @@ SUBSYSTEM_DEF(vis_overlays) init_order = INIT_ORDER_VIS var/list/vis_overlay_cache - var/list/unique_vis_overlays var/list/currentrun /datum/controller/subsystem/vis_overlays/Initialize() vis_overlay_cache = list() - unique_vis_overlays = list() return ..() /datum/controller/subsystem/vis_overlays/fire(resumed = FALSE) @@ -45,7 +43,6 @@ SUBSYSTEM_DEF(vis_overlays) overlay = _create_new_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags) overlay.cache_expiration = -1 var/cache_id = "\ref[overlay]@{[world.time]}" - unique_vis_overlays += overlay vis_overlay_cache[cache_id] = overlay . = overlay if(overlay == null) @@ -58,7 +55,6 @@ SUBSYSTEM_DEF(vis_overlays) if(!thing.managed_vis_overlays) thing.managed_vis_overlays = list(overlay) - RegisterSignal(thing, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_vis_overlay) else thing.managed_vis_overlays += overlay @@ -81,23 +77,3 @@ SUBSYSTEM_DEF(vis_overlays) thing.managed_vis_overlays -= overlays if(!length(thing.managed_vis_overlays)) thing.managed_vis_overlays = null - UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE) - -/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir) - SIGNAL_HANDLER - - if(old_dir == new_dir) - return - var/rotation = dir2angle(old_dir) - dir2angle(new_dir) - var/list/overlays_to_remove = list() - for(var/i in thing.managed_vis_overlays - unique_vis_overlays) - var/obj/effect/overlay/vis/overlay = i - if(overlay == null) - message_debug("Somehow someway we are processing a null vis_overlay! ([thing.type])") - else - add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags) - overlays_to_remove += overlay - for(var/i in thing.managed_vis_overlays & unique_vis_overlays) - var/obj/effect/overlay/vis/overlay = i - overlay.dir = turn(overlay.dir, rotation) - remove_vis_overlay(thing, overlays_to_remove) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 8066c548896f..d2b499de92ed 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -18,6 +18,12 @@ var/list/devillaws = list() var/id = DEFAULT_AI_LAWID +/datum/ai_laws/Destroy(force, ...) + if(!QDELETED(owner)) + CRASH("AI lawset destroyed even though owner AI is not being destroyed.") + owner = null + return ..() + /datum/ai_laws/proc/lawid_to_type(lawid) var/all_ai_laws = subtypesof(/datum/ai_laws) for(var/al in all_ai_laws) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 8ff67bfb54fb..6e3ce4bb48ae 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -90,7 +90,8 @@ /datum/beam/Destroy() QDEL_LIST(elements) - QDEL_NULL(visuals) + if(visuals) + QDEL_NULL(visuals) UnregisterSignal(origin, COMSIG_MOVABLE_MOVED) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = null @@ -162,6 +163,9 @@ segment.pixel_x = origin_px + Pixel_x segment.pixel_y = origin_py + Pixel_y + //This var might hold onto references, and we might be qdeleted during the check_tick... so yeah. + //It doesn't really matter, because this whole proc counts as a ref for src, but still. + segment = null CHECK_TICK /obj/effect/ebeam diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 2526c4bc9766..7a9e61500de6 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -89,6 +89,9 @@ to_chat(src, "You cannot directly influence the world around you, but you can see what [owner] cannot.") /mob/camera/imaginary_friend/Initialize(mapload, _trauma) + if(!_trauma) + stack_trace("Imaginary friend created without trauma, wtf") + return INITIALIZE_HINT_QDEL . = ..() trauma = _trauma @@ -131,7 +134,7 @@ client.images |= current_image /mob/camera/imaginary_friend/Destroy() - if(owner.client) + if(owner?.client) owner.client.images.Remove(human_image) if(client) client.images.Remove(human_image) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 2300e308a35f..c6d98adb0c0d 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -4,7 +4,7 @@ var/window_id // window_id is used as the window name for browse and onclose var/width = 0 var/height = 0 - var/atom/ref = null + var/datum/weakref/ref = null var/window_options = "can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;" // window option is set using window_id var/stylesheets[0] var/scripts[0] @@ -16,8 +16,8 @@ /datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, atom/nref = null) - user = nuser + RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/user_deleted) window_id = nwindow_id if (ntitle) title = format_text(ntitle) @@ -26,7 +26,11 @@ if (nheight) height = nheight if (nref) - ref = nref + ref = WEAKREF(nref) + +/datum/browser/proc/user_deleted(datum/source) + SIGNAL_HANDLER + user = null /datum/browser/proc/add_head_content(nhead_content) head_content = nhead_content @@ -113,8 +117,13 @@ /datum/browser/proc/setup_onclose() set waitfor = 0 //winexists sleeps, so we don't need to. for (var/i in 1 to 10) - if (user && winexists(user, window_id)) - onclose(user, window_id, ref) + if (user?.client && winexists(user, window_id)) + var/atom/send_ref + if(ref) + send_ref = ref.resolve() + if(!send_ref) + ref = null + onclose(user, window_id, send_ref) break /datum/browser/proc/close() diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 2a2cc55d2a22..aac5f65a3956 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -111,3 +111,5 @@ /datum/component/caltrop/UnregisterFromParent() if(ismovable(parent)) qdel(GetComponent(/datum/component/connect_loc_behalf)) + else + UnregisterSignal(get_turf(parent), list(COMSIG_ATOM_ENTERED)) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 9188e89ae734..dfb3bafbfb0e 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -4,7 +4,8 @@ var/fall_message = "GAH! Ah... where are you?" var/oblivion_message = "You stumble and stare into the abyss before you. It stares back, and you fall into the enveloping dark." - var/static/list/falling_atoms = list() // Atoms currently falling into chasms + /// List of refs to falling objects -> how many levels deep we've fallen + var/static/list/falling_atoms = list() var/static/list/forbidden_types = typecacheof(list( /obj/singularity, /obj/docking_port, @@ -20,7 +21,9 @@ /obj/effect/light_emitter/tendril, /obj/effect/collapse, /obj/effect/particle_effect/ion_trails, - /obj/effect/dummy/phased_mob + /obj/effect/dummy/phased_mob, + /obj/effect/mapping_helpers, + /obj/effect/wisp, )) /datum/component/chasm/Initialize(turf/target) @@ -28,11 +31,11 @@ target_turf = target START_PROCESSING(SSobj, src) // process on create, in case stuff is still there -/datum/component/chasm/proc/Entered(datum/source, atom/movable/AM, atom/old_loc, list/atom/old_locs) +/datum/component/chasm/proc/Entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER START_PROCESSING(SSobj, src) - drop_stuff(AM) + drop_stuff(arrived) /datum/component/chasm/process() if (!drop_stuff()) @@ -50,7 +53,6 @@ return LAZYLEN(found_safeties) /datum/component/chasm/proc/drop_stuff(AM) - . = 0 if (is_safe()) return FALSE @@ -58,57 +60,58 @@ var/to_check = AM ? list(AM) : parent.contents for (var/thing in to_check) if (droppable(thing)) - . = 1 + . = TRUE INVOKE_ASYNC(src, .proc/drop, thing) /datum/component/chasm/proc/droppable(atom/movable/AM) + var/datum/weakref/falling_ref = WEAKREF(AM) // avoid an infinite loop, but allow falling a large distance - if(falling_atoms[AM] && falling_atoms[AM] > 30) + if(falling_atoms[falling_ref] && falling_atoms[falling_ref] > 30) return FALSE if(!isliving(AM) && !isobj(AM)) return FALSE - if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & FLOATING)) + if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & (FLOATING|FLYING))) return FALSE //Flies right over the chasm if(ismob(AM)) var/mob/M = AM - if(M.buckled) //middle statement to prevent infinite loops just in case! + if(M.buckled) //middle statement to prevent infinite loops just in case! var/mob/buckled_to = M.buckled if((!ismob(M.buckled) || (buckled_to.buckled != M)) && !droppable(M.buckled)) return FALSE - if(M.is_flying()) - return FALSE if(ishuman(AM)) var/mob/living/carbon/human/H = AM if(istype(H.belt, /obj/item/wormhole_jaunter)) var/obj/item/wormhole_jaunter/J = H.belt //To freak out any bystanders - H.visible_message("[H] falls into [parent]!") + H.visible_message(span_boldwarning("[H] falls into [parent]!")) J.chasm_react(H) return FALSE return TRUE /datum/component/chasm/proc/drop(atom/movable/AM) + var/datum/weakref/falling_ref = WEAKREF(AM) //Make sure the item is still there after our sleep - if(!AM || QDELETED(AM)) + if(!AM || !falling_ref?.resolve()) + falling_atoms -= falling_ref return - falling_atoms[AM] = (falling_atoms[AM] || 0) + 1 + falling_atoms[falling_ref] = (falling_atoms[falling_ref] || 0) + 1 var/turf/T = target_turf if(T) // send to the turf below - AM.visible_message("[AM] falls into [parent]!", "[fall_message]") - T.visible_message("[AM] falls from above!") + AM.visible_message(span_boldwarning("[AM] falls into [parent]!"), span_userdanger("[fall_message]")) + T.visible_message(span_boldwarning("[AM] falls from above!")) AM.forceMove(T) if(isliving(AM)) var/mob/living/L = AM L.Paralyze(100) L.adjustBruteLoss(30) - falling_atoms -= AM + falling_atoms -= falling_ref else // send to oblivion - AM.visible_message("[AM] falls into [parent]!", "[oblivion_message]") + AM.visible_message(span_boldwarning("[AM] falls into [parent]!"), span_userdanger("[oblivion_message]")) if (isliving(AM)) var/mob/living/L = AM L.notransform = TRUE @@ -132,12 +135,16 @@ if(iscyborg(AM)) var/mob/living/silicon/robot/S = AM qdel(S.mmi) + if(isliving(AM)) + var/mob/living/L = AM + if(L.stat != DEAD) + L.death(TRUE) - falling_atoms -= AM + falling_atoms -= falling_ref qdel(AM) - if(AM && !QDELETED(AM)) //It's indestructible + if(AM && !QDELETED(AM)) //It's indestructible var/atom/parent = src.parent - parent.visible_message("[parent] spits out [AM]!") + parent.visible_message(span_boldwarning("[parent] spits out [AM]!")) AM.alpha = oldalpha AM.color = oldcolor AM.transform = oldtransform diff --git a/code/datums/components/connect_containers.dm b/code/datums/components/connect_containers.dm new file mode 100644 index 000000000000..d8a3ac8fbd3e --- /dev/null +++ b/code/datums/components/connect_containers.dm @@ -0,0 +1,68 @@ +/// This component behaves similar to connect_loc_behalf, but it's nested and hooks a signal onto all MOVABLES containing this atom. +/datum/component/connect_containers + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + /// An assoc list of signal -> procpath to register to the loc this object is on. + var/list/connections + /** + * The atom the component is tracking. The component will delete itself if the tracked is deleted. + * Signals will also be updated whenever it moves. + */ + var/atom/movable/tracked + +/datum/component/connect_containers/Initialize(atom/movable/tracked, list/connections) + . = ..() + if (!ismovable(tracked)) + return COMPONENT_INCOMPATIBLE + + src.connections = connections + set_tracked(tracked) + +/datum/component/connect_containers/Destroy() + set_tracked(null) + return ..() + +/datum/component/connect_containers/InheritComponent(datum/component/component, original, atom/movable/tracked, list/connections) + // Not equivalent. Checks if they are not the same list via shallow comparison. + if(!compare_list(src.connections, connections)) + stack_trace("connect_containers component attached to [parent] tried to inherit another connect_containers component with different connections") + return + if(src.tracked != tracked) + set_tracked(tracked) + +/datum/component/connect_containers/proc/set_tracked(atom/movable/new_tracked) + if(tracked) + UnregisterSignal(tracked, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + unregister_signals(tracked.loc) + tracked = new_tracked + if(!tracked) + return + RegisterSignal(tracked, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(tracked, COMSIG_PARENT_QDELETING, .proc/handle_tracked_qdel) + update_signals(tracked) + +/datum/component/connect_containers/proc/handle_tracked_qdel() + SIGNAL_HANDLER + qdel(src) + +/datum/component/connect_containers/proc/update_signals(atom/movable/listener) + if(!ismovable(listener.loc)) + return + + for(var/atom/movable/container as anything in get_nested_locs(listener)) + RegisterSignal(container, COMSIG_MOVABLE_MOVED, .proc/on_moved) + for(var/signal in connections) + parent.RegisterSignal(container, signal, connections[signal]) + +/datum/component/connect_containers/proc/unregister_signals(atom/movable/location) + if(!ismovable(location)) + return + + for(var/atom/movable/target as anything in (get_nested_locs(location) + location)) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + parent.UnregisterSignal(target, connections) + +/datum/component/connect_containers/proc/on_moved(atom/movable/listener, atom/old_loc) + SIGNAL_HANDLER + unregister_signals(old_loc) + update_signals(listener) diff --git a/code/datums/components/connect_range.dm b/code/datums/components/connect_range.dm new file mode 100644 index 000000000000..5642b2ed4e2d --- /dev/null +++ b/code/datums/components/connect_range.dm @@ -0,0 +1,107 @@ +/** + * This component behaves similar to connect_loc_behalf but for all turfs in range, hooking into a signal on each of them. + * Just like connect_loc_behalf, It can react to that signal on behalf of a seperate listener. + * Good for components, though it carries some overhead. Can't be an element as that may lead to bugs. + */ +/datum/component/connect_range + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + /// An assoc list of signal -> procpath to register to the loc this object is on. + var/list/connections + /** + * The atom the component is tracking. The component will delete itself if the tracked is deleted. + * Signals will also be updated whenever it moves (if it's a movable). + */ + var/atom/tracked + + /// The component will hook into signals only on turfs not farther from tracked than this. + var/range + /// Whether the component works when the movable isn't directly located on a turf. + var/works_in_containers + +/datum/component/connect_range/Initialize(atom/tracked, list/connections, range, works_in_containers = TRUE) + if(!isatom(tracked) || isarea(tracked) || range < 0) + return COMPONENT_INCOMPATIBLE + src.connections = connections + src.range = range + set_tracked(tracked) + src.works_in_containers = works_in_containers + +/datum/component/connect_range/Destroy() + set_tracked(null) + return ..() + +/datum/component/connect_range/InheritComponent(datum/component/component, original, atom/tracked, list/connections, range, works_in_containers) + // Not equivalent. Checks if they are not the same list via shallow comparison. + if(!compare_list(src.connections, connections)) + stack_trace("connect_range component attached to [parent] tried to inherit another connect_range component with different connections") + return + if(src.tracked != tracked) + set_tracked(tracked) + if(src.range == range && src.works_in_containers == works_in_containers) + return + //Unregister the signals with the old settings. + unregister_signals(isturf(tracked) ? tracked : tracked.loc) + src.range = range + src.works_in_containers = works_in_containers + //Re-register the signals with the new settings. + update_signals(src.tracked) + +/datum/component/connect_range/proc/set_tracked(atom/new_tracked) + if(tracked) //Unregister the signals from the old tracked and its surroundings + unregister_signals(isturf(tracked) ? tracked : tracked.loc) + UnregisterSignal(tracked, list( + COMSIG_MOVABLE_MOVED, + COMSIG_PARENT_QDELETING, + )) + tracked = new_tracked + if(!tracked) + return + //Register signals on the new tracked atom and its surroundings. + RegisterSignal(tracked, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(tracked, COMSIG_PARENT_QDELETING, .proc/handle_tracked_qdel) + update_signals(tracked) + +/datum/component/connect_range/proc/handle_tracked_qdel() + SIGNAL_HANDLER + qdel(src) + +/datum/component/connect_range/proc/update_signals(atom/target, atom/old_loc, forced = FALSE) + var/turf/current_turf = get_turf(target) + var/on_same_turf = current_turf == get_turf(old_loc) //Only register/unregister turf signals if it's moved to a new turf. + unregister_signals(old_loc, on_same_turf) + + if(isnull(current_turf)) + return + + if(ismovable(target.loc)) + if(!works_in_containers) + return + //Keep track of possible movement of all movables the target is in. + for(var/atom/movable/container as anything in get_nested_locs(target)) + RegisterSignal(container, COMSIG_MOVABLE_MOVED, .proc/on_moved) + + if(on_same_turf && !forced) + return + for(var/turf/target_turf in RANGE_TURFS(range, current_turf)) + for(var/signal in connections) + parent.RegisterSignal(target_turf, signal, connections[signal]) + +/datum/component/connect_range/proc/unregister_signals(atom/location, on_same_turf = FALSE) + //The location is null or is a container and the component shouldn't have register signals on it + if(isnull(location) || (!works_in_containers && !isturf(location))) + return + + if(ismovable(location)) + for(var/atom/movable/target as anything in (get_nested_locs(location) + location)) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + + if(on_same_turf) + return + var/turf/previous_turf = get_turf(location) + for(var/turf/target_turf in RANGE_TURFS(range, previous_turf)) + parent.UnregisterSignal(target_turf, connections) + +/datum/component/connect_range/proc/on_moved(atom/movable/movable, atom/old_loc) + SIGNAL_HANDLER + update_signals(movable, old_loc) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 5daa79d0ff7e..96a013df406a 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -871,9 +871,9 @@ /datum/crafting_recipe/ipickaxe name = "Improvised Pickaxe" reqs = list( - /obj/item/crowbar = 1, - /obj/item/kitchen/knife = 1, - /obj/item/stack/tape = 1) + /obj/item/crowbar = 1, + /obj/item/kitchen/knife = 1, + /obj/item/stack/tape = 1) result = /obj/item/pickaxe/improvised category = CAT_MISC diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index a203264fae0a..92bd0868a746 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -116,8 +116,7 @@ for(var/i in affixes) var/datum/fantasy_affix/affix = i affix.remove(src) - for(var/i in appliedComponents) - qdel(i) + QDEL_LIST(appliedComponents) master.force = max(0, master.force - quality) master.throwforce = max(0, master.throwforce - quality) diff --git a/code/datums/components/mirv.dm b/code/datums/components/mirv.dm index 198a9336f246..b30ce2c05b7e 100644 --- a/code/datums/components/mirv.dm +++ b/code/datums/components/mirv.dm @@ -39,5 +39,5 @@ P.range = override_projectile_range P.preparePixelProjectile(shootat_turf, target) P.firer = firer // don't hit ourself that would be really annoying - P.impacted = list(target = TRUE) // don't hit the target we hit already with the flak + LAZYSET(P.impacted, target, TRUE) // don't hit the target we hit already with the flak P.fire() diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 623b24fb2c42..4e36391d3914 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -156,8 +156,7 @@ ///Clears the affected_turfs lazylist, removing from its contents the effects of being near the light. /datum/component/overlay_lighting/proc/clean_old_turfs() - for(var/t in affected_turfs) - var/turf/lit_turf = t + for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= lum_power affected_turfs = null @@ -167,9 +166,12 @@ if(!current_holder) return var/atom/movable/light_source = GET_LIGHT_SOURCE + . = list() for(var/turf/lit_turf in view(lumcount_range, get_turf(light_source))) lit_turf.dynamic_lumcount += lum_power - LAZYADD(affected_turfs, lit_turf) + . += lit_turf + if(length(.)) + affected_turfs = . ///Clears the old affected turfs and populates the new ones. @@ -407,8 +409,7 @@ . = lum_power lum_power = new_lum_power var/difference = . - lum_power - for(var/t in affected_turfs) - var/turf/lit_turf = t + for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= difference ///Here we append the behavior associated to changing lum_power. diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index b726489ad2a9..fc2ae4c058dc 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -159,7 +159,7 @@ pellet_delta += radius * self_harm_radius_mult for(var/i in 1 to radius * self_harm_radius_mult) pew(body) // free shrapnel if it goes off in your hand, and it doesn't even count towards the absorbed. fun! - else if(!(body in bodies)) + else if(!(LAZYISIN(bodies, body))) martyrs += body // promoted from a corpse to a hero for(var/M in martyrs) @@ -217,7 +217,7 @@ P.original = target P.fired_from = parent P.firer = parent // don't hit ourself that would be really annoying - P.impacted = list(parent = TRUE) // don't hit the target we hit already with the flak + LAZYSET(P.impacted, parent, TRUE) // don't hit the target we hit already with the flak P.suppressed = SUPPRESSED_VERY // set the projectiles to make no message so we can do our own aggregate message P.preparePixelProjectile(target, parent) RegisterSignal(P, COMSIG_PROJECTILE_SELF_ON_HIT, .proc/pellet_hit) @@ -269,13 +269,13 @@ /// Our grenade has moved, reset var/list/bodies so we're "on top" of any mobs currently on the tile /datum/component/pellet_cloud/proc/grenade_moved() LAZYCLEARLIST(bodies) - for(var/mob/living/L in get_turf(parent)) - RegisterSignal(L, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) - bodies += L + for(var/mob/living/new_mob in get_turf(parent)) + RegisterSignal(new_mob, COMSIG_PARENT_QDELETING, .proc/on_target_qdel, override=TRUE) + LAZYADD(bodies, new_mob) /// Someone who was originally "under" the grenade has moved off the tile and is now eligible for being a martyr and "covering" it /datum/component/pellet_cloud/proc/grenade_uncrossed(datum/source, atom/movable/AM, direction) - bodies -= AM + LAZYREMOVE(bodies, AM) /// Our grenade or landmine or caseless shell or whatever tried deleting itself, so we intervene and nullspace it until we're done here /datum/component/pellet_cloud/proc/nullspace_parent() @@ -288,5 +288,5 @@ /datum/component/pellet_cloud/proc/on_target_qdel(atom/target) UnregisterSignal(target, COMSIG_PARENT_QDELETING) targets_hit -= target - bodies -= target + LAZYREMOVE(target, bodies) purple_hearts -= target diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index e4f7fa4e8648..0b2794898e13 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -53,4 +53,5 @@ L.nest = src L.faction = src.faction P.visible_message("[L] [pick(spawn_text)] [P].") - playsound(P, pick(spawn_sound), 50, TRUE) + if(length(spawn_sound)) + playsound(P, pick(spawn_sound), 50, TRUE) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index af1c88c1f64c..f10332a3129a 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -406,20 +406,27 @@ M.client.screen |= boxes M.client.screen |= closer M.client.screen |= real_location.contents - M.active_storage = src + M.set_active_storage(src) LAZYOR(is_using, M) + RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_deleted) return TRUE +/datum/component/storage/proc/mob_deleted(datum/source) + SIGNAL_HANDLER + hide_from(source) + /datum/component/storage/proc/hide_from(mob/M) + if(M.active_storage == src) + M.set_active_storage(null) + LAZYREMOVE(is_using, M) + + UnregisterSignal(M, COMSIG_PARENT_QDELETING) if(!M.client) return TRUE var/atom/real_location = real_location() M.client.screen -= boxes M.client.screen -= closer M.client.screen -= real_location.contents - if(M.active_storage == src) - M.active_storage = null - LAZYREMOVE(is_using, M) return TRUE /datum/component/storage/proc/close(mob/M) @@ -499,6 +506,7 @@ cansee |= M else LAZYREMOVE(is_using, M) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) return cansee //Tries to dump content diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 0803102bc4f8..9edf16e0b634 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -30,7 +30,7 @@ ///Some gloves, generally ones that increase mobility, may have a minimum distance to fly. Rocket gloves are especially dangerous with this, be sure you'll hit your target or have a clear background if you miss, or else! var/min_distance ///The throwdatum we're currently dealing with, if we need it - var/datum/thrownthing/tackle + var/datum/weakref/tackle_ref /datum/component/tackler/Initialize(stamina_cost = 25, base_knockdown = 1 SECONDS, range = 4, speed = 1, skill_mod = 0, min_distance = min_distance) if(!iscarbon(parent)) @@ -51,7 +51,7 @@ /datum/component/tackler/Destroy() var/mob/P = parent to_chat(P, "You can no longer tackle.") - ..() + return ..() /datum/component/tackler/RegisterWithParent() RegisterSignal(parent, COMSIG_MOB_CLICKON, .proc/checkTackle) @@ -62,10 +62,11 @@ UnregisterSignal(parent, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_IMPACT, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_POST_THROW)) ///Store the thrownthing datum for later use -/datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/TT) +/datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/tackle) SIGNAL_HANDLER - tackle = TT + tackle_ref = WEAKREF(tackle) + tackle.thrower = user ///See if we can tackle or not. If we can, leap! /datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/A, params) @@ -145,7 +146,9 @@ /datum/component/tackler/proc/sack(mob/living/carbon/user, atom/hit) SIGNAL_HANDLER + var/datum/thrownthing/tackle = tackle_ref?.resolve() if(!tackling || !tackle) + tackle = null return if(!iscarbon(hit)) @@ -422,7 +425,7 @@ /datum/component/tackler/proc/resetTackle() tackling = FALSE - QDEL_NULL(tackle) + QDEL_NULL(tackle_ref) UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) ///A special case for splatting for handling windows @@ -508,8 +511,11 @@ I.throw_at(get_ranged_target_turf(I, pick(GLOB.alldirs), range = dist), range = dist, speed = sp) I.visible_message("[I] goes flying[sp > 3 ? " dangerously fast" : ""]!") // standard embed speed + var/datum/thrownthing/tackle = tackle_ref?.resolve() + playsound(owner, 'sound/weapons/smash.ogg', 70, TRUE) - tackle.finalize(hit=TRUE) + if(tackle) + tackle.finalize(hit=TRUE) resetTackle() #undef MAX_TABLE_MESSES diff --git a/code/datums/components/udder.dm b/code/datums/components/udder.dm index 886b2c1b12f7..f954559d9df2 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -72,6 +72,8 @@ ///type of reagent this udder will generate /obj/item/udder/Initialize(mapload, udder_mob, on_generate_callback, reagent_produced_typepath = /datum/reagent/consumable/milk) + if(!udder_mob) + return INITIALIZE_HINT_QDEL src.udder_mob = udder_mob src.on_generate_callback = on_generate_callback create_reagents(size) @@ -82,6 +84,7 @@ /obj/item/udder/Destroy() . = ..() STOP_PROCESSING(SSobj, src) + udder_mob = null /obj/item/udder/process(delta_time) if(udder_mob.stat != DEAD) @@ -138,8 +141,9 @@ RegisterSignal(udder_mob, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/on_mob_attacking) /obj/item/udder/gutlunch/Destroy() + if(udder_mob) + UnregisterSignal(udder_mob, COMSIG_HOSTILE_ATTACKINGTARGET) . = ..() - UnregisterSignal(udder_mob, COMSIG_HOSTILE_ATTACKINGTARGET) /obj/item/udder/gutlunch/process(delta_time) var/mob/living/simple_animal/hostile/asteroid/gutlunch/gutlunch = udder_mob diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index 0e22a4f350f0..3f519fc49155 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -6,7 +6,6 @@ var/current_charges = 1 var/max_charges = 1 var/charge_rate = 250 - var/mob/living/carbon/human/holder var/obj/item/dashing_item var/dash_sound = 'sound/magic/blink.ogg' var/recharge_sound = 'sound/magic/charge.ogg' @@ -17,7 +16,10 @@ /datum/action/innate/dash/Grant(mob/user, obj/dasher) . = ..() dashing_item = dasher - holder = user + +/datum/action/innate/dash/Destroy() + dashing_item = null + return ..() /datum/action/innate/dash/IsAvailable() if(current_charges > 0) @@ -26,7 +28,7 @@ return FALSE /datum/action/innate/dash/Activate() - dashing_item.attack_self(holder) //Used to toggle dash behavior in the dashing item + dashing_item.attack_self(owner) //Used to toggle dash behavior in the dashing item /datum/action/innate/dash/proc/Teleport(mob/user, atom/target) if(!IsAvailable()) @@ -39,12 +41,12 @@ var/obj/spot2 = new phasein(get_turf(user), user.dir) spot1.Beam(spot2,beam_effect,time=20) current_charges-- - holder.update_action_buttons_icon() + owner.update_action_buttons_icon() addtimer(CALLBACK(src, .proc/charge), charge_rate) /datum/action/innate/dash/proc/charge() current_charges = clamp(current_charges + 1, 0, max_charges) - holder.update_action_buttons_icon() + owner.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, TRUE) - to_chat(holder, "[src] now has [current_charges]/[max_charges] charges.") + to_chat(owner, "[src] now has [current_charges]/[max_charges] charges.") diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 01fc5d6643e0..e2f478ba7834 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -43,9 +43,13 @@ /// A weak reference to another datum var/datum/weakref/weak_reference -#ifdef TESTING +#ifdef REFERENCE_TRACKING var/running_find_references var/last_find_references = 0 + #ifdef REFERENCE_TRACKING_DEBUG + ///Stores info about where refs are found, used for sanity checks and testing + var/list/found_refs + #endif #endif #ifdef DATUMVAR_DEBUGGING_MODE @@ -83,16 +87,21 @@ datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. - var/list/timers = active_timers - active_timers = null - for(var/thing as anything in timers) - var/datum/timedevent/timer = thing - if (timer.spent && !(timer.flags & TIMER_DELETE_ME)) - continue - qdel(timer) + if(active_timers) + var/list/timers = active_timers + active_timers = null + for(var/datum/timedevent/timer as anything in timers) + if (timer.spent && !(timer.flags & TIMER_DELETE_ME)) + continue + qdel(timer) - //BEGIN: ECS SHIT + #ifdef REFERENCE_TRACKING + #ifdef REFERENCE_TRACKING_DEBUG + found_refs = null + #endif + #endif + //BEGIN: ECS SHIT var/list/dc = datum_components if(dc) var/all_components = dc[/datum/component] diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 1a3346d5658d..2fb3a3645906 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -13,7 +13,7 @@ severity = DISEASE_SEVERITY_MEDIUM infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC|MOB_MINERAL bypasses_immunity = TRUE //2spook - var/mob/living/simple_animal/parrot/Poly/ghost/parrot + var/mob/living/simple_animal/parrot/Polly/ghost/parrot /datum/disease/parrot_possession/stage_act() ..() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 60e74d97fb7d..5a1c2b3783d4 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -339,8 +339,8 @@ for(var/datum/quirk/quirk_instance as anything in roundstart_quirks) quirks_to_remove += quirk_instance.type for(var/quirk_name in quirks_resolved) - var/datum/quirk/quirk_instance = SSquirks.quirk_instances[quirk_name] - quirks_resolved += quirk_instance.type + var/datum/quirk/quirk_type = SSquirks.quirks[quirk_name] + quirks_resolved += quirk_type quirks_resolved -= quirk_name quirks_to_remove -= quirks_resolved for(var/quirk_type in quirks_to_remove) diff --git a/code/datums/elements/connect_loc.dm b/code/datums/elements/connect_loc.dm index fee9072f751d..cfadedd5980d 100644 --- a/code/datums/elements/connect_loc.dm +++ b/code/datums/elements/connect_loc.dm @@ -1,7 +1,7 @@ /// This element hooks a signal onto the loc the current object is on. /// When the object moves, it will unhook the signal and rehook it to the new object. /datum/element/connect_loc - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH id_arg_index = 2 /// An assoc list of signal -> procpath to register to the loc this object is on. diff --git a/code/datums/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm index b184aa989cb0..c567ff7b0961 100644 --- a/code/datums/elements/forced_gravity.dm +++ b/code/datums/elements/forced_gravity.dm @@ -9,6 +9,10 @@ if(!isatom(target)) return ELEMENT_INCOMPATIBLE + var/our_ref = REF(src) + if(HAS_TRAIT_FROM(target, TRAIT_FORCED_GRAVITY, our_ref)) + return + src.gravity = gravity src.ignore_space = ignore_space @@ -16,10 +20,13 @@ if(isturf(target)) RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, .proc/turf_gravity_check) + ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, our_ref) + /datum/element/forced_gravity/Detach(datum/source, force) . = ..() var/static/list/signals_b_gone = list(COMSIG_ATOM_HAS_GRAVITY, COMSIG_TURF_HAS_GRAVITY) UnregisterSignal(source, signals_b_gone) + REMOVE_TRAIT(source, TRAIT_FORCED_GRAVITY, REF(src)) /datum/element/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs) SIGNAL_HANDLER diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 68e1800d5c34..abc82ea6806e 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -47,16 +47,17 @@ GLOBAL_LIST_INIT(huds, list( /datum/atom_hud/Destroy() for(var/v in hudusers) - remove_hud_from(v, TRUE) + remove_hud_from(v) for(var/v in hudatoms) remove_from_hud(v) GLOB.all_huds -= src return ..() -/datum/atom_hud/proc/remove_hud_from(mob/M, force = FALSE) +/datum/atom_hud/proc/remove_hud_from(mob/M, absolute = FALSE) if(!M || !hudusers[M]) return - if (force || !--hudusers[M]) + if (absolute || !--hudusers[M]) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) hudusers -= M if(next_time_allowed[M]) next_time_allowed -= M @@ -67,7 +68,7 @@ GLOBAL_LIST_INIT(huds, list( remove_from_single_hud(M, A) /datum/atom_hud/proc/remove_from_hud(atom/A) - if(!A || !(A in hudatoms)) + if(!A) return FALSE for(var/mob/M in hudusers) remove_from_single_hud(M, A) @@ -78,13 +79,14 @@ GLOBAL_LIST_INIT(huds, list( if(!M || !M.client || !A) return for(var/i in hud_icons) - M.client.images -= A.hud_list[i] + M.client.images -= A.hud_list?[i] /datum/atom_hud/proc/add_hud_to(mob/M) if(!M) return if(!hudusers[M]) hudusers[M] = 1 + RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(unregister_mob)) if(next_time_allowed[M] > world.time) if(!queued_to_see[M]) addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time) @@ -96,6 +98,11 @@ GLOBAL_LIST_INIT(huds, list( else hudusers[M]++ +/datum/atom_hud/proc/unregister_mob(datum/source, force) + SIGNAL_HANDLER + remove_hud_from(source, TRUE) + remove_from_hud(source) + /datum/atom_hud/proc/hide_single_atomhud_from(hud_user,hidden_atom) if(hudusers[hud_user]) remove_from_single_hud(hud_user,hidden_atom) @@ -135,7 +142,7 @@ GLOBAL_LIST_INIT(huds, list( //MOB PROCS /mob/proc/reload_huds() for(var/datum/atom_hud/hud in GLOB.all_huds) - if(hud && hud.hudusers[src]) + if(hud?.hudusers[src]) for(var/atom/A in hud.hudatoms) hud.add_to_single_hud(src, A) diff --git a/code/datums/map_zones.dm b/code/datums/map_zones.dm index a0f104c2fd91..b0f13fe19302 100644 --- a/code/datums/map_zones.dm +++ b/code/datums/map_zones.dm @@ -32,8 +32,7 @@ /datum/map_zone/Destroy() SSmapping.map_zones -= src QDEL_NULL(weather_controller) - for(var/datum/virtual_level/vlevel as anything in virtual_levels) - qdel(vlevel) + QDEL_LIST(virtual_levels) return ..() /// Clears all of what's inside the virtual levels managed by the mapzone. @@ -411,10 +410,17 @@ for(var/dir in crosslinked) if(crosslinked[dir]) //Because it could be linking with itself unlink(dir) - var/datum/space_level/level = SSmapping.z_list[z_value] - level.virtual_levels -= src + parent_level.virtual_levels -= src + parent_level = null + SSidlenpcpool.idle_mobs_by_virtual_level["[id]"] = null SSmapping.virtual_z_translation -= "[id]" parent_map_zone.remove_virtual_level(src) + if(up_linkage) + up_linkage.down_linkage = null + up_linkage = null + if(down_linkage) + down_linkage.up_linkage = null + down_linkage = null return ..() /datum/virtual_level/proc/mark_turfs() @@ -429,9 +435,14 @@ var/list/turf/block_turfs = get_block() + var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /atom/movable/lighting_object)) for(var/turf/turf as anything in block_turfs) // don't waste time trying to qdelete the lighting object - for(var/datum/thing in (turf.contents - turf.lighting_object)) + for(var/atom/movable/thing as anything in turf.contents) + //There's a dedicated macro for checking in a typecache, but it has unecessary checks + //And this needs to be fast + if(ignored_atoms[thing.type]) + continue qdel(thing) // DO NOT CHECK_TICK HERE. IT CAN CAUSE ITEMS TO GET LEFT BEHIND // THIS IS REALLY IMPORTANT FOR CONSISTENCY. SORRY ABOUT THE LAG SPIKE @@ -443,6 +454,7 @@ var/area/old_area = get_area(turf) space_area.contents += turf turf.change_area(old_area, space_area) + turf.virtual_z = 0 CHECK_TICK for(var/turf/turf as anything in block_turfs) diff --git a/code/datums/mapgen/_biome.dm b/code/datums/mapgen/_biome.dm index bf97734944f2..b5a35d953d3a 100644 --- a/code/datums/mapgen/_biome.dm +++ b/code/datums/mapgen/_biome.dm @@ -63,13 +63,13 @@ var/atom/spawned_mob //FLORA SPAWNING HERE - if(flora_spawn_list && prob(flora_spawn_chance) && (a_flags & FLORA_ALLOWED)) + if(length(flora_spawn_list) && prob(flora_spawn_chance) && (a_flags & FLORA_ALLOWED)) spawned_flora = pickweight(flora_spawn_list) spawned_flora = new spawned_flora(open_turf) open_turf.flags_1 |= NO_LAVA_GEN_1 //FEATURE SPAWNING HERE - if(feature_spawn_list && prob(feature_spawn_chance) && (a_flags & FLORA_ALLOWED)) //checks the same flag because lol dunno + if(length(feature_spawn_list) && prob(feature_spawn_chance) && (a_flags & FLORA_ALLOWED)) //checks the same flag because lol dunno var/atom/feature_type = pickweight(feature_spawn_list) var/can_spawn = TRUE @@ -85,7 +85,7 @@ open_turf.flags_1 |= NO_LAVA_GEN_1 //MOB SPAWNING HERE - if(mob_spawn_list && !spawned_flora && !spawned_feature && prob(mob_spawn_chance) && (a_flags & MOB_SPAWN_ALLOWED)) + if(length(mob_spawn_list) && !spawned_flora && !spawned_feature && prob(mob_spawn_chance) && (a_flags & MOB_SPAWN_ALLOWED)) var/atom/picked_mob = pickweight(mob_spawn_list) var/can_spawn = TRUE diff --git a/code/datums/mapgen/planetary/JungleGenerator.dm b/code/datums/mapgen/planetary/JungleGenerator.dm index 86c40769cd11..dd5635d4841f 100644 --- a/code/datums/mapgen/planetary/JungleGenerator.dm +++ b/code/datums/mapgen/planetary/JungleGenerator.dm @@ -175,7 +175,7 @@ mob_spawn_list = list( /mob/living/simple_animal/hostile/asteroid/wolf/random = 1, /mob/living/simple_animal/hostile/retaliate/bat = 1, - /mob/living/simple_animal/hostile/retaliate/poison/snake + /mob/living/simple_animal/hostile/retaliate/poison/snake = 1 ) feature_spawn_chance = 0.5 feature_spawn_list = list( @@ -230,7 +230,7 @@ mob_spawn_list = list( /mob/living/simple_animal/hostile/poison/bees/toxin = 1, /mob/living/simple_animal/hostile/mushroom = 1, - /mob/living/simple_animal/pet/dog/corgi/capybara + /mob/living/simple_animal/pet/dog/corgi/capybara = 1 ) /datum/biome/cave/lush/bright diff --git a/code/datums/mapgen/planetary/LavaGenerator.dm b/code/datums/mapgen/planetary/LavaGenerator.dm index d154063bdc17..6e6d4d898ac1 100644 --- a/code/datums/mapgen/planetary/LavaGenerator.dm +++ b/code/datums/mapgen/planetary/LavaGenerator.dm @@ -96,10 +96,10 @@ ) feature_spawn_chance = 0.3 feature_spawn_list = list( - /obj/structure/flora/rock/hell = 5, - /obj/structure/elite_tumor = 1, - /obj/structure/geyser/random = 1, - /obj/effect/spawner/lootdrop/anomaly/lava = 0.5 + /obj/structure/flora/rock/hell = 10, + /obj/structure/elite_tumor = 2, + /obj/structure/geyser/random = 2, + /obj/effect/spawner/lootdrop/anomaly/lava = 1, ) mob_spawn_chance = 4 diff --git a/code/datums/mapgen/planetary/RockGenerator.dm b/code/datums/mapgen/planetary/RockGenerator.dm index 83e3919ef154..61578c7a3ace 100644 --- a/code/datums/mapgen/planetary/RockGenerator.dm +++ b/code/datums/mapgen/planetary/RockGenerator.dm @@ -85,10 +85,10 @@ feature_spawn_chance = 0.25 feature_spawn_list = list( - /obj/structure/geyser/random = 8, - /obj/structure/elite_tumor = 4, - /obj/effect/spawner/lootdrop/anomaly/rock = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.1 //get out of here stalker + /obj/structure/geyser/random = 80, + /obj/structure/elite_tumor = 40, + /obj/effect/spawner/lootdrop/anomaly/rock = 10, + /obj/effect/spawner/lootdrop/anomaly/big = 1 //get out of here stalker ) flora_spawn_chance = 5 diff --git a/code/datums/mapgen/planetary/SnowGenerator.dm b/code/datums/mapgen/planetary/SnowGenerator.dm index c021ecfce9bf..05661009b52d 100644 --- a/code/datums/mapgen/planetary/SnowGenerator.dm +++ b/code/datums/mapgen/planetary/SnowGenerator.dm @@ -207,12 +207,12 @@ ) feature_spawn_chance = 0.3 feature_spawn_list = list( - /obj/effect/spawner/lootdrop/anomaly/ice = 1, - /obj/effect/spawner/lootdrop/anomaly/big = 0.01, - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.5, - /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 0.01 + /obj/effect/spawner/lootdrop/anomaly/ice = 100, + /obj/effect/spawner/lootdrop/anomaly/big = 1, + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 300, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 500, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 1 ) @@ -260,13 +260,13 @@ ) feature_spawn_chance = 0.2 feature_spawn_list = list( - /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 3, - /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 5, - /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 0.6, - /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 0.2, - /obj/structure/spawner/ice_moon = 3, - /obj/structure/spawner/ice_moon/polarbear = 3, - /obj/effect/spawner/lootdrop/anomaly/ice/cave = 1 + /obj/structure/spawner/ice_moon/demonic_portal/low_threat = 30, + /obj/structure/spawner/ice_moon/demonic_portal/medium_threat = 50, + /obj/structure/spawner/ice_moon/demonic_portal/high_threat = 6, + /obj/structure/spawner/ice_moon/demonic_portal/extreme_threat = 2, + /obj/structure/spawner/ice_moon = 30, + /obj/structure/spawner/ice_moon/polarbear = 30, + /obj/effect/spawner/lootdrop/anomaly/ice/cave = 10 ) /datum/biome/cave/snow/thawed diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index d3e81ad44615..8fdada12822e 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -96,36 +96,36 @@ flora_spawn_list = list( //mech spawners - /obj/effect/spawner/lootdrop/waste/mechwreck = 10, - /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 2, + /obj/effect/spawner/lootdrop/waste/mechwreck = 100, + /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 20, //decals and fluff structures - /obj/effect/spawner/lootdrop/waste/trash = 180, - /obj/effect/spawner/lootdrop/waste/radiation = 8, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 1, + /obj/effect/spawner/lootdrop/waste/trash = 1800, + /obj/effect/spawner/lootdrop/waste/radiation = 80, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 10, //stuff you can actually use - /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, - /obj/structure/reagent_dispensers/watertank = 20, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.1, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 20, - /obj/effect/spawner/lootdrop/maintenance/two = 10, - /obj/effect/spawner/lootdrop/maintenance/three = 5, - /obj/effect/spawner/lootdrop/maintenance/four = 2, + /obj/effect/spawner/lootdrop/waste/girder = 600, + /obj/structure/reagent_dispensers/fueltank = 100, + /obj/structure/reagent_dispensers/watertank = 200, + /obj/item/stack/cable_coil/cut = 500, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/atmos_can = 50, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 300, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 200, + /obj/effect/spawner/lootdrop/maintenance = 200, + /obj/effect/spawner/lootdrop/maintenance/two = 100, + /obj/effect/spawner/lootdrop/maintenance/three = 50, + /obj/effect/spawner/lootdrop/maintenance/four = 20, //plants - /obj/structure/flora/ash/garden/waste = 7, - /obj/structure/flora/ash/glowshroom = 20, //more common in caves + /obj/structure/flora/ash/garden/waste = 70, + /obj/structure/flora/ash/glowshroom = 200, //more common in caves //the illusive shrapnel plant - /obj/effect/mine/shrapnel/human_only = 1 + /obj/effect/mine/shrapnel/human_only = 10 ) feature_spawn_list = list( @@ -158,12 +158,12 @@ ) flora_spawn_list = list( - /obj/effect/spawner/lootdrop/waste/trash = 90, - /obj/effect/spawner/lootdrop/waste/radiation = 8, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 1, - /obj/effect/spawner/lootdrop/waste/atmos_can = 18, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.5, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, + /obj/effect/spawner/lootdrop/waste/trash = 180, + /obj/effect/spawner/lootdrop/waste/radiation = 16, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 2, + /obj/effect/spawner/lootdrop/waste/atmos_can = 36, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 60, ) mob_spawn_chance = 1 @@ -183,26 +183,26 @@ /datum/biome/waste/clearing/mushroom flora_spawn_list = list( - /obj/effect/spawner/lootdrop/waste/mechwreck = 10, - /obj/effect/spawner/lootdrop/waste/trash = 90, - /obj/effect/spawner/lootdrop/waste/radiation = 30, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 12, - /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, - /obj/structure/reagent_dispensers/watertank = 20, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.1, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 20, - /obj/effect/spawner/lootdrop/maintenance/two = 10, - /obj/effect/spawner/lootdrop/maintenance/three = 5, - /obj/effect/spawner/lootdrop/maintenance/four = 2, - /obj/structure/flora/ash/garden/waste = 30, - /obj/structure/flora/ash/glowshroom = 180, - /obj/effect/mine/shrapnel/human_only = 1 + /obj/effect/spawner/lootdrop/waste/mechwreck = 100, + /obj/effect/spawner/lootdrop/waste/trash = 900, + /obj/effect/spawner/lootdrop/waste/radiation = 300, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 120, + /obj/effect/spawner/lootdrop/waste/girder = 600, + /obj/structure/reagent_dispensers/fueltank = 100, + /obj/structure/reagent_dispensers/watertank = 200, + /obj/item/stack/cable_coil/cut = 500, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/atmos_can = 50, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 300, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 200, + /obj/effect/spawner/lootdrop/maintenance = 200, + /obj/effect/spawner/lootdrop/maintenance/two = 100, + /obj/effect/spawner/lootdrop/maintenance/three = 50, + /obj/effect/spawner/lootdrop/maintenance/four = 20, + /obj/structure/flora/ash/garden/waste = 300, + /obj/structure/flora/ash/glowshroom = 1800, + /obj/effect/mine/shrapnel/human_only = 10 ) /datum/biome/waste/tar_bed //tar colorings @@ -225,28 +225,28 @@ ) flora_spawn_list = list( //there are no plants here - /obj/effect/spawner/lootdrop/waste/mechwreck = 20, - /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 5, - /obj/effect/spawner/lootdrop/waste/trash = 90, - /obj/effect/spawner/lootdrop/waste/radiation = 8, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 2, - /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, - /obj/structure/reagent_dispensers/watertank = 20, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.1, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 20, - /obj/effect/spawner/lootdrop/maintenance/two = 10, - /obj/effect/spawner/lootdrop/maintenance/three = 5, - /obj/effect/spawner/lootdrop/maintenance/four = 2, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 18, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.1, - /obj/effect/spawner/lootdrop/waste/salvageable = 30 + /obj/effect/spawner/lootdrop/waste/mechwreck = 200, + /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 50, + /obj/effect/spawner/lootdrop/waste/trash = 900, + /obj/effect/spawner/lootdrop/waste/radiation = 80, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 20, + /obj/effect/spawner/lootdrop/waste/girder = 600, + /obj/structure/reagent_dispensers/fueltank = 100, + /obj/structure/reagent_dispensers/watertank = 200, + /obj/item/stack/cable_coil/cut = 500, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/atmos_can = 50, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 300, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 200, + /obj/effect/spawner/lootdrop/maintenance = 200, + /obj/effect/spawner/lootdrop/maintenance/two = 100, + /obj/effect/spawner/lootdrop/maintenance/three = 50, + /obj/effect/spawner/lootdrop/maintenance/four = 20, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/atmos_can = 180, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 300 ) mob_spawn_list = list( //nor organics, more biased towards hivebots though /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80, @@ -287,28 +287,28 @@ ) flora_spawn_list = list( - /obj/effect/spawner/lootdrop/waste/mechwreck = 10, - /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 2, - /obj/effect/spawner/lootdrop/waste/trash = 180, - /obj/effect/spawner/lootdrop/waste/radiation = 8, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 1, - /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, - /obj/structure/reagent_dispensers/watertank = 20, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.5, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 2, - /obj/effect/spawner/lootdrop/maintenance/two = 5, - /obj/effect/spawner/lootdrop/maintenance/three = 10, - /obj/effect/spawner/lootdrop/maintenance/four = 20, - /obj/effect/spawner/lootdrop/waste/salvageable = 40, - /obj/structure/flora/ash/garden/waste = 7, - /obj/structure/flora/ash/glowshroom = 40, //more common in caves - /obj/effect/mine/shrapnel/human_only = 1 + /obj/effect/spawner/lootdrop/waste/mechwreck = 100, + /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 20, + /obj/effect/spawner/lootdrop/waste/trash = 1800, + /obj/effect/spawner/lootdrop/waste/radiation = 80, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 10, + /obj/effect/spawner/lootdrop/waste/girder = 600, + /obj/structure/reagent_dispensers/fueltank = 100, + /obj/structure/reagent_dispensers/watertank = 200, + /obj/item/stack/cable_coil/cut = 500, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/atmos_can = 50, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 5, + /obj/effect/spawner/lootdrop/waste/salvageable = 300, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 200, + /obj/effect/spawner/lootdrop/maintenance = 20, + /obj/effect/spawner/lootdrop/maintenance/two = 50, + /obj/effect/spawner/lootdrop/maintenance/three = 100, + /obj/effect/spawner/lootdrop/maintenance/four = 200, + /obj/effect/spawner/lootdrop/waste/salvageable = 400, + /obj/structure/flora/ash/garden/waste = 70, + /obj/structure/flora/ash/glowshroom = 400, //more common in caves + /obj/effect/mine/shrapnel/human_only = 10 ) feature_spawn_list = list( @@ -346,23 +346,23 @@ /datum/biome/cave/waste/rad flora_spawn_list = list( - /obj/effect/spawner/lootdrop/waste/trash = 90, - /obj/effect/spawner/lootdrop/waste/radiation = 25, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 7, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.5, - /obj/effect/spawner/lootdrop/waste/salvageable = 15, - /obj/effect/spawner/lootdrop/waste/girder = 20, - /obj/structure/reagent_dispensers/fueltank = 1, - /obj/structure/reagent_dispensers/watertank = 1, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 2, - /obj/effect/spawner/lootdrop/maintenance/two = 5, - /obj/effect/spawner/lootdrop/maintenance/three = 10, - /obj/effect/spawner/lootdrop/maintenance/four = 20, - /obj/structure/flora/ash/glowshroom = 180 + /obj/effect/spawner/lootdrop/waste/trash = 900, + /obj/effect/spawner/lootdrop/waste/radiation = 250, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 70, + /obj/effect/spawner/lootdrop/waste/atmos_can = 50, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 5, + /obj/effect/spawner/lootdrop/waste/salvageable = 150, + /obj/effect/spawner/lootdrop/waste/girder = 200, + /obj/structure/reagent_dispensers/fueltank = 10, + /obj/structure/reagent_dispensers/watertank = 10, + /obj/item/stack/cable_coil/cut = 500, + /obj/structure/closet/crate/secure/loot = 30, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 200, + /obj/effect/spawner/lootdrop/maintenance = 20, + /obj/effect/spawner/lootdrop/maintenance/two = 50, + /obj/effect/spawner/lootdrop/maintenance/three = 100, + /obj/effect/spawner/lootdrop/maintenance/four = 200, + /obj/structure/flora/ash/glowshroom = 1800 ) feature_spawn_chance = 12 @@ -378,25 +378,25 @@ /turf/closed/wall/rust = 10 ) flora_spawn_list = list( - /obj/effect/spawner/lootdrop/waste/mechwreck = 20, - /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 5, - /obj/effect/spawner/lootdrop/waste/trash = 90, - /obj/effect/spawner/lootdrop/waste/radiation = 16, - /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 2, - /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, - /obj/structure/reagent_dispensers/watertank = 20, - /obj/item/stack/cable_coil/cut = 50, - /obj/structure/closet/crate/secure/loot = 3, - /obj/effect/spawner/lootdrop/waste/atmos_can = 5, - /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 0.5, - /obj/effect/spawner/lootdrop/waste/salvageable = 30, - /obj/effect/spawner/lootdrop/waste/grille_or_trash = 20, - /obj/effect/spawner/lootdrop/maintenance = 2, - /obj/effect/spawner/lootdrop/maintenance/two = 5, - /obj/effect/spawner/lootdrop/maintenance/three = 10, - /obj/effect/spawner/lootdrop/maintenance/four = 20, - /obj/effect/spawner/lootdrop/waste/salvageable = 40, + /obj/effect/spawner/lootdrop/waste/mechwreck = 40, + /obj/effect/spawner/lootdrop/waste/mechwreck/rare = 10, + /obj/effect/spawner/lootdrop/waste/trash = 180, + /obj/effect/spawner/lootdrop/waste/radiation = 32, + /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 4, + /obj/effect/spawner/lootdrop/waste/girder = 120, + /obj/structure/reagent_dispensers/fueltank = 20, + /obj/structure/reagent_dispensers/watertank = 40, + /obj/item/stack/cable_coil/cut = 100, + /obj/structure/closet/crate/secure/loot = 6, + /obj/effect/spawner/lootdrop/waste/atmos_can = 10, + /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 1, + /obj/effect/spawner/lootdrop/waste/salvageable = 60, + /obj/effect/spawner/lootdrop/waste/grille_or_trash = 40, + /obj/effect/spawner/lootdrop/maintenance = 4, + /obj/effect/spawner/lootdrop/maintenance/two = 10, + /obj/effect/spawner/lootdrop/maintenance/three = 20, + /obj/effect/spawner/lootdrop/maintenance/four = 40, + /obj/effect/spawner/lootdrop/waste/salvageable = 80, ) mob_spawn_list = list( //nor organics, more biased towards hivebots though /mob/living/simple_animal/hostile/hivebot/wasteplanet/strong = 80, diff --git a/code/datums/mapgen/single_biome/Gas_Giant.dm b/code/datums/mapgen/single_biome/Gas_Giant.dm index ff904db06853..7a99a1d8ca76 100644 --- a/code/datums/mapgen/single_biome/Gas_Giant.dm +++ b/code/datums/mapgen/single_biome/Gas_Giant.dm @@ -5,13 +5,12 @@ area_type = /area/overmap_encounter/planetoid/gas_giant /datum/biome/gas_giant - open_turf_types = list(/turf/open/chasm/gas_giant) + open_turf_types = list(/turf/open/chasm/gas_giant = 1) - flora_spawn_list = list( - ) + flora_spawn_list = null feature_spawn_list = null mob_spawn_list = list( - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 1 //in the future, I'd like to add something like. //The slylandro, or really any floating gas bag species, it'd be cool ) @@ -25,12 +24,10 @@ /datum/biome/plasma_giant - open_turf_types = list(/turf/open/chasm/gas_giant/plasma) + open_turf_types = list(/turf/open/chasm/gas_giant/plasma = 1) - flora_spawn_list = list( - ) + flora_spawn_list = null feature_spawn_list = null mob_spawn_list = list( - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher - + /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 1 ) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 50568ef82863..1ef0c1d50f60 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -72,8 +72,8 @@ var/list/skills_rewarded ///Assoc list of skills. Use SKILL_LVL to access level, and SKILL_EXP to access skill's exp. var/list/known_skills = list() - ///What character we joined in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not - var/mob/original_character + ///Weakref to thecharacter we joined in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not + var/datum/weakref/original_character /// The index for what character slot, if any, we were loaded from, so we can track persistent scars on a per-character basis. Each character slot gets PERSISTENT_SCAR_SLOTS scar slots var/original_character_slot_index /// The index for our current scar slot, so we don't have to constantly check the savefile (unlike the slots themselves, this index is independent of selected char slot, and increments whenever a valid char is joined with) @@ -102,25 +102,22 @@ if(islist(antag_datums)) QDEL_LIST(antag_datums) QDEL_NULL(language_holder) - enslaved_to = null + set_current(null) soulOwner = null - martial_art = null - current = null - original_character = null - leave_all_antag_huds() return ..() -/datum/mind/proc/handle_mob_deletion(mob/deleted_mob) - if (current == deleted_mob) - current = null - if (original_character == deleted_mob) - original_character = null - if (src == deleted_mob.mind) - deleted_mob.mind = null - if (istype(deleted_mob, /mob/living/carbon)) - var/mob/living/carbon/deleted_carbon = deleted_mob - if (src == deleted_carbon.last_mind) - deleted_carbon.last_mind = null +/datum/mind/proc/set_current(mob/new_current) + if(new_current && QDELETED(new_current)) + CRASH("Tried to set a mind's current var to a qdeleted mob, what the fuck") + if(current) + UnregisterSignal(src, COMSIG_PARENT_QDELETING) + current = new_current + if(current) + RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/clear_current) + +/datum/mind/proc/clear_current(datum/source) + SIGNAL_HANDLER + set_current(null) /datum/mind/proc/get_language_holder() if(!language_holder) @@ -128,7 +125,8 @@ return language_holder /datum/mind/proc/transfer_to(mob/new_character, force_key_move = 0) - if(current) // remove ourself from our old body's mind variable + set_original_character(null) + if(current) // remove ourself from our old body's mind variable current.mind = null UnregisterSignal(current, COMSIG_MOB_DEATH) SStgui.on_transfer(current, new_character) @@ -139,16 +137,16 @@ else key = new_character.key - if(new_character.mind) //disassociate any mind currently in our new body's mind variable - new_character.mind.current = null + if(new_character.mind) //disassociate any mind currently in our new body's mind variable + new_character.mind.set_current(null) var/datum/atom_hud/antag/hud_to_transfer = antag_hud//we need this because leave_hud() will clear this list var/mob/living/old_current = current if(current) - current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one - current = new_character //associate ourself with our new body - new_character.mind = src //and associate our new body with ourself - for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body + current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one + set_current(new_character) //associate ourself with our new body + new_character.mind = src //and associate our new body with ourself + for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body var/datum/antagonist/A = a A.on_body_transfer(old_current, current) if(iscarbon(new_character)) @@ -165,6 +163,10 @@ new_character.client.init_verbs() // re-initialize character specific verbs current.update_atom_languages() +//I cannot trust you fucks to do this properly +/datum/mind/proc/set_original_character(new_original_character) + original_character = WEAKREF(new_original_character) + /datum/mind/proc/init_known_skills() for (var/type in GLOB.skill_types) known_skills[type] = list(SKILL_LEVEL_NONE, 0) @@ -811,7 +813,7 @@ if(!mind.name) mind.name = real_name - mind.current = src + mind.set_current(src) /mob/living/carbon/mind_initialize() ..() diff --git a/code/datums/proximity_monitor/field.dm b/code/datums/proximity_monitor/field.dm new file mode 100644 index 000000000000..43fdb8bb20b4 --- /dev/null +++ b/code/datums/proximity_monitor/field.dm @@ -0,0 +1,169 @@ +#define FIELD_TURFS_KEY "field_turfs" +#define EDGE_TURFS_KEY "edge_turfs" + +/** + * Movable and easily code-modified fields! Allows for custom AOE effects that affect movement + * and anything inside of them, and can do custom turf effects! + * Supports automatic recalculation/reset on movement. + */ +/datum/proximity_monitor/advanced + var/list/turf/field_turfs = list() + var/list/turf/edge_turfs = list() + +/datum/proximity_monitor/advanced/Destroy() + cleanup_field() + return ..() + +/datum/proximity_monitor/advanced/proc/cleanup_field() + for(var/turf/turf as anything in edge_turfs) + cleanup_edge_turf(turf) + for(var/turf/turf as anything in field_turfs) + cleanup_field_turf(turf) + +//Call every time the field moves (done automatically if you use update_center) or a setup specification is changed. +/datum/proximity_monitor/advanced/proc/recalculate_field() + var/list/new_turfs = update_new_turfs() + + var/list/new_field_turfs = new_turfs[FIELD_TURFS_KEY] + var/list/new_edge_turfs = new_turfs[EDGE_TURFS_KEY] + + for(var/turf/old_turf as anything in field_turfs) + if(!(old_turf in new_field_turfs)) + cleanup_field_turf(old_turf) + for(var/turf/old_turf as anything in edge_turfs) + cleanup_edge_turf(old_turf) + + for(var/turf/new_turf as anything in new_field_turfs) + setup_field_turf(new_turf) + for(var/turf/new_turf as anything in new_edge_turfs) + setup_edge_turf(new_turf) + +/datum/proximity_monitor/advanced/on_entered(turf/source, atom/movable/entered) + . = ..() + if(get_dist(source, host) == current_range) + field_edge_crossed(entered, source) + else + field_turf_crossed(entered, source) + +/datum/proximity_monitor/advanced/on_moved(atom/movable/movable, atom/old_loc) + . = ..() + if(ignore_if_not_on_turf) + //Early return if it's not the host that has moved. + if(movable != host) + return + //Cleanup the field if the host was on a turf but isn't anymore. + if(!isturf(host.loc)) + if(isturf(old_loc)) + cleanup_field() + return + recalculate_field() + +/datum/proximity_monitor/advanced/on_uncrossed(turf/source, atom/movable/gone, direction) + if(get_dist(source, host) == current_range) + field_edge_uncrossed(gone, source) + else + field_turf_uncrossed(gone, source) + +/datum/proximity_monitor/advanced/proc/setup_field_turf(turf/target) + field_turfs |= target + +/datum/proximity_monitor/advanced/proc/cleanup_field_turf(turf/target) + field_turfs -= target + +/datum/proximity_monitor/advanced/proc/setup_edge_turf(turf/target) + edge_turfs |= target + +/datum/proximity_monitor/advanced/proc/cleanup_edge_turf(turf/target) + edge_turfs -= target + +/datum/proximity_monitor/advanced/proc/update_new_turfs() + . = list(FIELD_TURFS_KEY = list(), EDGE_TURFS_KEY = list()) + if(ignore_if_not_on_turf && !isturf(host.loc)) + return + var/turf/center = get_turf(host) + for(var/turf/target in RANGE_TURFS(current_range, center)) + if(get_dist(center, target) == current_range) + .[EDGE_TURFS_KEY] += target + else + .[FIELD_TURFS_KEY] += target + +//Gets edge direction/corner, only works with square radius/WDH fields! +/datum/proximity_monitor/advanced/proc/get_edgeturf_direction(turf/T, turf/center_override = null) + var/turf/checking_from = get_turf(host) + if(istype(center_override)) + checking_from = center_override + if(!(T in edge_turfs)) + return + if(((T.x == (checking_from.x + current_range)) || (T.x == (checking_from.x - current_range))) && ((T.y == (checking_from.y + current_range)) || (T.y == (checking_from.y - current_range)))) + return get_dir(checking_from, T) + if(T.x == (checking_from.x + current_range)) + return EAST + if(T.x == (checking_from.x - current_range)) + return WEST + if(T.y == (checking_from.y - current_range)) + return SOUTH + if(T.y == (checking_from.y + current_range)) + return NORTH + +/datum/proximity_monitor/advanced/proc/field_turf_crossed(atom/movable/movable, turf/location) + return + +/datum/proximity_monitor/advanced/proc/field_turf_uncrossed(atom/movable/movable, turf/location) + return + +/datum/proximity_monitor/advanced/proc/field_edge_crossed(atom/movable/movable, turf/location) + return + +/datum/proximity_monitor/advanced/proc/field_edge_uncrossed(atom/movable/movable, turf/location) + return + + +//DEBUG FIELD ITEM +/obj/item/multitool/field_debug + name = "strange multitool" + desc = "Seems to project a colored field!" + var/operating = FALSE + var/datum/proximity_monitor/advanced/debug/current = null + +/obj/item/multitool/field_debug/Destroy() + QDEL_NULL(current) + return ..() + +/obj/item/multitool/field_debug/proc/setup_debug_field() + current = new(src, 5, FALSE) + current.set_fieldturf_color = "#aaffff" + current.set_edgeturf_color = "#ffaaff" + current.recalculate_field() + +/obj/item/multitool/field_debug/attack_self(mob/user) + operating = !operating + to_chat(user, span_notice("You turn [src] [operating? "on":"off"].")) + if(!istype(current) && operating) + setup_debug_field() + else if(!operating) + QDEL_NULL(current) + +//DEBUG FIELDS +/datum/proximity_monitor/advanced/debug + current_range = 5 + var/set_fieldturf_color = "#aaffff" + var/set_edgeturf_color = "#ffaaff" + +/datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/target) + . = ..() + target.color = set_edgeturf_color + +/datum/proximity_monitor/advanced/debug/cleanup_edge_turf(turf/target) + . = ..() + target.color = initial(target.color) + +/datum/proximity_monitor/advanced/debug/setup_field_turf(turf/target) + . = ..() + target.color = set_fieldturf_color + +/datum/proximity_monitor/advanced/debug/cleanup_field_turf(turf/target) + . = ..() + target.color = initial(target.color) + +#undef FIELD_TURFS_KEY +#undef EDGE_TURFS_KEY diff --git a/code/modules/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm similarity index 74% rename from code/modules/fields/gravity.dm rename to code/datums/proximity_monitor/fields/gravity.dm index 930c524081ff..ccac71a6d850 100644 --- a/code/modules/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -1,9 +1,11 @@ /datum/proximity_monitor/advanced/gravity - name = "modified gravity zone" - setup_field_turfs = TRUE var/gravity_value = 0 var/list/modified_turfs = list() - field_shape = FIELD_SHAPE_RADIUS_SQUARE + +/datum/proximity_monitor/advanced/gravity/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, gravity) + . = ..() + gravity_value = gravity + recalculate_field() /datum/proximity_monitor/advanced/gravity/setup_field_turf(turf/T) . = ..() diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/datums/proximity_monitor/fields/peaceborg_dampener.dm similarity index 65% rename from code/modules/fields/peaceborg_dampener.dm rename to code/datums/proximity_monitor/fields/peaceborg_dampener.dm index 5a1f14916481..16b637afadad 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/datums/proximity_monitor/fields/peaceborg_dampener.dm @@ -2,11 +2,6 @@ //Projectile dampening field that slows projectiles and lowers their damage for an energy cost deducted every 1/5 second. //Only use square radius for this! /datum/proximity_monitor/advanced/peaceborg_dampener - name = "\improper Hyperkinetic Dampener Field" - setup_edge_turfs = TRUE - setup_field_turfs = TRUE - requires_processing = TRUE - field_shape = FIELD_SHAPE_RADIUS_SQUARE var/static/image/edgeturf_south = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_south") var/static/image/edgeturf_north = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_north") var/static/image/edgeturf_west = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_west") @@ -17,21 +12,26 @@ var/static/image/southeast_corner = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_southeast") var/static/image/generic_edge = image('icons/effects/fields.dmi', icon_state = "projectile_dampen_generic") var/obj/item/borg/projectile_dampen/projector = null - var/list/obj/projectile/tracked - var/list/obj/projectile/staging - use_host_turf = TRUE + var/list/obj/projectile/tracked = list() + var/list/obj/projectile/staging = list() + // lazylist that keeps track of the overlays added to the edge of the field + var/list/edgeturf_effects -/datum/proximity_monitor/advanced/peaceborg_dampener/New() - tracked = list() - staging = list() +/datum/proximity_monitor/advanced/peaceborg_dampener/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, obj/item/borg/projectile_dampen/projector) ..() + src.projector = projector + recalculate_field() + START_PROCESSING(SSfastprocess, src) /datum/proximity_monitor/advanced/peaceborg_dampener/Destroy() + projector = null + STOP_PROCESSING(SSfastprocess, src) return ..() /datum/proximity_monitor/advanced/peaceborg_dampener/process() if(!istype(projector)) qdel(src) + return var/list/ranged = list() for(var/obj/projectile/P in range(current_range, get_turf(host))) ranged += P @@ -41,23 +41,28 @@ for(var/mob/living/silicon/robot/R in range(current_range, get_turf(host))) if(R.has_buckled_mobs()) for(var/mob/living/L in R.buckled_mobs) - L.visible_message("[L] is knocked off of [R] by the charge in [R]'s chassis induced by [name]!") //I know it's bad. + L.visible_message(span_warning("[L] is knocked off of [R] by the charge in [R]'s chassis induced by the hyperkinetic dampener field!")) //I know it's bad. L.Paralyze(10) R.unbuckle_mob(L) do_sparks(5, 0, L) ..() -/datum/proximity_monitor/advanced/peaceborg_dampener/setup_edge_turf(turf/T) - ..() - var/image/I = get_edgeturf_overlay(get_edgeturf_direction(T)) - var/obj/effect/abstract/proximity_checker/advanced/F = edge_turfs[T] - F.appearance = I.appearance - F.invisibility = 0 - F.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - F.layer = 5 +/datum/proximity_monitor/advanced/peaceborg_dampener/setup_edge_turf(turf/target) + . = ..() + var/image/overlay = get_edgeturf_overlay(get_edgeturf_direction(target)) + var/obj/effect/abstract/effect = new(target) // Makes the field visible to players. + effect.icon = overlay.icon + effect.icon_state = overlay.icon_state + effect.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + effect.layer = ABOVE_ALL_MOB_LAYER + LAZYSET(edgeturf_effects, target, effect) -/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/T) - ..() +/datum/proximity_monitor/advanced/peaceborg_dampener/cleanup_edge_turf(turf/target) + . = ..() + var/obj/effect/abstract/effect = LAZYACCESS(edgeturf_effects, target) + LAZYREMOVE(edgeturf_effects, target) + if(effect) + qdel(effect) /datum/proximity_monitor/advanced/peaceborg_dampener/proc/get_edgeturf_overlay(direction) switch(direction) @@ -91,24 +96,13 @@ projector.restore_projectile(P) tracked -= P -/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F) - if(!is_turf_in_field(get_turf(AM), src)) - if(istype(AM, /obj/projectile)) - if(AM in tracked) - release_projectile(AM) - else - capture_projectile(AM, FALSE) - return ..() - -/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F) - if(istype(AM, /obj/projectile) && !(AM in tracked) && staging[AM] && !is_turf_in_field(staging[AM], src)) - capture_projectile(AM) - staging -= AM - return ..() +/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_uncrossed(atom/movable/movable, turf/location) + if(istype(movable, /obj/projectile) && get_dist(movable, host) > current_range) + if(movable in tracked) + release_projectile(movable) + else + capture_projectile(movable, FALSE) -/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F, turf/entering) - if(istype(AM, /obj/projectile)) - staging[AM] = get_turf(AM) - . = ..() - if(!.) - staging -= AM //This one ain't goin' through. +/datum/proximity_monitor/advanced/peaceborg_dampener/field_edge_crossed(atom/movable/movable, turf/location) + if(istype(movable, /obj/projectile) && !(movable in tracked)) + capture_projectile(movable) diff --git a/code/modules/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm similarity index 92% rename from code/modules/fields/timestop.dm rename to code/datums/proximity_monitor/fields/timestop.dm index 9bb39ff267ea..06ed1f113311 100644 --- a/code/modules/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -36,24 +36,20 @@ INVOKE_ASYNC(src, .proc/timestop) /obj/effect/timestop/Destroy() - qdel(chronofield) + QDEL_NULL(chronofield) playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, frequency = -1) //reverse! return ..() /obj/effect/timestop/proc/timestop() target = get_turf(src) playsound(src, 'sound/magic/timeparadox2.ogg', 75, TRUE, -1) - chronofield = make_field(/datum/proximity_monitor/advanced/timestop, list("current_range" = freezerange, "host" = src, "immune" = immune, "check_anti_magic" = check_anti_magic, "check_holy" = check_holy)) + chronofield = new (src, freezerange, TRUE, immune, check_anti_magic, check_holy) QDEL_IN(src, duration) /obj/effect/timestop/magic check_anti_magic = TRUE /datum/proximity_monitor/advanced/timestop - name = "chronofield" - setup_field_turfs = TRUE - field_shape = FIELD_SHAPE_RADIUS_SQUARE - requires_processing = TRUE var/list/immune = list() var/list/frozen_things = list() var/list/frozen_mobs = list() //cached separately for processing @@ -64,12 +60,21 @@ var/static/list/global_frozen_atoms = list() +/datum/proximity_monitor/advanced/timestop/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, list/immune, check_anti_magic, check_holy) + ..() + src.immune = immune + src.check_anti_magic = check_anti_magic + src.check_holy = check_holy + recalculate_field() + START_PROCESSING(SSfastprocess, src) + /datum/proximity_monitor/advanced/timestop/Destroy() unfreeze_all() + STOP_PROCESSING(SSfastprocess, src) return ..() -/datum/proximity_monitor/advanced/timestop/field_turf_crossed(atom/movable/AM) - freeze_atom(AM) +/datum/proximity_monitor/advanced/timestop/field_turf_crossed(atom/movable/movable, turf/location) + freeze_atom(movable) /datum/proximity_monitor/advanced/timestop/proc/freeze_atom(atom/movable/A) if(immune[A] || global_frozen_atoms[A] || !istype(A)) @@ -167,10 +172,10 @@ m.Stun(20, ignore_canstun = TRUE) /datum/proximity_monitor/advanced/timestop/setup_field_turf(turf/T) + . = ..() for(var/i in T.contents) freeze_atom(i) freeze_turf(T) - return ..() /datum/proximity_monitor/advanced/timestop/proc/freeze_projectile(obj/projectile/P) diff --git a/code/datums/proximity_monitor/proximity_monitor.dm b/code/datums/proximity_monitor/proximity_monitor.dm new file mode 100644 index 000000000000..6bc78a39c835 --- /dev/null +++ b/code/datums/proximity_monitor/proximity_monitor.dm @@ -0,0 +1,78 @@ +/datum/proximity_monitor + ///The atom we are tracking + var/atom/host + ///The atom that will receive HasProximity calls. + var/atom/hasprox_receiver + ///The range of the proximity monitor. Things moving wihin it will trigger HasProximity calls. + var/current_range + ///If we don't check turfs in range if the host's loc isn't a turf + var/ignore_if_not_on_turf + ///The signals of the connect range component, needed to monitor the turfs in range. + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + COMSIG_ATOM_EXITED =.proc/on_uncrossed, + ) + +/datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) + ignore_if_not_on_turf = _ignore_if_not_on_turf + current_range = range + set_host(_host) + +/datum/proximity_monitor/proc/set_host(atom/new_host, atom/new_receiver) + if(new_host == host) + return + if(host) //No need to delete the connect range and containers comps. They'll be updated with the new tracked host. + UnregisterSignal(host, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + if(hasprox_receiver) + UnregisterSignal(hasprox_receiver, COMSIG_PARENT_QDELETING) + if(new_receiver) + hasprox_receiver = new_receiver + if(new_receiver != new_host) + RegisterSignal(new_receiver, COMSIG_PARENT_QDELETING, .proc/on_host_or_receiver_del) + else if(hasprox_receiver == host) //Default case + hasprox_receiver = new_host + host = new_host + RegisterSignal(new_host, COMSIG_PARENT_QDELETING, .proc/on_host_or_receiver_del) + var/static/list/containers_connections = list(COMSIG_MOVABLE_MOVED = .proc/on_moved) + AddComponent(/datum/component/connect_containers, host, containers_connections) + RegisterSignal(host, COMSIG_MOVABLE_MOVED, .proc/on_moved) + set_range(current_range, TRUE) + +/datum/proximity_monitor/proc/on_host_or_receiver_del(datum/source) + SIGNAL_HANDLER + qdel(src) + +/datum/proximity_monitor/Destroy() + host = null + hasprox_receiver = null + return ..() + +/datum/proximity_monitor/proc/set_range(range, force_rebuild = FALSE) + if(!force_rebuild && range == current_range) + return FALSE + . = TRUE + current_range = range + + //If the connect_range component exists already, this will just update its range. No errors or duplicates. + AddComponent(/datum/component/connect_range, host, loc_connections, range, !ignore_if_not_on_turf) + +/datum/proximity_monitor/proc/on_moved(atom/movable/source, atom/old_loc) + SIGNAL_HANDLER + if(source == host) + hasprox_receiver?.HasProximity(host) + +/datum/proximity_monitor/proc/set_ignore_if_not_on_turf(does_ignore = TRUE) + if(ignore_if_not_on_turf == does_ignore) + return + ignore_if_not_on_turf = does_ignore + //Update the ignore_if_not_on_turf + AddComponent(/datum/component/connect_range, host, loc_connections, current_range, ignore_if_not_on_turf) + +/datum/proximity_monitor/proc/on_uncrossed() + SIGNAL_HANDLER + return //Used by the advanced subtype for effect fields. + +/datum/proximity_monitor/proc/on_entered(atom/source, atom/movable/arrived) + SIGNAL_HANDLER + if(source != host) + hasprox_receiver?.HasProximity(arrived) diff --git a/code/datums/quixotejump.dm b/code/datums/quixotejump.dm index 8ed02f286cb5..98827a2a2df6 100644 --- a/code/datums/quixotejump.dm +++ b/code/datums/quixotejump.dm @@ -6,13 +6,13 @@ var/charges = 3 var/max_charges = 3 var/charge_rate = 60 //3 seconds - var/mob/living/carbon/human/holder + var/datum/weakref/holder_ref var/dash_sound = 'sound/magic/blink.ogg' var/beam_effect = "blur" /datum/action/innate/quixotejump/Grant(mob/user) . = ..() - holder = user + holder_ref = WEAKREF(user) /datum/action/innate/quixotejump/IsAvailable() if(charges > 0) @@ -21,11 +21,17 @@ return FALSE /datum/action/innate/quixotejump/proc/charge() + var/mob/living/carbon/human/holder = holder_ref.resolve() + if(isnull(holder)) + return charges = clamp(charges + 1, 0, max_charges) holder.update_action_buttons_icon() to_chat(holder, "Quixote dash mechanisms now have [charges]/[max_charges] charges.") /datum/action/innate/quixotejump/Activate() + var/mob/living/carbon/human/holder = holder_ref.resolve() + if(isnull(holder)) + return if(!charges) to_chat(holder, "Quixote dash mechanisms are still recharging. Please standby.") return diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index ca7b7e8b3162..13d884187ad9 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -8,13 +8,6 @@ cost = 5 allow_duplicates = FALSE -/datum/map_template/ruin/lavaland/biodome/beach - name = "Biodome Beach" - id = "biodome-beach" - description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \ - Comes with a rustic wooden bar and suicidal bartender." - suffix = "lavaland_biodome_beach.dmm" - /datum/map_template/ruin/lavaland/biodome/winter name = "Biodome Winter" id = "biodome-winter" @@ -22,14 +15,6 @@ Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)." suffix = "lavaland_surface_biodome_winter.dmm" -/datum/map_template/ruin/lavaland/syndicate_base - name = "Syndicate Lava Base" - id = "lava-base" - description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." - suffix = "lavaland_surface_syndicate_base1.dmm" - cost = 20 - allow_duplicates = FALSE - /datum/map_template/ruin/lavaland/free_golem name = "Free Golem Ship" id = "golem-ship" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index c646f76fe1e8..c1b065d3b73e 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -108,6 +108,8 @@ continue for(var/obj/docking_port/mobile/port in place) + if(my_port) + CRASH("[src] loaded with multiple docking ports!") my_port = port if(register) port.register() @@ -135,6 +137,9 @@ port.dwidth = port_y_offset - 1 port.dheight = width - port_x_offset + if(!my_port) + CRASH("Shuttle template loaded without a mobile port!") + for(var/turf/shuttle_turf in turfs) //Set up underlying_turf_area and update relevent towed_shuttles var/area/ship/turf_loc = turfs[shuttle_turf] @@ -310,18 +315,6 @@ /datum/map_template/shuttle/shiptest category = "shiptest" -/datum/map_template/shuttle/custom - job_slots = list(new /datum/job/assistant = 5) // There will already be a captain, probably! - file_name = "custom_shuttle" // Dummy - -/// Syndicate Infiltrator variants -/datum/map_template/shuttle/infiltrator - category = "misc" - -/datum/map_template/shuttle/infiltrator/advanced - file_name = "infiltrator_advanced" - name = "advanced syndicate infiltrator" - /// Pirate ship templates /datum/map_template/shuttle/pirate category = "misc" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 03808a86d076..becead47da9d 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -398,7 +398,7 @@ /datum/status_effect/hippocraticOath/proc/consume_owner() owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.") var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc) - var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/C2/convermol, /datum/reagent/medicine/oxandrolone) + var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/oxandrolone) healSnake.poison_type = pick(chems) healSnake.name = "Asclepius's Snake" healSnake.real_name = "Asclepius's Snake" diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 75d9dde5cff5..bd4f5982901d 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -1,5 +1,3 @@ -#define TRAIT_SPECIES_WHITELIST(ids...) list("type" = "allowed", ids) -#define TRAIT_SPECIES_BLACKLIST(ids...) list("type" = "blocked", ids) //every quirk in this folder should be coded around being applied on spawn //these are NOT "mob quirks" like GOTTAGOFAST, but exist as a medium to apply them and other different effects /datum/quirk @@ -12,7 +10,6 @@ var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/list/mob_traits //if applicable, apply and remove these mob traits - var/list/species_lock = list() //List of id-based locks for species, use either TRAIT_SPECIES_WHITELIST or TRAIT_SPECIES_BLACKLIST inputting the species ids to said macros. Example: species_lock = TRAIT_SPECIES_WHITELIST(SPECIES_IPC, SPECIES_MOTH) var/mob/living/quirk_holder /datum/quirk/New(mob/living/quirk_mob, spawn_effects) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index db6fdbd75841..c8e3b582511d 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -23,7 +23,6 @@ gain_text = "You feel your vigor slowly fading away." lose_text = "You feel vigorous again." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." - species_lock = TRAIT_SPECIES_BLACKLIST(SPECIES_IPC, SPECIES_JELLYPERSON, SPECIES_PLASMAMAN, SPECIES_VAMPIRE) // These bad boys have NOBLOOD and are roundstart available. /datum/quirk/blooddeficiency/on_process() var/mob/living/carbon/human/H = quirk_holder diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index e3f73d287b72..a8e9873150ea 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -31,9 +31,10 @@ var/obj/item/assembly/timer/T = S G.det_time = T.saved_time*10 else if(istype(S,/obj/item/assembly/prox_sensor)) - var/obj/item/grenade/chem_grenade/G = holder - G.landminemode = S - S.proximity_monitor.wire = TRUE + var/obj/item/assembly/prox_sensor/sensor = S + var/obj/item/grenade/chem_grenade/grenade = holder + grenade.landminemode = sensor + sensor.proximity_monitor.set_ignore_if_not_on_turf(FALSE) fingerprint = S.fingerprintslast return ..() diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index e0d6f18a838b..0490c88def2d 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -10,7 +10,7 @@ for (var/obj/machinery/camera/M in src) if(M.isMotion()) motioncameras.Add(M) - M.area_motion = src + M.set_area_motion(src) //Only need to use one camera diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index bb57bb271356..1ba5d0e18ec6 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -1,7 +1,7 @@ //Parent types /area/ruin - name = "\improper Unexplored Location" + name = "unexplored location" icon_state = "away" has_gravity = STANDARD_GRAVITY area_flags = HIDDEN_AREA | BLOBS_ALLOWED diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 5587837368fb..a9d7220bd3ca 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -24,7 +24,7 @@ mobile_port = null . = ..() -/area/shuttle/PlaceOnTopReact(list/new_baseturfs, turf/fake_turf_type, flags) +/area/shuttle/PlaceOnTopReact(turf/T, list/new_baseturfs, turf/fake_turf_type, flags) . = ..() if(length(new_baseturfs) > 1 || fake_turf_type) return // More complicated larger changes indicate this isn't a player diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3e97c843fd13..4628bb22f92f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -55,8 +55,6 @@ ///overlays managed by [update_overlays][/atom/proc/update_overlays] to prevent removing overlays that weren't added by the same proc var/list/managed_overlays - ///Proximity monitor associated with this atom - var/datum/proximity_monitor/proximity_monitor ///Cooldown tick timer for buckle messages var/buckle_message_cooldown = 0 ///Last fingerprints to touch this atom @@ -249,9 +247,10 @@ if (length(no_connector_typecache)) no_connector_typecache = SSicon_smooth.get_no_connector_typecache(src.type, no_connector_typecache, connector_strict_typing) - var/area/ship/current_ship_area = get_area(src) - if(!mapload && istype(current_ship_area) && current_ship_area.mobile_port) - connect_to_shuttle(current_ship_area.mobile_port, current_ship_area.mobile_port.docked) + if(!mapload) + var/area/ship/current_ship_area = get_area(src) + if(istype(current_ship_area) && current_ship_area.mobile_port) + connect_to_shuttle(current_ship_area.mobile_port, current_ship_area.mobile_port.docked) var/temp_list = list() for(var/i in custom_materials) @@ -333,19 +332,19 @@ P.setAngle(new_angle_s) return TRUE -///Can the mover object pass this atom, while heading for the target turf -/atom/proc/CanPass(atom/movable/mover, turf/target) +/// Whether the mover object can avoid being blocked by this atom, while arriving from (or leaving through) the border_dir. +/atom/proc/CanPass(atom/movable/mover, border_dir) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) if(mover.movement_type & PHASING) return TRUE - . = CanAllowThrough(mover, target) + . = CanAllowThrough(mover, border_dir) // This is cheaper than calling the proc every time since most things dont override CanPassThrough if(!mover.generic_canpass) - return mover.CanPassThrough(src, target, .) + return mover.CanPassThrough(src, REVERSE_DIR(border_dir), .) /// Returns true or false to allow the mover to move through src -/atom/proc/CanAllowThrough(atom/movable/mover, turf/target) +/atom/proc/CanAllowThrough(atom/movable/mover, border_dir) SHOULD_CALL_PARENT(TRUE) //SHOULD_BE_PURE(TRUE) if(mover.pass_flags & pass_flags_self) @@ -968,16 +967,6 @@ /atom/proc/handle_atom_del(atom/A) SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) -/** - * called when the turf the atom resides on is ChangeTurfed - * - * Default behaviour is to loop through atom contents and call their HandleTurfChange() proc - */ -/atom/proc/HandleTurfChange(turf/T) - for(var/atom in src) - var/atom/A = atom - A.HandleTurfChange(T) - /** * the vision impairment to give to the mob whose perspective is set to that atom * @@ -1320,6 +1309,9 @@ /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) return +/atom/proc/disconnect_from_shuttle(obj/docking_port/mobile/port) + return + /// Generic logging helper /atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) if(!log_globally) @@ -1564,7 +1556,7 @@ else // See if there's a gravity generator on our map zone var/datum/map_zone/mapzone = T.get_map_zone() - if(mapzone.gravity_generators.len) + if(mapzone?.gravity_generators.len) var/max_grav = 0 for(var/obj/machinery/gravity_generator/main/G as anything in mapzone.gravity_generators) max_grav = max(G.setting,max_grav) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ad45018cec39..7471c3514881 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -94,12 +94,8 @@ /atom/movable/Destroy(force) - if(proximity_monitor) - QDEL_NULL(proximity_monitor) - if(language_holder) - QDEL_NULL(language_holder) - if(em_block) - QDEL_NULL(em_block) + QDEL_NULL(language_holder) + QDEL_NULL(em_block) unbuckle_all_mobs(force = TRUE) @@ -551,6 +547,7 @@ return TRUE +/// Called when an atom moves to a different virtual z. Warning, it will pass z-level 0 in new_virtual_z on creation and 0 in previous_virtual_z whenever moved to nullspace /atom/movable/proc/on_virtual_z_change(new_virtual_z, previous_virtual_z) SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) @@ -580,7 +577,7 @@ /atom/movable/Cross(atom/movable/AM) . = TRUE SEND_SIGNAL(src, COMSIG_MOVABLE_CROSS, AM) - return CanPass(AM, AM.loc, TRUE) + return CanPass(AM, get_dir(src, AM)) ///default byond proc that is deprecated for us in lieu of signals. do not call /atom/movable/Crossed(atom/movable/crossed_atom, oldloc) @@ -886,13 +883,13 @@ /atom/movable/proc/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) return FALSE -/atom/movable/CanAllowThrough(atom/movable/mover, turf/target) +/atom/movable/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover in buckled_mobs) return TRUE /// Returns true or false to allow src to move through the blocker, mover has final say -/atom/movable/proc/CanPassThrough(atom/blocker, turf/target, blocker_opinion) +/atom/movable/proc/CanPassThrough(atom/blocker, movement_dir, blocker_opinion) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) return blocker_opinion @@ -917,7 +914,7 @@ return turf else var/atom/movable/AM = A - if(!AM.CanPass(src) || AM.density) + if(AM.density || !AM.CanPass(src, get_dir(src, AM))) if(AM.anchored) return AM dense_object_backup = AM diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index eac7e341fd6b..a690a9317670 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -155,8 +155,9 @@ if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.Slip(src, hit_atom) - if(thrownby && !caught) - addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrownby, throw_range+2, throw_speed, null, TRUE), 1) + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by && !caught) + addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrown_by, throw_range+2, throw_speed, null, TRUE), 1) else return ..() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 01150fac7f3b..82735ff9d522 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -17,6 +17,11 @@ GLOBAL_LIST_EMPTY(objectives) if(text) explanation_text = text +//Apparently objectives can be qdel'd. Learn a new thing every day +/datum/objective/Destroy() + GLOB.objectives -= src + return ..() + /datum/objective/proc/get_owners() // Combine owner and team into a single list. . = (team && team.members) ? team.members.Copy() : list() if(owner) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index b1d790677317..bc793eb60d82 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -139,9 +139,10 @@ Class Procs: . = ..() GLOB.machines += src RegisterSignal(src, COMSIG_MOVABLE_Z_CHANGED, .proc/power_change) - if(ispath(circuit, /obj/item/circuitboard) && (mapload || apply_default_parts)) + if(ispath(circuit, /obj/item/circuitboard)) circuit = new circuit - circuit.apply_default_parts(src) + if(mapload || apply_default_parts) + circuit.apply_default_parts(src) if(processing_flags & START_PROCESSING_ON_INIT) begin_processing() @@ -170,10 +171,8 @@ Class Procs: GLOB.machines.Remove(src) end_processing() dropContents() - if(length(component_parts)) - for(var/atom/A in component_parts) - qdel(A) - component_parts.Cut() + QDEL_NULL(circuit) + QDEL_LIST(component_parts) return ..() /obj/machinery/proc/locate_machinery() @@ -410,7 +409,10 @@ Class Procs: /obj/machinery/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) on_deconstruction() - if(component_parts && component_parts.len) + if(circuit) + circuit.forceMove(loc) + circuit = null + if(length(component_parts)) spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index c2d9e0da07cb..0b35bedebd05 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -139,7 +139,7 @@ /obj/machinery/advanced_airlock_controller/Initialize(mapload) . = ..() - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) scan_on_late_init = mapload if(mapload && (. != INITIALIZE_HINT_QDEL)) return INITIALIZE_HINT_LATELOAD diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 811064d6d193..b6fb1f27f5a1 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -57,9 +57,7 @@ matching_designs = list() /obj/machinery/autolathe/Destroy() - if(d_disk) // Drops the design disk on the floor when destroyed - d_disk.forceMove(get_turf(src)) - d_disk = null + QDEL_NULL(d_disk) QDEL_NULL(wires) return ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 5b31770af80c..faccb82395fd 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -42,6 +42,8 @@ var/datum/component/empprotection/emp_component var/internal_light = TRUE //Whether it can light up when an AI views it + ///Proximity monitor associated with this atom, for motion sensitive cameras. + var/datum/proximity_monitor/proximity_monitor /// A copy of the last paper object that was shown to this camera. var/obj/item/paper/last_shown_paper @@ -83,7 +85,6 @@ if (isturf(loc)) myarea = get_area(src) LAZYADD(myarea.cameras, src) - proximity_monitor = new(src, 1) if(mapload && prob(3) && !start_active) toggle_cam() @@ -95,6 +96,14 @@ network -= i network += "[REF(port)][i]" +/obj/machinery/camera/proc/create_prox_monitor() + if(!proximity_monitor) + proximity_monitor = new(src, 1) + +/obj/machinery/camera/proc/set_area_motion(area/A) + area_motion = A + create_prox_monitor() + /obj/machinery/camera/Destroy() if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index a5f531cfd603..a3e73db90863 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -84,7 +84,7 @@ /obj/machinery/camera/motion/thunderdome/Initialize() . = ..() - proximity_monitor.SetRange(7) + proximity_monitor.set_range(7) /obj/machinery/camera/motion/thunderdome/HasProximity(atom/movable/AM as mob|obj) if (!isliving(AM) || get_area(AM) != get_area(src)) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 6b2bf6859049..8f57ad09203a 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -133,8 +133,11 @@ if(!assembly.proxy_module) assembly.proxy_module = new(assembly) upgrades |= CAMERA_UPGRADE_MOTION + create_prox_monitor() /obj/machinery/camera/proc/removeMotion() if(name == "motion-sensitive security camera") name = "security camera" upgrades &= ~CAMERA_UPGRADE_MOTION + if(!area_motion) + QDEL_NULL(proximity_monitor) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 47b9a845b598..fd876b2987f2 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -49,9 +49,9 @@ track.namecounts[name] = 1 if(ishuman(L)) - track.humans[name] = L + track.humans[name] = WEAKREF(L) else - track.others[name] = L + track.others[name] = WEAKREF(L) var/list/targets = sortList(track.humans) + sortList(track.others) @@ -67,9 +67,9 @@ if(!track.initialized) trackable_mobs() - var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) + var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - ai_actual_track(target) + ai_actual_track(target.resolve()) /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) if(!istype(target)) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 811e7d5c100a..d014b33010d7 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -8,7 +8,6 @@ icon_keyboard = "med_key" circuit = /obj/item/circuitboard/computer/operating - var/mob/living/carbon/human/patient var/obj/structure/table/optable/table var/obj/machinery/stasis/sbed var/list/advanced_surgeries = list() @@ -103,23 +102,18 @@ surgery["desc"] = initial(S.desc) surgeries += list(surgery) data["surgeries"] = surgeries - data["patient"] = null - if(table) - data["table"] = table - if(!table.check_eligible_patient()) - return data - data["patient"] = list() - patient = table.patient - else - if(sbed) - data["table"] = sbed - if(!ishuman(sbed.occupant) && !ismonkey(sbed.occupant)) - return data - data["patient"] = list() - patient = sbed.occupant - else - data["patient"] = null - return data + + //If there's no patient just hop to it yeah? + if(!table) + data["patient"] = null + return data + + data["table"] = table + if(!table.check_eligible_patient()) + return data + data["patient"] = list() + var/mob/living/carbon/human/patient = table.patient + switch(patient.stat) if(CONSCIOUS) data["patient"]["stat"] = "Conscious" diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index e782bd209c22..49b13bb0c2c9 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -29,10 +29,6 @@ circuit = C C.moveToNullspace() -/obj/machinery/computer/Destroy() - QDEL_NULL(circuit) - return ..() - /obj/machinery/computer/process() if(machine_stat & (NOPOWER|BROKEN)) return 0 diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 23937947d80c..81d2860473c7 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -73,9 +73,9 @@ frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) -/obj/machinery/air_sensor/Initialize() +/obj/machinery/air_sensor/Initialize(mapload) . = ..() - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) set_frequency(frequency) /obj/machinery/air_sensor/Destroy() diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 951901d2258d..437a19136453 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -225,7 +225,7 @@ can_use_scanner = TRUE else can_use_scanner = FALSE - connected_scanner = null + set_connected_scanner(null) is_viable_occupant = FALSE // Check for a viable occupant in the scanner. @@ -1540,8 +1540,7 @@ test_scanner = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) if(!isnull(test_scanner)) if(test_scanner.is_operational) - connected_scanner = test_scanner - connected_scanner.linked_console = src + set_connected_scanner(test_scanner) return else broken_scanner = test_scanner @@ -1549,8 +1548,7 @@ // Ultimately, if we have a broken scanner, we'll attempt to connect to it as // a fallback case, but the code above will prefer a working scanner if(!isnull(broken_scanner)) - connected_scanner = broken_scanner - connected_scanner.linked_console = src + set_connected_scanner(broken_scanner) /** * Called by connected DNA Scanners when their doors close. @@ -1991,6 +1989,21 @@ tgui_view_state["storageDiskSubMode"] = "mutations" + +/obj/machinery/computer/scan_consolenew/proc/set_connected_scanner(new_scanner) + if(connected_scanner) + UnregisterSignal(connected_scanner, COMSIG_PARENT_QDELETING) + if(connected_scanner.linked_console == src) + connected_scanner.set_linked_console(null) + connected_scanner = new_scanner + if(connected_scanner) + RegisterSignal(connected_scanner, COMSIG_PARENT_QDELETING, .proc/react_to_scanner_del) + connected_scanner.set_linked_console(src) + +/obj/machinery/computer/scan_consolenew/proc/react_to_scanner_del(datum/source) + SIGNAL_HANDLER + set_connected_scanner(null) + #undef INJECTOR_TIMEOUT #undef NUMBER_OF_BUFFERS #undef SCRAMBLE_TIMEOUT diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index dfdc2969d119..f196fc6dc770 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -183,7 +183,7 @@ break if(component_check) P.play_tool_sound(src) - var/obj/machinery/new_machine = new circuit.build_path(loc) //Let this comment be a reminder that literally 100% of the problems with fundamental code have been because we're chained to Whitesands' desecrated, rotting corpse. + var/obj/machinery/new_machine = new circuit.build_path(loc) if(new_machine.circuit) QDEL_NULL(new_machine.circuit) new_machine.circuit = circuit diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 63165a84b823..985a61efe01d 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -175,6 +175,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod/retro, 17) /obj/machinery/cryopod/Destroy() linked_ship?.spawn_points -= src + linked_ship = null return ..() /obj/machinery/cryopod/LateInitialize() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index c738256030db..3f62292736da 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -37,7 +37,7 @@ else return ..() -/obj/structure/barricade/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff. +/obj/structure/barricade/CanAllowThrough(atom/movable/mover, border_dir)//So bullets will fly over and stuff. . = ..() if(locate(/obj/structure/barricade) in get_turf(mover)) return TRUE diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 51e7562c49db..7fd0f3262273 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -146,6 +146,18 @@ return close_machine(target) +//This is only called by the scanner. if you ever want to use this outside of that context you'll need to refactor things a bit +/obj/machinery/dna_scannernew/proc/set_linked_console(new_console) + if(linked_console) + UnregisterSignal(linked_console, COMSIG_PARENT_QDELETING) + linked_console = new_console + if(linked_console) + RegisterSignal(linked_console, COMSIG_PARENT_QDELETING, .proc/react_to_console_del) + +/obj/machinery/dna_scannernew/proc/react_to_console_del(datum/source) + SIGNAL_HANDLER + set_linked_console(null) + //Just for transferring between genetics machines. /obj/item/disk/data diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 98e546ddefac..525811b23ffc 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -393,6 +393,9 @@ /obj/machinery/door/airlock/Destroy() QDEL_NULL(wires) QDEL_NULL(electronics) + if(closeOther) + closeOther.closeOther = null + closeOther = null if (cyclelinkedairlock) if (cyclelinkedairlock.cyclelinkedairlock == src) cyclelinkedairlock.cyclelinkedairlock = null @@ -1242,7 +1245,7 @@ /obj/machinery/door/airlock/open(forced=0) - if(operating || welded || locked || seal) + if(operating || welded || locked || seal || !wires) return FALSE if(!forced) if(!hasPower() || wires.is_cut(WIRE_OPEN)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f2e1200564b9..44b7c827daa1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -159,7 +159,7 @@ . = ..() move_update_air(T) -/obj/machinery/door/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/door/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index fed9d49239e7..c5deb7b29750 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -71,6 +71,7 @@ /obj/machinery/door/firedoor/Destroy() remove_from_areas() + density = FALSE air_update_turf(1) affecting_areas.Cut() return ..() @@ -393,10 +394,16 @@ return 0 // not big enough to matter return start_point.air.return_pressure() < 20 ? -1 : 1 -/obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/door/firedoor/border_only/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(!(get_dir(loc, target) == dir)) //Make sure looking at appropriate border - return TRUE + + if(.) + return + + if(border_dir == dir) //Make sure looking at appropriate border + return FALSE + + return TRUE /obj/machinery/door/firedoor/border_only/proc/on_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER @@ -411,10 +418,9 @@ return COMPONENT_ATOM_BLOCK_EXIT /obj/machinery/door/firedoor/border_only/CanAtmosPass(turf/T) - if(get_dir(loc, T) == dir) - return !density - else + if(!density) return TRUE + return !(dir == get_dir(loc, T)) /obj/machinery/door/firedoor/proc/emergency_pressure_close() SHOULD_NOT_SLEEP(TRUE) @@ -726,7 +732,7 @@ firelock_type = /obj/machinery/door/firedoor/border_only/closed flags_1 = ON_BORDER_1 -/obj/machinery/door/firedoor/border_only/Initialize() +/obj/structure/firelock_frame/border/Initialize() . = ..() var/static/list/loc_connections = list( diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index f4cc13e5eeff..e10f0786489c 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -103,11 +103,12 @@ do_animate("deny") return -/obj/machinery/door/window/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/door/window/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return - if(get_dir(loc, target) == dir) //Make sure looking at appropriate border + + if(border_dir == dir) return FALSE if(istype(mover, /obj/structure/window)) diff --git a/code/game/machinery/fat_sucker.dm b/code/game/machinery/fat_sucker.dm index 28218a366f0b..28c6d3d3ee2a 100644 --- a/code/game/machinery/fat_sucker.dm +++ b/code/game/machinery/fat_sucker.dm @@ -32,6 +32,10 @@ soundloop = new(list(src), FALSE) update_appearance() +/obj/machinery/fat_sucker/Destroy() + QDEL_NULL(soundloop) + return ..() + /obj/machinery/fat_sucker/RefreshParts() ..() var/rating = 0 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index e68b3e0837f9..4bacfbbb5651 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -28,6 +28,8 @@ light_system = MOVABLE_LIGHT //Used as a flash here. light_range = FLASH_LIGHT_RANGE light_on = FALSE + ///Proximity monitor associated with this atom, needed for proximity checks. + var/datum/proximity_monitor/proximity_monitor /obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0) . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it @@ -181,13 +183,13 @@ add_overlay("[base_icon_state]-s") set_anchored(TRUE) power_change() - proximity_monitor.SetRange(range) + proximity_monitor.set_range(range) else to_chat(user, "[src] can now be moved.") cut_overlays() set_anchored(FALSE) power_change() - proximity_monitor.SetRange(0) + proximity_monitor.set_range(0) else return ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index e41be5ede09a..98014077d4b0 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -98,6 +98,8 @@ Possible to do for anyone motivated enough: resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_1 = NODECONSTRUCT_1 on_network = FALSE + ///Proximity monitor associated with this atom, needed for proximity checks. + var/datum/proximity_monitor/proximity_monitor var/proximity_range = 1 /obj/machinery/holopad/tutorial/Initialize(mapload) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 60825b3e51f6..c7752a8cbfaa 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -43,7 +43,8 @@ update_indicator() /obj/machinery/launchpad/Destroy() - qdel(hud_list[DIAG_LAUNCHPAD_HUD]) + for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) + diag_hud.remove_from_hud(src) return ..() /obj/machinery/launchpad/examine(mob/user) @@ -232,7 +233,9 @@ src.briefcase = briefcase /obj/machinery/launchpad/briefcase/Destroy() - QDEL_NULL(briefcase) + if(!QDELETED(briefcase)) + qdel(briefcase) + briefcase = null return ..() /obj/machinery/launchpad/briefcase/isAvailable() @@ -257,9 +260,9 @@ /obj/machinery/launchpad/briefcase/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/launchpad_remote)) var/obj/item/launchpad_remote/L = I - if(L.pad == src) //do not attempt to link when already linked + if(L.pad == WEAKREF(src)) //do not attempt to link when already linked return ..() - L.pad = src + L.pad = WEAKREF(src) to_chat(user, "You link [src] to [L].") else return ..() @@ -274,7 +277,8 @@ /obj/item/storage/briefcase/launchpad/Destroy() if(!QDELETED(pad)) - QDEL_NULL(pad) + qdel(pad) + pad = null return ..() /obj/item/storage/briefcase/launchpad/PopulateContents() @@ -296,9 +300,9 @@ /obj/item/storage/briefcase/launchpad/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/launchpad_remote)) var/obj/item/launchpad_remote/L = I - if(L.pad == src.pad) //do not attempt to link when already linked + if(L.pad == WEAKREF(src.pad)) //do not attempt to link when already linked return ..() - L.pad = src.pad + L.pad = WEAKREF(src.pad) to_chat(user, "You link [pad] to [L].") else return ..() @@ -310,11 +314,12 @@ icon_state = "folder" w_class = WEIGHT_CLASS_SMALL var/sending = TRUE - var/obj/machinery/launchpad/briefcase/pad + //A weakref to our linked pad + var/datum/weakref/pad /obj/item/launchpad_remote/Initialize(mapload, pad) //remote spawns linked to the briefcase pad . = ..() - src.pad = pad + src.pad = WEAKREF(pad) /obj/item/launchpad_remote/attack_self(mob/user) . = ..() @@ -334,16 +339,17 @@ /obj/item/launchpad_remote/ui_data(mob/user) var/list/data = list() - data["has_pad"] = pad ? TRUE : FALSE - if(pad) - data["pad_closed"] = pad.closed - if(!pad || pad.closed) + var/obj/machinery/launchpad/briefcase/our_pad = pad.resolve() + data["has_pad"] = our_pad ? TRUE : FALSE + if(our_pad) + data["pad_closed"] = our_pad.closed + if(!our_pad || our_pad.closed) return data - data["pad_name"] = pad.display_name - data["range"] = pad.range - data["x"] = pad.x_offset - data["y"] = pad.y_offset + data["pad_name"] = our_pad.display_name + data["range"] = our_pad.range + data["x"] = our_pad.x_offset + data["y"] = our_pad.y_offset return data /obj/item/launchpad_remote/proc/teleport(mob/user, obj/machinery/launchpad/pad) @@ -359,19 +365,22 @@ . = ..() if(.) return - + var/obj/machinery/launchpad/briefcase/our_pad = pad.resolve() + if(!our_pad) + pad = null + return TRUE switch(action) if("set_pos") var/new_x = text2num(params["x"]) var/new_y = text2num(params["y"]) - pad.set_offset(new_x, new_y) + our_pad.set_offset(new_x, new_y) . = TRUE if("move_pos") var/plus_x = text2num(params["x"]) var/plus_y = text2num(params["y"]) - pad.set_offset( - x = pad.x_offset + plus_x, - y = pad.y_offset + plus_y + our_pad.set_offset( + x = our_pad.x_offset + plus_x, + y = our_pad.y_offset + plus_y ) . = TRUE if("rename") @@ -379,16 +388,16 @@ var/new_name = params["name"] if(!new_name) return - pad.display_name = new_name + our_pad.display_name = new_name if("remove") . = TRUE - if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") - pad = null + if(usr && tgui_alert(usr, "Are you sure?", "Unlink Launchpad", list("I'm Sure", "Abort")) != "Abort") + our_pad = null if("launch") sending = TRUE - teleport(usr, pad) + teleport(usr, our_pad) . = TRUE if("pull") sending = FALSE - teleport(usr, pad) + teleport(usr, our_pad) . = TRUE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 1f97013e1262..a847b44d39a1 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -46,8 +46,10 @@ return ..() /obj/machinery/navbeacon/on_virtual_z_change(new_virtual_z, previous_virtual_z) - LAZYADDASSOC(GLOB.navbeacons, "[new_virtual_z]", src) - LAZYREMOVEASSOC(GLOB.navbeacons, "[previous_virtual_z]", src) + if(previous_virtual_z) + LAZYREMOVEASSOC(GLOB.navbeacons, "[previous_virtual_z]", src) + if(new_virtual_z) + LAZYADDASSOC(GLOB.navbeacons, "[new_virtual_z]", src) ..() // set the transponder codes assoc list from codes_txt @@ -69,8 +71,7 @@ codes[e] = "1" /obj/machinery/navbeacon/proc/glob_lists_deregister() - if (GLOB.navbeacons["[z]"]) - GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one. + LAZYREMOVE(GLOB.navbeacons["[virtual_z()]"], src) GLOB.deliverybeacons -= src GLOB.deliverybeacontags -= location GLOB.wayfindingbeacons -= src @@ -78,10 +79,10 @@ /obj/machinery/navbeacon/proc/glob_lists_register(init=FALSE) if(!init) glob_lists_deregister() + if(!codes) + return if(codes["patrol"]) - if(!GLOB.navbeacons["[z]"]) - GLOB.navbeacons["[z]"] = list() - GLOB.navbeacons["[z]"] += src //Register with the patrol list! + LAZYADD(GLOB.navbeacons["[virtual_z()]"], src) if(codes["delivery"]) GLOB.deliverybeacons += src GLOB.deliverybeacontags += location diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index b602624eb7e6..37def4d5a9da 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -83,12 +83,11 @@ icon_state = icon_name + "[is_powered]" + "[(blood ? "bld" : "")]" // add the blood tag at the end return ..() -/obj/machinery/recycler/CanAllowThrough(atom/movable/AM) +/obj/machinery/recycler/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!anchored) return - var/move_dir = get_dir(loc, AM.loc) - if(move_dir == eat_dir) + if(border_dir == eat_dir) return TRUE /obj/machinery/recycler/proc/on_entered(datum/source, atom/movable/AM) diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm index 93cc18456bc1..8e056d198ea6 100644 --- a/code/game/machinery/roulette_machine.dm +++ b/code/game/machinery/roulette_machine.dm @@ -54,6 +54,11 @@ jackpot_loop = new(list(src), FALSE) wires = new /datum/wires/roulette(src) +/obj/machinery/roulette/Destroy() + QDEL_NULL(jackpot_loop) + QDEL_NULL(wires) + return ..() + /obj/machinery/roulette/obj_break(damage_flag) prize_theft(0.05) . = ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index bdb167ee1732..2d735deb1969 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -631,7 +631,7 @@ if(gen_secondary) //using power may cause us to be destroyed gen_secondary.add_load(drain_amount * 0.5) -/obj/machinery/shieldwall/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/shieldwall/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(hardshield == TRUE) if(istype(mover) && (mover.pass_flags & PASSGLASS)) diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index ad6695c8b812..267c8d102918 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -14,8 +14,6 @@ var/thrust = 0 ///I don't really know what this is but it's used a lot var/thruster_active = FALSE - ///Used to store which ship currently has this engine in their thruster list, for Destroy() reasons - var/obj/docking_port/mobile/parent_shuttle /** * Uses up a specified percentage of the fuel cost, and returns the amount of thrust if successful. @@ -42,6 +40,8 @@ * All functions should return if the parent function returns false. */ /obj/machinery/power/shuttle/engine/proc/update_engine() + if(!(flags_1 & INITIALIZED_1)) + return FALSE thruster_active = TRUE if(panel_open) thruster_active = FALSE @@ -69,13 +69,7 @@ /obj/machinery/power/shuttle/engine/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() - port.engine_list |= src - parent_shuttle = port - -/obj/machinery/power/shuttle/engine/Destroy() - if(parent_shuttle) - parent_shuttle.engine_list -= src - return ..() + port.engine_list |= WEAKREF(src) /obj/machinery/power/shuttle/engine/on_construction() . = ..() diff --git a/code/game/machinery/shuttle/shuttle_engine_types.dm b/code/game/machinery/shuttle/shuttle_engine_types.dm index bdb9e44cf8dc..e5e3d812c098 100644 --- a/code/game/machinery/shuttle/shuttle_engine_types.dm +++ b/code/game/machinery/shuttle/shuttle_engine_types.dm @@ -208,8 +208,6 @@ reagent_amount_holder += fuel_reagents[reagent] /obj/machinery/power/shuttle/engine/liquid/burn_engine(percentage = 100) - if(!(INITIALIZED_1 & flags_1)) - CRASH("Attempted to fire an uninitialized liquid engine") . = ..() var/true_percentage = 1 for(var/reagent in fuel_reagents) @@ -217,16 +215,12 @@ return thrust * true_percentage /obj/machinery/power/shuttle/engine/liquid/return_fuel() - if(!(INITIALIZED_1 & flags_1)) - CRASH("Attempted to read the fuel value an uninitialized liquid engine") var/true_percentage = INFINITY for(var/reagent in fuel_reagents) true_percentage = min(reagents?.get_reagent_amount(reagent) / fuel_reagents[reagent], true_percentage) return reagent_amount_holder * true_percentage //Multiplies the total amount needed by the smallest percentage of any reagent in the recipe /obj/machinery/power/shuttle/engine/liquid/return_fuel_cap() - if(!(INITIALIZED_1 & flags_1)) - CRASH("Attempted to read the fuel cap of an uninitialized liquid engine") return reagents.maximum_volume /obj/machinery/power/shuttle/engine/liquid/oil diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index 1862c3728e2f..706898eac4c6 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -160,17 +160,8 @@ icon_state_open = use_tank ? "heater_open" : "[initial(icon_state)]_open" /obj/machinery/atmospherics/components/unary/shuttle/heater/proc/update_adjacent_engines() - var/engine_turf - switch(dir) - if(NORTH) - engine_turf = get_offset_target_turf(src, 0, -1) - if(SOUTH) - engine_turf = get_offset_target_turf(src, 0, 1) - if(EAST) - engine_turf = get_offset_target_turf(src, -1, 0) - if(WEST) - engine_turf = get_offset_target_turf(src, 1, 0) - if(!engine_turf) + var/engine_turf = get_step(src, dir) + if(!isturf(engine_turf)) return for(var/obj/machinery/power/shuttle/engine/E in engine_turf) E.update_icon_state() diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 20a5b823a230..d11067c290fd 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -46,12 +46,17 @@ return return ..() -/obj/machinery/blackbox_recorder/Destroy() +/obj/machinery/blackbox_recorder/deconstruct(disassembled) if(stored) - stored.forceMove(loc) + stored.forceMove(drop_location()) new /obj/effect/decal/cleanable/oil(loc) return ..() +/obj/machinery/blackbox_recorder/Destroy() + if(stored) + QDEL_NULL(stored) + return ..() + /obj/machinery/blackbox_recorder/update_icon_state() icon_state = "blackbox[stored ? null : "_b"]" return ..() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 8f49c9758f57..8d449ef1c98b 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -55,7 +55,7 @@ do_transform(AM) -/obj/machinery/transformer/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/transformer/CanAllowThrough(atom/movable/mover, border_dir) . = ..() // Allows items to go through, // to stop them from blocking the conveyor belt. diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index ee5dd4db846d..6a36a0ee01d6 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -443,27 +443,19 @@ output += "Total: [round(reagents.total_volume,0.001)]/[reagents.maximum_volume] - Purge All" return output || "None" -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S) - if(syringes.len= 2) - occupant_message("The syringe is too far away!") - return 0 - for(var/obj/structure/D in S.loc)//Basic level check for structures in the way (Like grilles and windows) - if(!(D.CanPass(S,src.loc))) - occupant_message("Unable to load syringe!") - return 0 - for(var/obj/machinery/door/D in S.loc)//Checks for doors - if(!(D.CanPass(S,src.loc))) - occupant_message("Unable to load syringe!") - return 0 - S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = chassis.occupant) - S.forceMove(src) - syringes += S - occupant_message("Syringe loaded.") - update_equip_info() - return 1 - occupant_message("[src]'s syringe chamber is full!") - return 0 +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/load_syringe(obj/item/reagent_containers/syringe/S, mob/user) + if(length(syringes) >= max_syringes) + occupant_message("[src]'s syringe chamber is full!") + return FALSE + if(!chassis.Adjacent(S)) + occupant_message("Unable to load syringe!") + return FALSE + S.reagents.trans_to(src, S.reagents.total_volume, transfered_by = user) + S.forceMove(src) + syringes += S + occupant_message("Syringe loaded.") + update_equip_info() + return TRUE /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/analyze_reagents(atom/A) if(get_dist(src,A) >= 4) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 62e8f10455a8..fe1ca47ad4b3 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -171,29 +171,40 @@ for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) E.detach(loc) qdel(E) - if(cell) - qdel(cell) - if(scanmod) - qdel(scanmod) - if(capacitor) - qdel(capacitor) - if(internal_tank) - qdel(internal_tank) if(AI) AI.gib() //No wreck, no AI to recover + AI = null STOP_PROCESSING(SSobj, src) GLOB.poi_list.Remove(src) equipment.Cut() - cell = null - scanmod = null - capacitor = null - internal_tank = null + + for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) + diag_hud.remove_from_hud(src) + + QDEL_NULL(cell) + QDEL_NULL(scanmod) + QDEL_NULL(capacitor) + QDEL_NULL(internal_tank) + QDEL_NULL(spark_system) + QDEL_NULL(smoke_system) + QDEL_NULL(radio) + + QDEL_NULL(eject_action) + QDEL_NULL(internals_action) + QDEL_NULL(cycle_action) + QDEL_NULL(lights_action) + QDEL_NULL(stats_action) + QDEL_NULL(defense_action) + QDEL_NULL(overload_action) + QDEL_NULL(smoke_system) + QDEL_NULL(smoke_action) + QDEL_NULL(zoom_action) + QDEL_NULL(switch_damtype_action) + QDEL_NULL(phasing_action) + QDEL_NULL(strafing_action) + assume_air(cabin_air) - cabin_air = null - qdel(spark_system) - spark_system = null - qdel(smoke_system) - smoke_system = null + QDEL_NULL(cabin_air) GLOB.mechas_list -= src //global mech list return ..() diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 845db56a794f..42c32e04fa98 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -74,8 +74,11 @@ var/mob/living/L = M.pulledby L.reset_pull_offsets(M, TRUE) - if(!check_loc && M.loc != loc) - M.forceMove(loc) + if (CanPass(M, get_dir(loc, M))) + M.Move(loc) + else + if (!check_loc && M.loc != loc) + M.forceMove(loc) M.buckling = null M.set_buckled(src) diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index 56e6f2c4c15e..b1318953f4a6 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -35,6 +35,9 @@ /obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER + //the countdown effect, lmao + if(iseffect(AM)) + return mobShock(AM) tesla_zap(src, zap_range, zap_power, zap_flags) new /obj/effect/particle_effect/sparks(loc) diff --git a/code/game/objects/effects/anomalies/anomalies_gravity.dm b/code/game/objects/effects/anomalies/anomalies_gravity.dm index b5668732f52b..e8bdd61dd3fc 100644 --- a/code/game/objects/effects/anomalies/anomalies_gravity.dm +++ b/code/game/objects/effects/anomalies/anomalies_gravity.dm @@ -84,14 +84,14 @@ /obj/effect/anomaly/grav/high effectrange = 5 - var/grav_field + var/datum/proximity_monitor/advanced/gravity/grav_field /obj/effect/anomaly/grav/high/Initialize(mapload, new_lifespan) . = ..() INVOKE_ASYNC(src, .proc/setup_grav_field) /obj/effect/anomaly/grav/high/proc/setup_grav_field() - grav_field = make_field(/datum/proximity_monitor/advanced/gravity, list("current_range" = effectrange, "host" = src, "gravity_value" = 2)) + grav_field = new(src, effectrange, TRUE, 2) /obj/effect/anomaly/grav/high/Destroy() QDEL_NULL(grav_field) diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index df26388b9ddb..c47b95e99b49 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -146,11 +146,13 @@ return round(time_left) /obj/effect/countdown/holosign/Destroy(...) - if(attached_to) - var/obj/structure/holosign/H = attached_to - if(H.countdown) - H.countdown = null - return ..() + if(!attached_to) + return ..() + var/obj/structure/holosign/H = attached_to + if(!istype(H) || !H.countdown) + return ..() + H.countdown = null + return ..() /obj/effect/countdown/hourglass name = "hourglass countdown" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 57c871ed4c00..d00f3eb256a6 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -28,7 +28,6 @@ var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = .proc/on_entered, - COMSIG_ATOM_EXITED = .proc/on_uncrossed, ) AddElement(/datum/element/connect_loc, loc_connections) @@ -80,10 +79,6 @@ reagents.expose_temperature(exposed_temperature) ..() -/obj/effect/decal/cleanable/proc/on_uncrossed(datum/source, atom/movable/O) - SIGNAL_HANDLER - return - //Add "bloodiness" of this blood's type, to the human's shoes //This is on /cleanable because fuck this ancient mess /obj/effect/decal/cleanable/proc/on_entered(datum/source, atom/movable/AM) @@ -94,6 +89,8 @@ /obj/effect/decal/cleanable/wash(clean_types) ..() + if(!(flags_1 & INITIALIZED_1)) + return FALSE qdel(src) return TRUE diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index a5769f887160..709d7ca12102 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -32,9 +32,9 @@ icon_state = "salt_pile" var/safepasses = 3 //how many times can this salt pile be passed before dissipating -/obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/AM, turf/target) +/obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(is_species(AM, /datum/species/snail)) + if(is_species(mover, /datum/species/snail)) return FALSE /obj/effect/decal/cleanable/food/salt/Bumped(atom/movable/AM) diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 79059b51f351..f283de309cc8 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -52,10 +52,6 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL beauty = -100 -/obj/effect/decal/cleanable/oil/Initialize() - . = ..() - reagents.add_reagent(/datum/reagent/fuel/oil, 30) - /obj/effect/decal/cleanable/oil/attackby(obj/item/I, mob/living/user) var/attacked_by_hot_thing = I.get_temperature() if(attacked_by_hot_thing) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 4bb99fe98b22..173764fdf198 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -46,4 +46,4 @@ GLOBAL_LIST(gang_tags) /obj/effect/decal/cleanable/crayon/gang/Destroy() LAZYREMOVE(GLOB.gang_tags, src) - ..() + return ..() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 7aea2fcb4c7d..e375cfd1117e 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -9,6 +9,10 @@ . = ..() if(turf_loc_check && (!isturf(loc) || NeverShouldHaveComeHere(loc))) return INITIALIZE_HINT_QDEL + var/static/list/loc_connections = list( + COMSIG_TURF_CHANGED = PROC_REF(handle_turf_change), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/decal/blob_act(obj/structure/blob/B) if(B && B.loc == loc) @@ -24,9 +28,12 @@ if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava qdel(src) -/obj/effect/decal/HandleTurfChange(turf/T) - ..() - if(T == loc && NeverShouldHaveComeHere(T)) +/obj/effect/decal/proc/handle_turf_change(turf/source, path, list/new_baseturfs, flags, list/post_change_callbacks) + SIGNAL_HANDLER + post_change_callbacks += CALLBACK(src, PROC_REF(sanity_check_self)) + +/obj/effect/decal/proc/sanity_check_self(turf/changed) + if(changed == loc && NeverShouldHaveComeHere(changed)) qdel(src) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -34,6 +41,7 @@ /obj/effect/turf_decal icon = 'icons/turf/decals.dmi' icon_state = "warningline" + plane = FLOOR_PLANE layer = TURF_DECAL_LAYER var/detail_overlay var/detail_color diff --git a/code/game/objects/effects/effect_system/effect_shield.dm b/code/game/objects/effects/effect_system/effect_shield.dm index 4344fbb26076..00f943aa138e 100644 --- a/code/game/objects/effects/effect_system/effect_shield.dm +++ b/code/game/objects/effects/effect_system/effect_shield.dm @@ -16,7 +16,7 @@ /obj/effect/shield/Destroy() var/turf/location = get_turf(src) location.heat_capacity=old_heat_capacity - ..() + return ..() /obj/effect/shield/singularity_act() return diff --git a/code/game/objects/effects/effect_system/effects_explosion.dm b/code/game/objects/effects/effect_system/effects_explosion.dm index 98ac62f095a5..f12ee1e2df72 100644 --- a/code/game/objects/effects/effect_system/effects_explosion.dm +++ b/code/game/objects/effects/effect_system/effects_explosion.dm @@ -13,6 +13,8 @@ var/steps_amt = pick(1;25,2;50,3,4;200) for(var/j in 1 to steps_amt) step(src, direct) + if(QDELETED(src)) + return sleep(1) qdel(src) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 7e18077c841b..fea67e7341b4 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -3,7 +3,7 @@ //Effects are mostly temporary visual effects like sparks, smoke, as well as decals, etc... /obj/effect icon = 'icons/effects/effects.dmi' - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | HYPERSPACE_PROOF move_resist = INFINITY obj_flags = 0 vis_flags = VIS_INHERIT_PLANE diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index cc7cf2eb3d0b..6d5f840fcc68 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -96,5 +96,6 @@ return INITIALIZE_HINT_QDEL /obj/effect/abstract/directional_lighting + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | LANDING_PROOF | HYPERSPACE_PROOF mouse_opacity = MOUSE_OPACITY_TRANSPARENT vis_flags = VIS_HIDE diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 5331e0b466db..f5f28c60c80f 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -49,9 +49,11 @@ /obj/effect/overlay/vis mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE - vis_flags = NONE - var/unused = 0 //When detected to be unused it gets set to world.time, after a while it gets removed - var/cache_expiration = 2 MINUTES // overlays which go unused for 2 minutes get cleaned up + vis_flags = VIS_INHERIT_DIR + ///When detected to be unused it gets set to world.time, after a while it gets removed + var/unused = 0 + ///overlays which go unused for this amount of time get cleaned up + var/cache_expiration = 2 MINUTES /obj/effect/overlay/light_visible name = "" diff --git a/code/game/objects/effects/proximity.dm b/code/game/objects/effects/proximity.dm deleted file mode 100644 index 7af165868ecb..000000000000 --- a/code/game/objects/effects/proximity.dm +++ /dev/null @@ -1,129 +0,0 @@ -/datum/proximity_monitor - var/atom/host //the atom we are tracking - var/atom/hasprox_receiver //the atom that will receive HasProximity calls. - var/atom/last_host_loc - var/list/checkers //list of /obj/effect/abstract/proximity_checkers - var/current_range - var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf - var/wire = FALSE - -/datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE) - checkers = list() - last_host_loc = _host.loc - ignore_if_not_on_turf = _ignore_if_not_on_turf - current_range = range - SetHost(_host) - -/datum/proximity_monitor/proc/SetHost(atom/H,atom/R) - if(H == host) - return - if(host) - UnregisterSignal(host, COMSIG_MOVABLE_MOVED) - if(R) - hasprox_receiver = R - else if(hasprox_receiver == host) //Default case - hasprox_receiver = H - host = H - RegisterSignal(host, COMSIG_MOVABLE_MOVED, .proc/HandleMove) - last_host_loc = host.loc - SetRange(current_range,TRUE) - -/datum/proximity_monitor/Destroy() - host = null - last_host_loc = null - hasprox_receiver = null - QDEL_LAZYLIST(checkers) - return ..() - -/datum/proximity_monitor/proc/HandleMove() - SIGNAL_HANDLER - - var/atom/_host = host - var/atom/new_host_loc = _host.loc - if(last_host_loc != new_host_loc) - last_host_loc = new_host_loc //hopefully this won't cause GC issues with containers - var/curr_range = current_range - SetRange(curr_range, TRUE) - if(curr_range) - testing("HasProx: [host] -> [host]") - hasprox_receiver.HasProximity(host) //if we are processing, we're guaranteed to be a movable - -/datum/proximity_monitor/proc/SetRange(range, force_rebuild = FALSE) - if(!force_rebuild && range == current_range) - return FALSE - . = TRUE - - current_range = range - - var/list/checkers_local = checkers - var/old_checkers_len = checkers_local.len - - var/atom/_host = host - - var/atom/loc_to_use = ignore_if_not_on_turf ? _host.loc : get_turf(_host) - if(wire && !isturf(loc_to_use)) //it makes assemblies attached on wires work - loc_to_use = get_turf(loc_to_use) - if(!isturf(loc_to_use)) //only check the host's loc - if(range) - var/obj/effect/abstract/proximity_checker/pc - if(old_checkers_len) - pc = checkers_local[old_checkers_len] - --checkers_local.len - QDEL_LAZYLIST(checkers_local) - else - pc = new(loc_to_use, src) - - checkers_local += pc //only check the host's loc - return - - var/list/turfs = RANGE_TURFS(range, loc_to_use) - var/turfs_len = turfs.len - var/old_checkers_used = min(turfs_len, old_checkers_len) - - //reuse what we can - for(var/I in 1 to old_checkers_len) - var/obj/effect/abstract/proximity_checker/pc = checkers_local[I] - if(I > old_checkers_used) - qdel(pc) //delete the leftovers - else if(QDELETED(pc)) - checkers_local[I] = new /obj/effect/abstract/proximity_checker(turfs[I], src) - else - pc.forceMove(turfs[I]) - - if(old_checkers_len < turfs_len) - //create what we lack - for(var/I in (old_checkers_used + 1) to turfs_len) - checkers_local += new /obj/effect/abstract/proximity_checker(turfs[I], src) - else - checkers_local.Cut(old_checkers_used + 1, old_checkers_len) - -/obj/effect/abstract/proximity_checker - invisibility = INVISIBILITY_ABSTRACT - anchored = TRUE - var/datum/proximity_monitor/monitor - -/obj/effect/abstract/proximity_checker/Initialize(mapload, datum/proximity_monitor/_monitor) - . = ..() - if(_monitor) - monitor = _monitor - else - stack_trace("proximity_checker created without host") - return INITIALIZE_HINT_QDEL - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, - COMSIG_ATOM_EXITED =.proc/on_uncrossed - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/abstract/proximity_checker/proc/on_uncrossed(datum/source, atom/movable/gone, direction) - SIGNAL_HANDLER - return - -/obj/effect/abstract/proximity_checker/Destroy() - monitor = null - return ..() - -/obj/effect/abstract/proximity_checker/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - - monitor?.hasprox_receiver?.HasProximity(AM) diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 28d9a16e0545..e8f94bc8e3ab 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -20,8 +20,6 @@ stack_trace("Gib list dir length mismatch!") return - var/obj/effect/decal/cleanable/blood/gibs/gib = null - if(sound_to_play && isnum(sound_vol)) playsound(src, sound_to_play, sound_vol, TRUE) @@ -46,14 +44,13 @@ if(gibamounts[i]) for(var/j = 1, j<= gibamounts[i], j++) var/gibType = gibtypes[i] - gib = new gibType(loc, diseases) + var/obj/effect/decal/cleanable/blood/gibs/gib = new gibType(loc, diseases) gib.add_blood_DNA(dna_to_add) var/list/directions = gibdirections[i] - if(isturf(loc)) - if(directions.len) - gib.streak(directions) + if(isturf(loc) && length(directions) && istype(gib)) + gib.streak(directions) return INITIALIZE_HINT_QDEL @@ -153,14 +150,19 @@ return ..() /obj/effect/gibspawner/robot/bodypartless - gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris) - gibamounts = list(1, 1, 1, 1, 1) + gibtypes = list(/obj/effect/decal/cleanable/robot_debris/up, /obj/effect/decal/cleanable/robot_debris/down, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/robot_debris) + gibamounts = list(1, 1, 1, 1, 1, 1) /obj/effect/gibspawner/robot/bodypartless/Initialize() if(!gibdirections.len) - gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs) return ..() /obj/effect/gibspawner/generic/crystal gibtypes = list(/obj/effect/decal/cleanable/glass/strange, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(5, 2, 2, 1) + +/obj/effect/gibspawner/generic/crystal/Initialize() + if(!gibdirections.len) + gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),GLOB.alldirs) + return ..() diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index cd2a3d7cc134..9ce3411cc93a 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -4,8 +4,13 @@ Because mapping is already tedious enough this spawner let you spawn generic again. */ +//These NEED to spawn immediately, because windows are important for keeping the space out +INITIALIZE_IMMEDIATE(/obj/effect/spawner/structure) + /obj/effect/spawner/structure name = "map structure spawner" + //Just so stuff doesn't leak out while it's initializing + CanAtmosPass = ATMOS_PASS_NO var/list/spawn_list /obj/effect/spawner/structure/Initialize() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index cc968a6a6b0a..b1134e471d03 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -36,7 +36,7 @@ icon_state = "stickyweb2" . = ..() -/obj/structure/spider/stickyweb/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/spider/stickyweb/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(genetic) return @@ -53,18 +53,19 @@ /obj/structure/spider/stickyweb/genetic //for the spider genes in genetics genetic = TRUE - var/mob/living/allowed_mob + //Reference to the mob that created this + var/allowed_mob_reference /obj/structure/spider/stickyweb/genetic/Initialize(mapload, allowedmob) - allowed_mob = allowedmob + allowed_mob_reference = REF(allowedmob) . = ..() -/obj/structure/spider/stickyweb/genetic/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/spider/stickyweb/genetic/CanAllowThrough(atom/movable/mover, border_dir) . = ..() //this is the normal spider web return aka a spider would make this TRUE - if(mover == allowed_mob) + if(REF(mover) == allowed_mob_reference) return TRUE else if(isliving(mover)) //we change the spider to not be able to go through here - if(mover.pulledby == allowed_mob) + if(REF(mover.pulledby) == allowed_mob_reference) return TRUE if(prob(50)) to_chat(mover, "You get stuck in \the [src] for a moment.") @@ -118,6 +119,7 @@ /obj/structure/spider/spiderling/Destroy() new/obj/item/reagent_containers/food/snacks/spiderling(get_turf(src)) + walk(src, 0) //Clean up reference for pathing . = ..() /obj/structure/spider/spiderling/Initialize() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index df43d20fecdc..e13cca64caf9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -133,8 +133,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb ///A bitfield of bodytypes that the item cannot be worn by. var/restricted_bodytypes = null - ///Who threw the item - var/mob/thrownby = null + ///A weakref to the mob who threw the item + var/datum/weakref/thrownby = null //I cannot verbally describe how much I hate this var ///the icon to indicate this object is being dragged mouse_drag_pointer = MOUSE_ACTIVE_POINTER @@ -683,11 +683,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) if(HAS_TRAIT(src, TRAIT_NODROP)) return - thrownby = thrower + thrownby = WEAKREF(thrower) callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own . = ..(target, range, speed, thrower, spin, diagonals_first, callback, force, gentle, quickstart = quickstart) - /obj/item/proc/after_throw(datum/callback/callback) if (callback) //call the original callback . = callback.Invoke() diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 9a0f8d069ab8..a6bdb4534b9b 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -46,7 +46,7 @@ RSF /obj/item/rsf/Initialize() . = ..() - to_dispense = cost_by_item[1] + to_dispense ||= cost_by_item[1] /obj/item/rsf/examine(mob/user) . = ..() @@ -152,6 +152,7 @@ RSF dispense_cost = 100 discriptor = "cookie-units" action_type = "Fabricates" + to_dispense = /obj/item/reagent_containers/food/snacks/cookie ///Tracks whether or not the cookiesynth is about to print a poisoned cookie var/toxin = FALSE //This might be better suited to some initialize fuckery, but I don't have a good "poisoned" sprite ///Holds a copy of world.time taken the last time the synth gained a charge. Used with cooldowndelay to track when the next charge should be gained diff --git a/code/game/objects/items/cash.dm b/code/game/objects/items/cash.dm index 53a809d1cd0c..c906da16b606 100644 --- a/code/game/objects/items/cash.dm +++ b/code/game/objects/items/cash.dm @@ -17,7 +17,7 @@ grind_results = list(/datum/reagent/iron = 10) /obj/item/spacecash/Initialize(mapload, amount) - ..() + . = ..() if(amount) value = amount update_appearance() diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 61a174871de5..888bebac8095 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -134,6 +134,10 @@ if(istype(C)) gun = C.gun +/obj/projectile/energy/chrono_beam/Destroy() + gun = null + return ..() + /obj/projectile/energy/chrono_beam/on_hit(atom/target) if(target && gun && isliving(target)) var/obj/structure/chrono_field/F = new(target.loc, target, gun) @@ -152,7 +156,9 @@ gun = loc . = ..() - +/obj/item/ammo_casing/energy/chrono_beam/Destroy() + gun = null + return ..() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index f0714b01dddd..ce1860a53e87 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -60,7 +60,7 @@ /obj/item/aicard/ui_data() var/list/data = list() - if(AI) + if(!QDELETED(AI)) data["name"] = AI.name data["laws"] = AI.laws.get_law_list(include_zeroth = TRUE, render_html = FALSE) data["health"] = (AI.health + 100) / 2 diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 40a52a23c6c1..18038aadfe05 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -176,5 +176,7 @@ return /obj/effect/dummy/chameleon/Destroy() - master.disrupt(0) + if(master) + master.disrupt(0) + master = null return ..() diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 39d06ab5a8b6..6f489b706af6 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -95,8 +95,9 @@ /obj/structure/projected_forcefield/Destroy() visible_message("[src] flickers and disappears!") playsound(src,'sound/weapons/resonator_blast.ogg',25,TRUE) - generator.current_fields -= src - generator = null + if(generator) + generator.current_fields -= src + generator = null return ..() /obj/structure/projected_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) @@ -105,4 +106,5 @@ /obj/structure/projected_forcefield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) if(sound_effect) play_attack_sound(damage_amount, damage_type, damage_flag) - generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0) + if(generator) + generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index 1b1177e137a7..e9da1f126aab 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -38,6 +38,7 @@ soundloop = new(list(src), FALSE) /obj/item/geiger_counter/Destroy() + QDEL_NULL(soundloop) STOP_PROCESSING(SSobj, src) return ..() @@ -111,15 +112,14 @@ return ..() /obj/item/geiger_counter/proc/update_sound() - var/datum/looping_sound/geiger/loop = soundloop if(!scanning) - loop.stop() + soundloop.stop() return if(!radiation_count) - loop.stop() + soundloop.stop() return - loop.last_radiation = radiation_count - loop.start() + soundloop.last_radiation = radiation_count + soundloop.start() /obj/item/geiger_counter/rad_act(amount) . = ..() diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 60027e378a88..be41de2c8411 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -1,5 +1,6 @@ /obj/item/stack/circuit_stack name = "polycircuit aggregate" + singular_name = "polycircuit" desc = "A dense, overdesigned cluster of electronics which attempted to function as a multipurpose circuit electronic. Circuits can be removed from it... if you don't bleed out in the process." icon_state = "circuit_mess" item_state = "rods" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index da1dfe9e5250..1e36f8bd328f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -659,19 +659,19 @@ GENE SCANNER if (T.slime_mutation[3] == T.slime_mutation[4]) if (T.slime_mutation[2] == T.slime_mutation[1]) to_render += "\nPossible mutation: [T.slime_mutation[3]]\ - \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting" + \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting" else to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" + \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" else to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" + \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" if (T.cores > 1) to_render += "\nMultiple cores detected" to_render += "\nGrowth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" if(T.effectmod) to_render += "\nCore mutation in progress: [T.effectmod]\ - \nProgress in core mutation: [T.applied] / [(SLIME_EXTRACT_CROSSING_REQUIRED * T.crossbreed_modifier)]" + \nProgress in core mutation: [T.applied] / [(SLIME_EXTRACT_CROSSING_REQUIRED * T.crossbreed_modifier)]" to_chat(user, examine_block(to_render)) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 438b37fe5944..b26ec181525b 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -12,10 +12,16 @@ var/obj/item/tank/tank_one var/obj/item/tank/tank_two var/obj/item/assembly/attached_device - var/mob/attacher = null + var/datum/weakref/attacher_ref = null var/valve_open = FALSE var/toggle = TRUE +/obj/item/transfer_valve/Destroy() + QDEL_NULL(tank_one) + QDEL_NULL(tank_two) + QDEL_NULL(attached_device) + return ..() + /obj/item/transfer_valve/IsAssemblyHolder() return TRUE @@ -54,7 +60,7 @@ A.holder = src A.toggle_secure() //this calls update_appearance(), which calls update_appearance() on the holder (i.e. the bomb). log_bomber(user, "attached a [item.name] to a ttv -", src, null, FALSE) - attacher = user + attacher_ref = WEAKREF(user) return //These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. @@ -157,6 +163,7 @@ var/admin_attachment_message var/attachment_message if(attachment) + var/mob/attacher = attacher_ref.resolve() admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]" attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]" diff --git a/code/game/objects/items/dice.dm b/code/game/objects/items/dice.dm index 631466b3240a..c81cbd02bf2b 100644 --- a/code/game/objects/items/dice.dm +++ b/code/game/objects/items/dice.dm @@ -175,8 +175,10 @@ diceroll(user) /obj/item/dice/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - diceroll(thrownby) - . = ..() + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by) + diceroll(thrown_by) + return ..() /obj/item/dice/proc/diceroll(mob/user) result = roll(sides) diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 6e4687d72c32..0c7203f0a5c0 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -70,7 +70,8 @@ ///////////////////////////////// /obj/effect/payload_spawner/Initialize(mapload, type, numspawned) ..() - spawn_payload(type, numspawned) + if(type && isnum(numspawned)) + spawn_payload(type, numspawned) return INITIALIZE_HINT_QDEL /obj/effect/payload_spawner/proc/spawn_payload(type, numspawned) diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm index bffc31db28fd..7bf5fd65bf08 100644 --- a/code/game/objects/items/grenades/festive.dm +++ b/code/game/objects/items/grenades/festive.dm @@ -47,7 +47,7 @@ /obj/item/sparkler/Destroy() STOP_PROCESSING(SSobj, src) - ..() + return ..() /obj/item/sparkler/ignition_effect(atom/A, mob/user) . = "[user] gracefully lights [A] with [src]." diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 87dd83ffbcf2..490c5c0aebaa 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -28,10 +28,9 @@ AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES) /obj/item/grenade/c4/Destroy() - qdel(wires) - wires = null + QDEL_NULL(wires) target = null - ..() + return ..() /obj/item/grenade/c4/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index d0455905eb9b..a83d69c53145 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -2,8 +2,12 @@ name = "tracking implant" desc = "Track with this." activated = FALSE - var/lifespan_postmortem = 6000 //for how many deciseconds after user death will the implant work? - var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons? + ///for how many deciseconds after user death will the implant work? + var/lifespan_postmortem = 6000 + ///will people implanted with this act as teleporter beacons? + var/allow_teleport = TRUE + ///The id of the timer that's qdeleting us + var/timerid /obj/item/implant/tracking/c38 name = "TRAC implant" @@ -13,7 +17,11 @@ /obj/item/implant/tracking/c38/Initialize() . = ..() - QDEL_IN(src, lifespan) + timerid = QDEL_IN(src, lifespan) + +/obj/item/implant/tracking/c38/Destroy() + deltimer(timerid) + return ..() /obj/item/implant/tracking/New() ..() diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 0775e43d93f7..b500eadca2f2 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -239,6 +239,10 @@ spark_system.set_up(5, 0, src) spark_system.attach(src) +/obj/item/melee/transforming/energy/blade/Destroy() + QDEL_NULL(spark_system) + return ..() + /obj/item/melee/transforming/energy/blade/transform_weapon(mob/living/user, supress_message_text) return diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 16404d1d13bd..153c3a75564d 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -254,7 +254,7 @@ if(!iscarbon(user)) target.LAssailant = null else - target.LAssailant = user + target.LAssailant = WEAKREF(user) cooldown_check = world.time + cooldown else var/wait_desc = get_wait_description() diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 3f8d0210442d..f0cb02fa8e02 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -97,8 +97,8 @@ var/refill_rate = 1 //Rate per process() tick mop refills itself var/refill_reagent = /datum/reagent/water //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING -/obj/item/mop/advanced/New() - ..() +/obj/item/mop/advanced/Initialize() + . = ..() START_PROCESSING(SSobj, src) /obj/item/mop/advanced/attack_self(mob/user) @@ -111,7 +111,6 @@ playsound(user, 'sound/machines/click.ogg', 30, TRUE) /obj/item/mop/advanced/process() - if(reagents.total_volume < mopcap) reagents.add_reagent(refill_reagent, refill_rate) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 47a4120061b4..09e676980262 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -550,7 +550,7 @@ var/energy_recharge_cyborg_drain_coefficient = 0.4 var/cyborg_cell_critical_percentage = 0.05 var/mob/living/silicon/robot/host = null - var/datum/proximity_monitor/advanced/dampening_field + var/datum/proximity_monitor/advanced/peaceborg_dampener/dampening_field var/projectile_damage_coefficient = 0.5 var/projectile_damage_tick_ecost_coefficient = 2 //Lasers get half their damage chopped off, drains 50 power/tick. Note that fields are processed 5 times per second. var/projectile_speed_coefficient = 1.5 //Higher the coefficient slower the projectile. @@ -600,10 +600,9 @@ /obj/item/borg/projectile_dampen/proc/activate_field() if(istype(dampening_field)) QDEL_NULL(dampening_field) - dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src)) var/mob/living/silicon/robot/owner = get_host() - if(owner) - owner.module.allow_riding = FALSE + dampening_field = new(owner, field_radius, TRUE, src) + owner?.module.allow_riding = FALSE active = TRUE /obj/item/borg/projectile_dampen/proc/deactivate_field() @@ -644,11 +643,6 @@ /obj/item/borg/projectile_dampen/process() process_recharge() process_usage() - update_location() - -/obj/item/borg/projectile_dampen/proc/update_location() - if(dampening_field) - dampening_field.HandleMove() /obj/item/borg/projectile_dampen/proc/process_usage() var/usage = 0 diff --git a/code/game/objects/items/stacks/license_plates.dm b/code/game/objects/items/stacks/license_plates.dm index 1a5cb1b05eeb..acf831cff409 100644 --- a/code/game/objects/items/stacks/license_plates.dm +++ b/code/game/objects/items/stacks/license_plates.dm @@ -1,5 +1,6 @@ /obj/item/stack/license_plates - name = "invalid plate" + name = "invalid plates" + singular_name = "invalid plate" desc = "someone fucked up" icon = 'icons/obj/machines/prison.dmi' icon_state = "empty_plate" @@ -7,14 +8,16 @@ max_amount = 50 /obj/item/stack/license_plates/empty - name = "empty license plate" + name = "empty license plates" + singular_name = "empty licence plate" desc = "Instead of a license plate number, this could contain a quote like \"Live laugh love\"." /obj/item/stack/license_plates/empty/fifty amount = 50 /obj/item/stack/license_plates/filled - name = "license plate" + name = "license plates" + singular_name = "license plate" desc = "Prison labor paying off." icon_state = "filled_plate_1_1" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f72e588d8e04..a811ae46d822 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -752,13 +752,15 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra amount = 50 /obj/item/stack/sheet/capitalisium - name = "capitalisium sheet" + name = "capitalisium sheets" + singular_name = "capitalisium sheet" desc = "A source of raw capitalism, capable of bringing forth the prophesized Capitalist Golem." icon_state = "sheet-capitalisium" merge_type = /obj/item/stack/sheet/capitalisium /obj/item/stack/sheet/stalinium - name = "stalinium sheet" + name = "stalinium sheets" + singular_name = "stalinium sheet" desc = "A source of raw socialism, capable of bringing forth the prophesized Soviet Golem." icon_state = "sheet-stalinium" merge_type = /obj/item/stack/sheet/stalinium diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 7890bca02d1e..79ec280138a2 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -5,7 +5,8 @@ */ /obj/item/stack/wrapping_paper - name = "wrapping paper" + name = "wrapping paper roll" + singular_name = "wrapping sheet" desc = "Wrap packages with this festive paper to make gifts." icon = 'icons/obj/stack_objects.dmi' icon_state = "wrap_paper" diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 2aefd383342e..58f10b2ccd8d 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -27,6 +27,8 @@ if(!spawn_type) return var/datum/component/storage/STR = GetComponent(/datum/component/storage) + if(!spawn_type) + return for(var/i = 1 to STR.max_items) new spawn_type(src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index d9f3dd296a9b..e494392ee911 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -322,8 +322,9 @@ var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) if(ishuman(hit_atom) && !caught && prob(throw_stun_chance))//if they are a carbon and they didn't catch it baton_effect(hit_atom) - if(thrownby && !caught) - addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrownby, throw_range+2, throw_speed, null, TRUE), 1) + var/mob/thrown_by = thrownby?.resolve() + if(thrown_by && !caught) + addtimer(CALLBACK(src, /atom/movable.proc/throw_at, thrown_by, throw_range+2, throw_speed, null, TRUE), 1) else return ..() diff --git a/code/game/objects/items/wayfinding.dm b/code/game/objects/items/wayfinding.dm index b1e6523ee926..0fc80de2759d 100644 --- a/code/game/objects/items/wayfinding.dm +++ b/code/game/objects/items/wayfinding.dm @@ -126,7 +126,6 @@ icon_state = "pinpointer_way" resistance_flags = NONE var/owner = null - var/list/beacons = list() var/roundstart = FALSE /obj/item/pinpointer/wayfinding/attack_self(mob/living/user) @@ -138,8 +137,7 @@ if (!owner) owner = user.real_name - if(beacons.len) - beacons.Cut() + var/list/beacons = list() for(var/obj/machinery/navbeacon/B in GLOB.wayfindingbeacons) beacons[B.codes["wayfinding"]] = B diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ff33571efc42..d2d1325e435b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -15,7 +15,7 @@ ///Damage under this value will be completely ignored var/damage_deflection = 0 - var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF | LANDING_PROOF | HYPERSPACE_PROOF var/acid_level = 0 //how much acid is on that obj diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 563e48e27f49..f59e29dd3b9a 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -30,11 +30,10 @@ /obj/structure/AIcore/Destroy() if(circuit) - qdel(circuit) - circuit = null + QDEL_NULL(circuit) if(brain) - qdel(brain) - brain = null + QDEL_NULL(brain) + QDEL_NULL(laws) return ..() /obj/structure/AIcore/latejoin_inactive diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 0cda61d847ef..3c7d1ac0f01c 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -193,10 +193,19 @@ anchored = TRUE /obj/structure/bed/dogbed/proc/update_owner(mob/living/M) + if(owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) owner = M + RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(owner_deleted)) name = "[M]'s bed" desc = "[M]'s bed! Looks comfy." +/obj/structure/bed/dogbed/proc/owner_deleted() + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + owner = null + name = initial(name) + desc = initial(desc) + /obj/structure/bed/dogbed/buckle_mob(mob/living/M, force, check_loc) . = ..() update_owner(M) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index f959d911bd33..bc1155ec34aa 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -266,8 +266,8 @@ LINEN BINS dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET /obj/item/bedsheet/double/Initialize() - ..() - desc += " This one is double." + . = ..() + desc += " This one is double-sized." /obj/item/bedsheet/double/blue icon_state = "double_sheetblue" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 25ad21d25d20..788fc28a51c6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -42,15 +42,22 @@ /obj/structure/closet/Initialize(mapload) - if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents - addtimer(CALLBACK(src, .proc/take_contents), 0) . = ..() + + // if closed, any item at the crate's loc is put in the contents + if (mapload && !opened) + . = INITIALIZE_HINT_LATELOAD + update_appearance() if(populate) PopulateContents() RegisterSignal(src, COMSIG_ATOM_CANREACH, .proc/canreach_react) +/obj/structure/closet/LateInitialize() + take_contents(src) + return ..() + /obj/structure/closet/proc/canreach_react(datum/source, list/next) return COMPONENT_BLOCK_REACH //closed block, open have nothing inside. @@ -111,7 +118,7 @@ if(HAS_TRAIT(L, TRAIT_SKITTISH)) . += "Ctrl-Shift-click [src] to jump inside." -/obj/structure/closet/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/closet/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(wall_mounted) return TRUE @@ -142,6 +149,8 @@ return TRUE /obj/structure/closet/dump_contents() + if(!isturf(loc)) + return var/atom/L = drop_location() for(var/atom/movable/AM as anything in src) AM.forceMove(L) @@ -150,8 +159,8 @@ if(throwing) throwing.finalize(FALSE) -/obj/structure/closet/proc/take_contents() - var/atom/L = drop_location() +/obj/structure/closet/proc/take_contents(atom/movable/holder) + var/atom/L = holder.drop_location() for(var/atom/movable/AM in L) if(istype(AM, /obj/effect)) //WS edit, closets and crates do not eat your lamp continue @@ -218,7 +227,7 @@ /obj/structure/closet/proc/close(mob/living/user) if(!opened || !can_close(user)) return FALSE - take_contents() + take_contents(src) playsound(loc, close_sound, close_sound_volume, TRUE, -3) climb_time = initial(climb_time) opened = FALSE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index c2af6ad410c3..0e7ab6e0a526 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -4,7 +4,7 @@ /obj/structure/closet/secure_closet/freezer/Destroy() recursive_organ_check(src) - ..() + return ..() /obj/structure/closet/secure_closet/freezer/Initialize() . = ..() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 252aff8d4d5a..70b61cfa8d08 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -25,7 +25,7 @@ opened = TRUE update_appearance() -/obj/structure/closet/crate/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/closet/crate/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!istype(mover, /obj/structure/closet)) var/obj/structure/closet/crate/locatedcrate = locate(/obj/structure/closet/crate) in get_turf(mover) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 4431bd1307c2..4884a757453e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -378,8 +378,6 @@ var/sale_price = 20 ///The Account which will receive payment for purchases. Set by the first ID to swipe the tray. var/datum/bank_account/payments_acc = null - ///We're using the same trick as paper does in order to cache the image, and only load the UI when messed with. - var/list/viewing_ui = list() /obj/structure/displaycase/forsale/update_appearance() //remind me to fix my shitcode later var/icon/I @@ -403,7 +401,6 @@ if(!ui) ui = new(user, src, "Vendatray", name) ui.set_autoupdate(FALSE) - viewing_ui[user] = ui ui.open() /obj/structure/displaycase/forsale/ui_data(mob/user) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 62ee78c4f885..b25d84db6a38 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -68,7 +68,7 @@ yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making yolk.update_body() yolk.gib() - qdel(egg) + QDEL_NULL(egg) return ..() @@ -92,6 +92,11 @@ var/datum/team/ashwalkers/team var/obj/structure/ash_walker_eggshell/eggshell + +/obj/effect/mob_spawn/human/ash_walker/Destroy() + eggshell = null + return ..() + /obj/effect/mob_spawn/human/ash_walker/allow_spawn(mob/user) if(!(user.key in team.players_spawned))//one per person unless you get a bonus spawn return TRUE @@ -111,7 +116,7 @@ ADD_TRAIT(H, TRAIT_PRIMITIVE, ROUNDSTART_TRAIT) team.players_spawned += (new_spawn.key) eggshell.egg = null - qdel(eggshell) + QDEL_NULL(eggshell) /obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam) . = ..() @@ -397,7 +402,7 @@ /obj/effect/mob_spawn/human/hotel_staff/Destroy() new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) - ..() + return ..() /obj/effect/mob_spawn/human/demonic_friend name = "Essence of friendship" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 52b19a23eada..7a8aec8a97f2 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -297,7 +297,7 @@ qdel(src) return TRUE -/obj/structure/girder/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/girder/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile)) return prob(girderpasschance) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 103e29bb2b1a..56f50eb1768e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -126,7 +126,7 @@ if(!shock(user, 70)) take_damage(20, BRUTE, "melee", 1) -/obj/structure/grille/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/grille/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!. && istype(mover, /obj/projectile)) return prob(30) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 5ecbd70110d8..f85d57278cf9 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -85,7 +85,7 @@ max_integrity = 20 var/allow_walk = TRUE //can we pass through it on walk intent -/obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return @@ -104,7 +104,7 @@ countdown_color = "#FCFF00" lifespan = 2 MINUTES -/obj/structure/holosign/barrier/wetsign/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/holosign/barrier/wetsign/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(iscarbon(mover)) var/mob/living/carbon/C = mover @@ -164,7 +164,7 @@ . = ..() . += "The biometric scanners are [force_allaccess ? "off" : "on"]." -/obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(force_allaccess) return TRUE @@ -193,7 +193,7 @@ return TRUE /obj/structure/holosign/barrier/medical/attack_hand(mob/living/user) - if(CanPass(user) && user.a_intent == INTENT_HELP) + if(user.a_intent == INTENT_HELP && CanPass(user, get_dir(src, user))) force_allaccess = !force_allaccess to_chat(user, "You [force_allaccess ? "deactivate" : "activate"] the biometric scanners.") //warning spans because you can make the station sick! else diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 9b13275088c6..9dda5181c071 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -230,7 +230,7 @@ /obj/item/gun_control/Destroy() turret = null - ..() + return ..() /obj/item/gun_control/CanItemAutoclick() return TRUE diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index bf7c919215d1..3cd67b47d74e 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -57,7 +57,7 @@ return return TryToSwitchState(user) -/obj/structure/mineral_door/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/mineral_door/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(istype(mover, /obj/effect/beam)) return !opacity diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 8b50469eb8c0..2e8c7508d594 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -378,7 +378,7 @@ GLOBAL_LIST_EMPTY(crematoriums) icon_state = "morguet" pass_flags_self = PASSTABLE -/obj/structure/tray/m_tray/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/tray/m_tray/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 2f385f65a161..4c7625b5dbcb 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -69,31 +69,33 @@ return CanAStarPass(ID, to_dir, M.pulling) return TRUE //diseases, stings, etc can pass -/obj/structure/plasticflaps/CanAllowThrough(atom/movable/A, turf/T) + +/obj/structure/plasticflaps/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(istype(A) && (A.pass_flags & PASSGLASS)) + if(istype(mover) && (mover.pass_flags & PASSGLASS)) return prob(60) - var/obj/structure/bed/B = A - if(istype(A, /obj/structure/bed) && (B.has_buckled_mobs() || B.density))//if it's a bed/chair and is dense or someone is buckled, it will not pass - return FALSE + if(istype(mover, /obj/structure/bed)) + var/obj/structure/bed/bed_mover = mover + if(bed_mover.density || bed_mover.has_buckled_mobs())//if it's a bed/chair and is dense or someone is buckled, it will not pass + return FALSE - if(istype(A, /obj/structure/closet/cardboard)) - var/obj/structure/closet/cardboard/C = A - if(C.move_delay) + else if(istype(mover, /obj/structure/closet/cardboard)) + var/obj/structure/closet/cardboard/cardboard_mover = mover + if(cardboard_mover.move_delay) return FALSE - if(ismecha(A)) + else if(ismecha(mover)) return FALSE - else if(isliving(A)) // You Shall Not Pass! - var/mob/living/M = A - if(isbot(A)) //Bots understand the secrets + else if(isliving(mover)) // You Shall Not Pass! + var/mob/living/living_mover = mover + if(isbot(mover)) //Bots understand the secrets return TRUE - if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. + if(living_mover.buckled && istype(living_mover.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. return TRUE - if(M.body_position == STANDING_UP && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. + if(living_mover.body_position == STANDING_UP && !living_mover.ventcrawler && living_mover.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. return FALSE /obj/structure/plasticflaps/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 61b07aadb090..6147308cf62e 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -82,11 +82,10 @@ to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") return TRUE -/obj/structure/railing/CanPass(atom/movable/mover, turf/target) +/obj/structure/railing/CanPass(atom/movable/mover, border_dir) . = ..() - if(get_dir(loc, target) & dir) - var/checking = FLYING | FLOATING - return . || mover.throwing || mover.movement_type & checking + if(border_dir & dir) + return . || mover.throwing || mover.movement_type & (FLYING | FLOATING) return TRUE /obj/structure/railing/proc/on_exit(datum/source, atom/movable/leaving, direction) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 0d540477684f..3bf44bdfc0d8 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -98,7 +98,7 @@ /obj/structure/table/attack_tk() return FALSE -/obj/structure/table/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/table/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return @@ -312,6 +312,9 @@ /obj/structure/table/rolling/Moved(atom/OldLoc, Dir) . = ..() + //Nullspaced + if(!loc) + return for(var/mob/M in OldLoc.contents)//Kidnap everyone on top M.forceMove(loc) for(var/x in attached_items) @@ -585,7 +588,7 @@ smoothing_flags = NONE smoothing_groups = null canSmoothWith = null - can_buckle = 1 + can_buckle = TRUE buckle_lying = 90 //I don't see why you wouldn't be lying down while buckled to it buckle_requires_restraints = FALSE can_flip = FALSE @@ -614,10 +617,21 @@ /obj/structure/table/optable/proc/get_patient() var/mob/living/carbon/M = locate(/mob/living/carbon) in loc if(M) - if(M.resting) - patient = M + if(M.resting || M.buckled == src) + set_patient(M) else - patient = null + set_patient(null) + +/obj/structure/table/optable/proc/set_patient(new_patient) + if(patient) + UnregisterSignal(patient, COMSIG_PARENT_QDELETING) + patient = new_patient + if(patient) + RegisterSignal(patient, COMSIG_PARENT_QDELETING, .proc/patient_deleted) + +/obj/structure/table/optable/proc/patient_deleted(datum/source) + SIGNAL_HANDLER + set_patient(null) /obj/structure/table/optable/proc/check_eligible_patient() get_patient() @@ -645,7 +659,7 @@ . = ..() . += "It's held together by a couple of bolts." -/obj/structure/rack/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/rack/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 6e0d99ddec33..fefcc0e47b95 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -114,6 +114,12 @@ time_between_triggers = 10 flare_message = "[src] snaps shut!" +/obj/structure/trap/stun/hunter/Destroy() + if(!QDELETED(stored_item)) + qdel(stored_item) + stored_item = null + return ..() + /obj/structure/trap/stun/hunter/on_entered(datum/source, atom/movable/AM) if(isliving(AM)) var/mob/living/L = AM @@ -124,6 +130,12 @@ /obj/structure/trap/stun/hunter/flare() ..() + var/turf/our_turf = get_turf(src) + if(!our_turf) + return + if(!stored_item) + qdel(src) + return stored_item.forceMove(get_turf(src)) forceMove(stored_item) if(caught) @@ -167,7 +179,9 @@ forceMove(stored_trap)//moves item into trap /obj/item/bountytrap/Destroy() - qdel(stored_trap) + if(!QDELETED(stored_trap)) + qdel(stored_trap) + stored_trap = null QDEL_NULL(radio) QDEL_NULL(spark_system) . = ..() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 490752373295..200aaf35700d 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -57,9 +57,10 @@ icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]" return ..() -/obj/structure/windoor_assembly/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/windoor_assembly/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(get_dir(loc, target) == dir) //Make sure looking at appropriate border + + if(border_dir == dir) return if(istype(mover, /obj/structure/window)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 3b43831f2751..92a72b7261be 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -98,7 +98,7 @@ if(current_size >= STAGE_FIVE) deconstruct(FALSE) -/obj/structure/window/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/window/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return @@ -106,7 +106,7 @@ if(fulltile) return FALSE - if(get_dir(loc, target) == dir) + if(border_dir == dir) return FALSE if(istype(mover, /obj/structure/window)) @@ -238,18 +238,24 @@ /obj/structure/window/proc/check_state_and_anchored(checked_state, checked_anchored) return check_state(checked_state) && check_anchored(checked_anchored) + /obj/structure/window/mech_melee_attack(obj/mecha/M) if(!can_be_reached()) return ..() /obj/structure/window/proc/can_be_reached(mob/user) - if(!fulltile) - if(get_dir(user,src) & dir) - for(var/obj/O in loc) - if(!O.CanPass(user, user.loc, 1)) - return 0 - return 1 + if(fulltile) + return TRUE + var/checking_dir = get_dir(user, src) + if(!(checking_dir & dir)) + return TRUE // Only windows on the other side may be blocked by other things. + checking_dir = REVERSE_DIR(checking_dir) + for(var/obj/blocker in loc) + if(!blocker.CanPass(user, checking_dir)) + return FALSE + return TRUE + /obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) . = ..() diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 885128f2caf0..a8567072f56b 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -84,6 +84,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_lighting_corner_SW = lighting_corner_SW var/old_lighting_corner_NW = lighting_corner_NW var/old_directional_opacity = directional_opacity + var/old_dynamic_lumcount = dynamic_lumcount + var/old_opacity = opacity var/old_exl = explosion_level var/old_exi = explosion_id @@ -134,6 +136,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( lighting_corner_SW = old_lighting_corner_SW lighting_corner_NW = old_lighting_corner_NW + dynamic_lumcount = old_dynamic_lumcount + if(SSlighting.initialized) lighting_object = old_lighting_object @@ -151,8 +155,11 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/turf/open/space/S in RANGE_TURFS(1, W)) //RANGE_TURFS is in code\__HELPERS\game.dm S.check_starlight(W) - // Smoothing is deferred if CHANGETURF_DEFER_BATCH is set. - if(!(flags & CHANGETURF_DEFER_BATCH)) + if(old_opacity != opacity && SSticker) + GLOB.cameranet.bareMajorChunkChange(src) + + // Smoothing is deferred if CHANGETURF_DEFER_BATCH is set, or we're uninitialized + if(!(flags & CHANGETURF_DEFER_BATCH) && (flags_1 & INITIALIZED_1)) QUEUE_SMOOTH_NEIGHBORS(W) QUEUE_SMOOTH(W) @@ -170,7 +177,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/turf_fire_ref if(turf_fire) if(isgroundlessturf(newTurf)) - qdel(turf_fire) + QDEL_NULL(turf_fire) else turf_fire_ref = turf_fire newTurf.turf_fire = turf_fire_ref @@ -179,14 +186,15 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( QDEL_NULL(stashed_air) else if(turf_fire) - qdel(turf_fire) - if(ispath(path,/turf/closed)) - update_air_ref(-1) - . = ..() - else + QDEL_NULL(turf_fire) + if(ispath(path, /turf/open)) . = ..() if(!istype(air,/datum/gas_mixture)) Initalize_Atmos(0) + else + update_air_ref(-1) + . = ..() + // Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) @@ -318,7 +326,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/obj/machinery/door/firedoor/FD in T) FD.CalculateAffectingAreas() - HandleTurfChange(src) /turf/open/AfterChange(flags) ..() diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 96c90e4a3d64..879e13192a01 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -17,7 +17,7 @@ AddComponent(/datum/component/chasm, below()) /// Lets people walk into chasms. -/turf/open/chasm/CanAllowThrough(atom/movable/AM, turf/target) +/turf/open/chasm/CanAllowThrough(atom/movable/mover, border_dir) . = ..() return TRUE diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm index b14b9f8f52c1..f4b1f46a96ff 100644 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -13,9 +13,9 @@ layer = CATWALK_LAYER baseturfs = /turf/open/floor/plating footstep = FOOTSTEP_CATWALK - barefootstep = FOOTSTEP_CATWALK - clawfootstep = FOOTSTEP_CATWALK - heavyfootstep = FOOTSTEP_CATWALK + barefootstep = FOOTSTEP_HARD_BAREFOOT + clawfootstep = FOOTSTEP_HARD_CLAW + heavyfootstep = FOOTSTEP_GENERIC_HEAVY var/covered = TRUE /turf/open/floor/plating/catwalk_floor/Initialize(mapload, inherited_virtual_z) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 5fbc7cc40622..306988f0d42f 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -153,6 +153,9 @@ GLOBAL_DATUM_INIT(openspace_backdrop_one_for_all, /atom/movable/openspace_backdr /turf/open/openspace/icemoon/Initialize(mapload, inherited_virtual_z) . = ..() var/turf/T = below() + //I wonder if I should error here + if(!T) + return if(T.flags_1 & NO_RUINS_1) ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR) return diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 6aa9558720cd..dc1c9cf282d1 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -32,16 +32,18 @@ AM.throw_atom_into_space() /atom/proc/throw_atom_into_space() - if(istype(src, /obj/docking_port)) - return - if(iseffect(src)) - return - if(isliving(src)) - var/mob/living/poor_soul = src // This may not seem like much, but if you toss someone out - poor_soul.apply_damage_type(25, BRUTE) // and they go through like four tiles, they're goners + if(flags_1 & INITIALIZED_1) return qdel(src) +/obj/throw_atom_into_space() + if(resistance_flags & HYPERSPACE_PROOF) + return + return ..() + +/mob/living/throw_atom_into_space() + apply_damage_type(25, BRUTE) // This may not seem like much, but if you toss someone out and they go through like four tiles, they're goners + /turf/open/space/transit/CanBuildHere() return SSshuttle.is_in_shuttle_bounds(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a440cd951905..e2fb89b9cb3b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -118,8 +118,6 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) - visibilityChanged() - for(var/atom/movable/content as anything in src) Entered(content, null) @@ -190,7 +188,6 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) for(var/A in B.contents) qdel(A) return - visibilityChanged() QDEL_LIST(blueprint_data) flags_1 &= ~INITIALIZED_1 requires_activation = FALSE @@ -234,15 +231,14 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) if(density) return TRUE - for(var/atom/movable/content as anything in contents) + for(var/atom/movable/movable_content as anything in contents) // We don't want to block ourselves or consider any ignored atoms. - if((content == source_atom) || (content in ignore_atoms)) + if((movable_content == source_atom) || (movable_content in ignore_atoms)) continue - // If the thing is dense AND we're including mobs or the thing isn't a mob AND if there's a source atom and // it cannot pass through the thing on the turf, we consider the turf blocked. - if(content.density && (!exclude_mobs || !ismob(content))) - if(source_atom && content.CanPass(source_atom, src)) + if(movable_content.density && (!exclude_mobs || !ismob(movable_content))) + if(source_atom && movable_content.CanPass(source_atom, get_dir(src, source_atom))) continue return TRUE return FALSE @@ -352,11 +348,11 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) // By default byond will call Bump() on the first dense object in contents // Here's hoping it doesn't stay like this for years before we finish conversion to step_ var/atom/firstbump - var/canPassSelf = CanPass(mover, src) + var/canPassSelf = CanPass(mover, get_dir(src, mover)) if(canPassSelf || (mover.movement_type & PHASING) || (mover.pass_flags & pass_flags_self)) for(var/atom/movable/thing as anything in contents) if(QDELETED(mover)) - return FALSE //We were deleted, do not attempt to proceed with movement. + return FALSE //We were deleted, do not attempt to proceed with movement. if(thing == mover || thing == mover.loc) // Multi tile objects and moving out of other objects continue if(!thing.Cross(mover)) diff --git a/code/game/world.dm b/code/game/world.dm index 8377932887c9..93f1e15e88cf 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -151,6 +151,9 @@ GLOBAL_VAR(restart_counter) #ifdef UNIT_TESTS GLOB.test_log = "[GLOB.log_directory]/tests.log" start_log(GLOB.test_log) +#endif +#ifdef REFERENCE_DOING_IT_LIVE + GLOB.harddel_log = "[GLOB.log_directory]/harddels.log" #endif start_log(GLOB.world_game_log) start_log(GLOB.world_attack_log) @@ -246,11 +249,11 @@ GLOBAL_VAR(restart_counter) TgsReboot() - #ifdef UNIT_TESTS +#ifdef UNIT_TESTS FinishTestRun() return - #endif +#else if(TgsAvailable()) var/do_hard_reboot // check the hard reboot counter @@ -277,6 +280,8 @@ GLOBAL_VAR(restart_counter) AUXTOOLS_SHUTDOWN(AUXMOS) ..() +#endif //ifdef UNIT_TESTS + /world/Del() shutdown_logging() // makes sure the thread is closed before end, else we terminate AUXTOOLS_SHUTDOWN(AUXMOS) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 32840115224c..fc6f055f4ae1 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -356,7 +356,7 @@ if("parrot") M.change_mob_type(/mob/living/simple_animal/parrot , null, null, delmob) if("polyparrot") - M.change_mob_type(/mob/living/simple_animal/parrot/Poly , null, null, delmob) + M.change_mob_type(/mob/living/simple_animal/parrot/Polly , null, null, delmob) if("constructjuggernaut") M.change_mob_type(/mob/living/simple_animal/hostile/construct/juggernaut , null, null, delmob) if("constructartificer") diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index e9fee95ab5ed..0295a1f95cb6 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -355,6 +355,10 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null qdel_on_finish = finished_qdel /datum/SDQL2_query/Destroy() + if(delete_click) + QDEL_NULL(delete_click) + if(action_click) + QDEL_NULL(action_click) state = SDQL2_STATE_HALTING query_tree = null obj_count_all = null diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index da8fe89cea48..6fc5f8a4c709 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -1,4 +1,4 @@ -#define ANNOTATE_OBJECT(object) testing ? "[get_area(object)] (estimated location: [json_encode(object.check_shuttle_offset())])" : ADMIN_VERBOSEJMP(object) +#define ANNOTATE_OBJECT(object) testing ? "[object.loc.loc.name] (estimated location: [json_encode(object.get_relative_location())])" : ADMIN_VERBOSEJMP(object) /atom/proc/check_shuttle_offset() if(!SSshuttle.initialized) @@ -28,31 +28,27 @@ var/list/results = atmosscan() to_chat(src, "[results.Join("\n")]", confidential = TRUE) -/proc/atmosscan(testing = FALSE) +/proc/atmosscan(testing = FALSE, critical_only = FALSE) var/list/results = list() + var/static/list/blacklist = typecacheof(list(/obj/machinery/atmospherics/pipe/layer_manifold, /obj/machinery/atmospherics/pipe/heat_exchanging)) - //Atmos Components - for(var/obj/machinery/atmospherics/components/component in GLOB.machines) - if(!testing && component.z && (!component.nodes || !component.nodes.len || (null in component.nodes))) - results += "Unconnected [component.name] located at [ANNOTATE_OBJECT(component)]" - for(var/obj/machinery/atmospherics/components/other_component in get_turf(component)) - if(other_component != component && other_component.piping_layer == component.piping_layer && other_component.dir == component.dir) - results += "Doubled [component.name] located at [ANNOTATE_OBJECT(component)]" - - //Manifolds - for(var/obj/machinery/atmospherics/pipe/manifold/manifold in SSair.atmos_machinery) - if(manifold.z && (!manifold.nodes || !manifold.nodes.len || (null in manifold.nodes))) - results += "Unconnected [manifold.name] located at [ANNOTATE_OBJECT(manifold)]" - for(var/obj/machinery/atmospherics/pipe/manifold/other_manifold in get_turf(manifold)) - if(other_manifold != manifold && other_manifold.piping_layer == manifold.piping_layer && other_manifold.dir == manifold.dir) - results += "Doubled [manifold.name] located at [ANNOTATE_OBJECT(manifold)]" + for(var/obj/machinery/atmospherics/pipe in SSair.atmos_machinery + SSair.atmos_air_machinery) + if(blacklist[pipe.type]) + continue + if(pipe.z && (!length(pipe.nodes) || (null in pipe.nodes)) && !critical_only) + results += "Unconnected [pipe.name] located at [ANNOTATE_OBJECT(pipe)]" + for(var/obj/machinery/atmospherics/other_pipe in get_turf(pipe)) + if(blacklist[other_pipe.type]) + continue + if(other_pipe != pipe && other_pipe.piping_layer == pipe.piping_layer && (other_pipe.initialize_directions & pipe.initialize_directions)) + results += "Doubled [pipe.name] located at [ANNOTATE_OBJECT(pipe)]" - //Pipes - for(var/obj/machinery/atmospherics/pipe/simple/pipe in SSair.atmos_machinery) - if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) + //HE pipes are tested separately + for(var/obj/machinery/atmospherics/pipe/heat_exchanging/pipe in SSair.atmos_air_machinery) + if(pipe.z && (!length(pipe.nodes) || (null in pipe.nodes)) && !critical_only) results += "Unconnected [pipe.name] located at [ANNOTATE_OBJECT(pipe)]" - for(var/obj/machinery/atmospherics/pipe/other_pipe in get_turf(pipe)) - if(other_pipe != pipe && other_pipe.piping_layer == pipe.piping_layer && other_pipe.dir == pipe.dir) + for(var/obj/machinery/atmospherics/pipe/heat_exchanging/other_pipe in get_turf(pipe)) + if(other_pipe != pipe && other_pipe.piping_layer == pipe.piping_layer && (other_pipe.initialize_directions & pipe.initialize_directions)) results += "Doubled [pipe.name] located at [ANNOTATE_OBJECT(pipe)]" return results @@ -71,15 +67,16 @@ var/list/results = list() for (var/datum/powernet/PN in GLOB.powernets) - if (!PN.nodes || !PN.nodes.len) - if(PN.cables && (PN.cables.len > 1)) - var/obj/structure/cable/C = PN.cables[1] - results += "Powernet with no nodes! (number [PN.number]) - example cable at [ANNOTATE_OBJECT(C)]" + if(!length(PN.cables)) + continue + + if (!length(PN.nodes)) + var/obj/structure/cable/C = PN.cables[1] + results += "Powernet with no nodes! (number [PN.number]) - example cable at [ANNOTATE_OBJECT(C)]" - if (!PN.cables || (PN.cables.len < 10)) - if(PN.cables && (PN.cables.len > 1)) - var/obj/structure/cable/C = PN.cables[1] - results += "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [ANNOTATE_OBJECT(C)]" + if (!length(PN.cables) < 10) + var/obj/structure/cable/C = PN.cables[1] + results += "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [ANNOTATE_OBJECT(C)]" var/checked_list = list() for(var/obj/structure/cable/specific_cable as anything in GLOB.cable_list) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 6b4ee958acf2..18a572c7477b 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -172,7 +172,7 @@ for(var/mob/living/mob in thunderdome) qdel(mob) //Clear mobs for(var/obj/obj in thunderdome) - if(!istype(obj, /obj/machinery/camera) && !istype(obj, /obj/effect/abstract/proximity_checker)) + if(!istype(obj, /obj/machinery/camera)) qdel(obj) //Clear objects var/area/template = GLOB.areas_by_type[/area/tdome/arena_source] diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index 73049adf562c..b4e374f41cb8 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -22,7 +22,6 @@ options += "--------" options += "Infinite Transit" options += "Delete Shuttle" - options += "Into The Sunset (delete & greentext 'escape')" var/selection = input(user, "Select where to fly [name]:", "Fly Shuttle") as null|anything in options if(!selection) @@ -38,15 +37,12 @@ if("Delete Shuttle") if(alert(user, "Really delete [name]?", "Delete Shuttle", "Cancel", "Really!") != "Really!") return - jumpToNullSpace() + if(QDELETED(current_ship)) + qdel(src) + else + qdel(current_ship) message_admins("\[SHUTTLE]: [key_name_admin(user)] has deleted [name].") - if("Into The Sunset (delete & greentext 'escape')") - if(alert(user, "Really delete [name] and greentext escape objectives?", "Delete Shuttle", "Cancel", "Really!") != "Really!") - return - intoTheSunset() - message_admins("\[SHUTTLE]: [key_name_admin(user)] has deleted [name], and granted the crew greentext.") - else if(options[selection]) initiate_docking(options[selection]) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 0e4cfef7cea8..69d3a5d1541b 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -1,18 +1,10 @@ #ifdef REFERENCE_TRACKING -/datum/verb/find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references(FALSE) - - /datum/proc/find_references(skip_alert) running_find_references = type if(usr?.client) if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") + log_reftracker("CANCELLED search for references to a [usr.client.running_find_references].") usr.client.running_find_references = null running_find_references = null //restart the garbage collector @@ -20,9 +12,11 @@ SSgarbage.next_fire = world.time + world.tick_lag return + #ifndef FIND_REF_NO_CHECK_TICK if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") running_find_references = null return + #endif //this keeps the garbage collector from failing to collect objects being searched for in here SSgarbage.can_fire = FALSE @@ -30,29 +24,40 @@ if(usr?.client) usr.client.running_find_references = type - testing("Beginning search for references to a [type].") - last_find_references = world.time + log_reftracker("Beginning search for references to a [type].") + + var/starting_time = world.time - DoSearchVar(GLOB, "(global) -> ") //globals - testing("Finished searching globals") + //Time to search the whole game for our ref + DoSearchVar(GLOB, "GLOB", search_time = starting_time) //globals + log_reftracker("Finished searching globals") - for(var/atom/atom_thing) //atoms - DoSearchVar(atom_thing, "World -> [atom_thing]") - testing("Finished searching atoms") + //Yes we do actually need to do this. The searcher refuses to read weird lists + //And global.vars is a really weird list + var/global_vars = list() + for(var/key in global.vars) + global_vars[key] = global.vars[key] - for (var/datum/datum_thing) //datums - DoSearchVar(datum_thing, "World -> [datum_thing]") - testing("Finished searching datums") + DoSearchVar(global_vars, "Native Global", search_time = starting_time) + log_reftracker("Finished searching native globals") -#ifndef FIND_REF_SKIP_CLIENTS - // DO NOT RUN THIS ON A LIVE SERVER - // IT WILL CRASH!!! - for (var/client/client_thing) //clients - DoSearchVar(client_thing, "World -> [client_thing]") - testing("Finished searching clients") + for(var/datum/thing in world) //atoms (don't beleive its lies) + DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching atoms") + + for(var/datum/thing) //datums + DoSearchVar(thing, "Datums -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching datums") + +#ifndef REFERENCE_DOING_IT_LIVE + //Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself + for(var/client/thing) //clients + DoSearchVar(thing, "Clients -> [thing.type]", search_time = starting_time) + log_reftracker("Finished searching clients") + + log_reftracker("Completed search for references to a [type].") #endif - testing("Completed search for references to a [type].") if(usr?.client) usr.client.running_find_references = null running_find_references = null @@ -61,79 +66,94 @@ SSgarbage.can_fire = TRUE SSgarbage.next_fire = world.time + world.tick_lag - -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //force a qdel - if(!running_find_references) - find_references(TRUE) - - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - - -/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 32) - #ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs && !found_refs) + found_refs = list() #endif + if(usr?.client && !usr.client.running_find_references) return if(!recursive_limit) + log_reftracker("Recursion limit reached. [container_name]") return + //Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + if(istype(potential_container, /datum)) var/datum/datum_container = potential_container - if(datum_container.last_find_references == last_find_references) + if(datum_container.last_find_references == search_time) return - datum_container.last_find_references = last_find_references + datum_container.last_find_references = search_time var/list/vars_list = datum_container.vars for(var/varname in vars_list) - if (varname == "vars") - continue #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif + if (varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references + continue var/variable = vars_list[varname] if(variable == src) - testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[varname] = TRUE + continue //End early, don't want these logging + #endif + log_reftracker("Found [type] \ref[src] in [datum_container.type]'s \ref[datum_container] [varname] var. [container_name]") + continue - else if(islist(variable)) - DoSearchVar(variable, "[container_name] -> [varname] (list)", recursive_limit-1) + if(islist(variable)) + DoSearchVar(variable, "[container_name] \ref[datum_container] -> [varname] (list)", recursive_limit - 1, search_time) else if(islist(potential_container)) var/normal = IS_NORMAL_LIST(potential_container) - for(var/element_in_list in potential_container) + var/list/potential_cache = potential_container + for(var/element_in_list in potential_cache) #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif + //Check normal entrys if(element_in_list == src) - testing("Found [type] \ref[src] in list [container_name].") - - else if(element_in_list && !isnum(element_in_list) && normal) - if(potential_container[element_in_list] == src) - testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") - else if(islist(potential_container[element_in_list])) - DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\]", recursive_limit-1) - - else if(islist(element_in_list)) - var/list/list_element = element_in_list - DoSearchVar(element_in_list, "[container_name]\[[list_element.Find(element_in_list)]] -> list", recursive_limit - 1) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[potential_cache] = TRUE + continue //End early, don't want these logging + #endif + log_reftracker("Found [type] \ref[src] in list [container_name].") + continue + var/assoc_val = null + if(!isnum(element_in_list) && normal) + assoc_val = potential_cache[element_in_list] + //Check assoc entrys + if(assoc_val == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + found_refs[potential_cache] = TRUE + continue //End early, don't want these logging + #endif + log_reftracker("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + continue + //We need to run both of these checks, since our object could be hiding in either of them + //Check normal sublists + if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time) + //Check assoc sublists + if(islist(assoc_val)) + DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time) /proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) - SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE - qdel(thing_to_del, force) + thing_to_del.qdel_and_find_ref_if_fail(force) + +/datum/proc/qdel_and_find_ref_if_fail(force = FALSE) + SSgarbage.reference_find_on_fail["\ref[src]"] = TRUE + qdel(src, force) #endif diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 30a13107595e..e7fee444f2d2 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -22,5 +22,5 @@ owner.vomit(20) var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") - Slime.Friends = list(owner) - Slime.Leader = owner + Slime.set_friends(list(owner)) + Slime.set_leader(owner) diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 7c21939f89a0..639017e100f3 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -62,7 +62,7 @@ else adjustFireLoss(5) -/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(istype(mover, /obj/structure/blob)) return TRUE @@ -117,9 +117,10 @@ var/is_zombie = FALSE /mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, obj/structure/blob/factory/linked_node) - if(istype(linked_node)) - factory = linked_node - factory.spores += src + if(!istype(linked_node)) + return INITIALIZE_HINT_QDEL + factory = linked_node + factory.spores += src . = ..() if(linked_node.overmind && istype(linked_node.overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons) && !istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak)) notify_ghosts("A controllable spore has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Spore Created") diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index cae4fb2aa983..29060afd8f6a 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -22,6 +22,10 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ stack_trace("blobstrain created without overmind") overmind = new_overmind +/datum/blobstrain/Destroy() + overmind = null + return ..() + /datum/blobstrain/proc/on_gain() overmind.color = complementary_color for(var/BL in GLOB.blobs) diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index dfd761ed0527..56a4aca744eb 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -22,7 +22,7 @@ B.take_damage(damage, BURN, "energy") /datum/reagent/blob/energized_jelly - name = "Energized Jelly" + name = "Blob Energized Jelly" taste_description = "gelatin" color = "#EFD65A" diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index a2b1022bb186..7fb5cc39016c 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -174,6 +174,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSticker.force_ending = 1 /mob/camera/blob/Destroy() + QDEL_NULL(blobstrain) for(var/BL in GLOB.blobs) var/obj/structure/blob/B = BL if(B && B.overmind == src) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 726c12fbd1bc..9fa04c7b6754 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -161,11 +161,11 @@ playsound(src.loc, 'sound/effects/splat.ogg', 50, TRUE) //Let's give some feedback that we DID try to spawn in space, since players are used to it ConsumeTile() //hit the tile we're in, making sure there are no border objects blocking us - if(!T.CanPass(src, T)) //is the target turf impassable + if(!T.CanPass(src, get_dir(T, src))) //is the target turf impassable make_blob = FALSE T.blob_act(src) //hit the turf if it is for(var/atom/A in T) - if(!A.CanPass(src, T)) //is anything in the turf impassable + if(!A.CanPass(src, get_dir(T, src))) //is anything in the turf impassable make_blob = FALSE A.blob_act(src) //also hit everything in the turf diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index ebebdc336676..6a1ccb1dd465 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -21,8 +21,9 @@ update_appearance() . = ..() -/obj/structure/blob/special/core/Destroy() +/obj/structure/blob/core/Destroy() GLOB.blob_cores -= src + GLOB.poi_list -= src if(overmind) overmind.blob_core = null overmind = null @@ -32,7 +33,7 @@ /obj/structure/blob/core/scannerreport() return "Directs the blob's expansion, gradually expands, and sustains nearby blob spores and blobbernauts." -/obj/structure/blob/special/core/update_overlays() +/obj/structure/blob/core/update_overlays() . = ..() var/mutable_appearance/blob_overlay = mutable_appearance('icons/mob/blob.dmi', "blob") if(overmind) @@ -40,9 +41,8 @@ . += blob_overlay . += mutable_appearance('icons/mob/blob.dmi', "blob_core_overlay") -/obj/structure/blob/special/core/update_appearance() +/obj/structure/blob/core/update_appearance() color = null - GLOB.poi_list -= src return ..() /obj/structure/blob/core/ex_act(severity, target) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 45fff96dc5d4..ea902bc032a3 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -356,9 +356,10 @@ var/datum/action/innate/cult/blood_spell/source /obj/item/melee/blood_magic/New(loc, spell) - source = spell - uses = source.charges - health_cost = source.health_cost + if(spell) + source = spell + uses = source.charges + health_cost = source.health_cost ..() /obj/item/melee/blood_magic/Destroy() @@ -373,7 +374,7 @@ source.desc = source.base_desc source.desc += "
Has [uses] use\s remaining." source.UpdateButtonIcon() - ..() + return ..() /obj/item/melee/blood_magic/attack_self(mob/living/user) afterattack(user, user, TRUE) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 7eb00197b742..7323160deceb 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -135,6 +135,11 @@ /obj/item/cult_bastard/proc/nemesis_effects(mob/living/user, mob/living/target) return +/obj/item/cult_bastard/Destroy() + QDEL_NULL(jaunt) + QDEL_NULL(linked_action) + return ..() + /obj/item/cult_bastard/examine(mob/user) . = ..() . += "This weapon will absorb the souls of unconscious human foes." @@ -216,7 +221,7 @@ phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out /datum/action/innate/dash/cult/IsAvailable() - if(current_charges) + if(iscultist(owner) && current_charges) return TRUE else return FALSE @@ -625,7 +630,7 @@ /obj/item/cult_spear/Destroy() if(spear_act) qdel(spear_act) - ..() + return ..() /obj/item/cult_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/turf/T = get_turf(hit_atom) diff --git a/code/modules/antagonists/disease/disease_disease.dm b/code/modules/antagonists/disease/disease_disease.dm index 482beaba6be6..479e8345b533 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -12,6 +12,7 @@ /datum/disease/advance/sentient_disease/Destroy() . = ..() + overmind = null GLOB.sentient_disease_instances -= src /datum/disease/advance/sentient_disease/remove_disease() diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index 8f1ea1c2b04e..55f869b3a71a 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -72,10 +72,12 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/Destroy() . = ..() QDEL_NULL(adaptation_menu_action) + disease_template = null for(var/V in GLOB.sentient_disease_instances) var/datum/disease/advance/sentient_disease/S = V if(S.overmind == src) S.overmind = null + browser = null /mob/camera/disease/Login() . = ..() diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index f19a45d6e8ed..2487260dd5c1 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -297,8 +297,8 @@ to_chat(src, "You cannot use abilities from inside of a wall.") return FALSE for(var/obj/O in T) - if(O.density && !O.CanPass(src, T)) - to_chat(src, "You cannot use abilities inside of a dense object.") + if(O.density && !O.CanPass(src, get_dir(T, src))) + to_chat(src, span_revenwarning("You cannot use abilities inside of a dense object.")) return FALSE if(inhibited) to_chat(src, "Your powers have been suppressed by nulling energy!") @@ -442,7 +442,7 @@ /obj/item/ectoplasm/revenant/Destroy() if(!QDELETED(revenant)) qdel(revenant) - ..() + return ..() //objectives /datum/objective/revenant diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 3751279f095e..b12050c263b7 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -49,7 +49,7 @@ del_on_death = 1 deathmessage = "screams in anger as it collapses into a puddle of viscera!" -/mob/living/simple_animal/slaughter/Initialize() +/mob/living/simple_animal/slaughter/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "innate") var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 0a2d4268ba9f..0add31c60b74 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -245,6 +245,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module)) owner_AI.doomsday_device.start() for(var/obj/item/pinpointer/nuke/P in GLOB.pinpointer_list) P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes + P.alert = TRUE //WEEWOO qdel(src) /obj/machinery/doomsday_device @@ -256,21 +257,31 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module)) verb_exclaim = "blares" var/timing = FALSE var/obj/effect/countdown/doomsday/countdown + var/mob/living/silicon/ai/owner var/detonation_timer var/next_announce /obj/machinery/doomsday_device/Initialize() . = ..() + if(!isAI(loc)) + stack_trace("Doomsday created outside an AI somehow, shit's fucking broke. Anyway, we're just gonna qdel now. Go make a github issue report.") + return INITIALIZE_HINT_QDEL + owner = loc countdown = new(src) /obj/machinery/doomsday_device/Destroy() QDEL_NULL(countdown) STOP_PROCESSING(SSfastprocess, src) SSmapping.remove_nuke_threat(src) - for(var/A in GLOB.ai_list) - var/mob/living/silicon/ai/AI = A - if(AI.doomsday_device == src) - AI.doomsday_device = null + set_security_level("red") + for(var/mob/living/silicon/robot/borg in owner?.connected_robots) + borg.toggle_headlamp(FALSE, TRUE) //forces borg lamp to update + owner?.doomsday_device = null + owner?.nuking = null + owner = null + for(var/obj/item/pinpointer/nuke/P in GLOB.pinpointer_list) + P.switch_mode_to(TRACK_NUKE_DISK) //Party's over, back to work, everyone + P.alert = FALSE return ..() /obj/machinery/doomsday_device/proc/start() diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 4917e1587fcc..5c1324bdcfe9 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -42,6 +42,10 @@ /obj/item/assembly/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER +/obj/item/assembly/Destroy() + holder = null + return ..() + /obj/item/assembly/get_part_rating() return 1 diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index dd7936968ae2..637157682a15 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -210,19 +210,22 @@ desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out." var/flashcd = 20 var/overheat = 0 - var/obj/item/organ/cyberimp/arm/flash/I = null + //Wearef to our arm + var/datum/weakref/arm /obj/item/assembly/flash/armimplant/burn_out() - if(I && I.owner) - to_chat(I.owner, "Your photon projector implant overheats and deactivates!") - I.Retract() + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + if(real_arm?.owner) + to_chat(real_arm.owner, "Your photon projector implant overheats and deactivates!") + real_arm.Retract() overheat = TRUE addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2) /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) if(overheat) - if(I && I.owner) - to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + var/obj/item/organ/cyberimp/arm/flash/real_arm = arm.resolve() + if(real_arm?.owner) + to_chat(real_arm.owner, "Your photon projector is running too hot to be used again so quickly!") return FALSE overheat = TRUE addtimer(CALLBACK(src, .proc/cooldown), flashcd) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index c68ee14dd867..08b603058563 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -11,6 +11,8 @@ var/time = 10 var/sensitivity = 1 var/hearing_range = 3 + ///Proximity monitor associated with this atom, needed for it to work. + var/datum/proximity_monitor/proximity_monitor /obj/item/assembly/prox_sensor/Initialize() . = ..() @@ -40,19 +42,19 @@ if(!.) return else - proximity_monitor.SetHost(src,src) + proximity_monitor.set_host(src, src) /obj/item/assembly/prox_sensor/toggle_secure() secured = !secured if(!secured) if(scanning) toggle_scan() - proximity_monitor.SetHost(src,src) + proximity_monitor.set_host(src, src) timing = FALSE STOP_PROCESSING(SSobj, src) else START_PROCESSING(SSobj, src) - proximity_monitor.SetHost(loc,src) + proximity_monitor.set_host(loc,src) update_appearance() return secured @@ -84,13 +86,13 @@ if(!secured) return FALSE scanning = scan - proximity_monitor.SetRange(scanning ? sensitivity : 0) + proximity_monitor.set_range(scanning ? sensitivity : 0) update_appearance() /obj/item/assembly/prox_sensor/proc/sensitivity_change(value) var/sense = min(max(sensitivity + value, 0), 5) sensitivity = sense - if(scanning && proximity_monitor.SetRange(sense)) + if(scanning && proximity_monitor.set_range(sense)) sense() /obj/item/assembly/prox_sensor/update_appearance() diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 3d1e1e46602f..f28a9a898588 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -184,7 +184,9 @@ /turf/proc/process_cell(fire_count) /turf/open/proc/equalize_pressure_in_zone(cyclenum) -/turf/open/proc/consider_firelocks(turf/T2) + +/turf/proc/consider_firelocks(turf/T2) //TODO: Find out why this sometimes gets called. Possibly to do with atmos adjacency not being updated in auxmos? +/turf/open/consider_firelocks(turf/T2) if(blocks_air) return for(var/obj/machinery/airalarm/alarm in src) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index a7924f4c0c3c..e5a2490b609d 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -44,6 +44,9 @@ ///Is the thing being rebuilt by SSair or not. Prevents list blaot var/rebuilding = FALSE + ///If we should init and immediately start processing + var/init_processing = FALSE + /obj/machinery/atmospherics/examine(mob/user) . = ..() if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user)) @@ -59,11 +62,15 @@ nodes = new(device_type) if (!armor) armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + init_processing = process ..() - if(process) - SSair.start_processing_machine(src) SetInitDirections() +/obj/machinery/atmospherics/Initialize(mapload) + if(init_processing) + SSair.start_processing_machine(src, mapload) + return ..() + /obj/machinery/atmospherics/Destroy() for(var/i in 1 to device_type) nullifyNode(i) @@ -158,7 +165,7 @@ return TRUE return FALSE -/obj/machinery/atmospherics/proc/pipeline_expansion() +/obj/machinery/atmospherics/proc/pipeline_expansion(datum/pipeline/reference) return nodes /obj/machinery/atmospherics/proc/SetInitDirections() @@ -170,13 +177,13 @@ /obj/machinery/atmospherics/proc/returnPipenet() return -/obj/machinery/atmospherics/proc/returnPipenetAirs() +/obj/machinery/atmospherics/proc/returnPipenetAirs(datum/pipeline/reference) return -/obj/machinery/atmospherics/proc/setPipenet() +/obj/machinery/atmospherics/proc/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/connection) return -/obj/machinery/atmospherics/proc/replacePipenet() +/obj/machinery/atmospherics/proc/replacePipenet(datum/pipeline/old_pipeline, datum/pipeline/new_pipeline) return /obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index b4a02de7d108..1fdc91effb44 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -77,6 +77,8 @@ if(parents[i]) nullifyPipenet(parents[i]) airs[i] = null + if(!QDELETED(src)) + airs[i] = new /datum/gas_mixture(200) return ..() /obj/machinery/atmospherics/components/on_construction() @@ -100,9 +102,14 @@ /obj/machinery/atmospherics/components/proc/nullifyPipenet(datum/pipeline/reference) if(!reference) CRASH("nullifyPipenet(null) called by [type] on [COORD(src)]") - var/i = parents.Find(reference) - reference.other_airs -= airs[i] + + for (var/i in 1 to length(parents)) + if (parents[i] == reference) + reference.other_airs -= airs[i] // Disconnects from the pipeline side + parents[i] = null // Disconnects from the machinery side. + reference.other_atmosmch -= src + /* We explicitly qdel pipeline when this particular pipeline is projected to have no member and cause GC problems. @@ -110,12 +117,10 @@ while pipes must and will happily wreck and rebuild everything again every time they are qdeleted. */ - if(!length(reference.other_atmosmch) && !length(reference.members)) - if(QDESTROYING(reference)) - parents[i] = null - CRASH("nullifyPipenet() called on qdeleting [reference] indexed on parents\[[i]\]") - qdel(reference) - parents[i] = null + if(length(reference.other_atmosmch) || length(reference.members) || QDESTROYING(reference)) + return + + qdel(reference) /obj/machinery/atmospherics/components/returnPipenetAirs(datum/pipeline/reference) var/list/returned_air = list() @@ -130,14 +135,22 @@ return list(nodes[parents.Find(reference)]) return ..() -/obj/machinery/atmospherics/components/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/A) - parents[nodes.Find(A)] = reference +/obj/machinery/atmospherics/components/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/connection) + var/connection_index = nodes.Find(connection) + if(!connection_index) + message_admins("Doubled pipe found at [ADMIN_VERBOSEJMP(connection)]! Please report to mappers.") //This will cascade into even more errors. Sorry! + CRASH("Doubled pipe found, causing an error in setPipenet") + var/list/datum/pipeline/to_replace = parents[connection_index] + //Some references to clean up if it isn't empty + if(to_replace) + nullifyPipenet(to_replace) + parents[connection_index] = reference /obj/machinery/atmospherics/components/returnPipenet(obj/machinery/atmospherics/A = nodes[1]) //returns parents[1] if called without argument return parents[nodes.Find(A)] -/obj/machinery/atmospherics/components/replacePipenet(datum/pipeline/Old, datum/pipeline/New) - parents[parents.Find(Old)] = New +/obj/machinery/atmospherics/components/replacePipenet(datum/pipeline/old_pipeline, datum/pipeline/new_pipeline) + parents[parents.Find(old_pipeline)] = new_pipeline /obj/machinery/atmospherics/components/unsafe_pressure_release(mob/user, pressures) ..() @@ -183,8 +196,8 @@ if(!parent) //WARNING("Component is missing a pipenet! Rebuilding...") SSair.add_to_rebuild_queue(src) - else - parent.update = TRUE + return + parent.update = TRUE /obj/machinery/atmospherics/components/returnPipenets() . = list() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index a051df7de2c9..d70e91b29de7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -57,19 +57,20 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/process_atmos() ..() - injecting = 0 + injecting = TRUE - if(!on || !is_operational) + if(!on || !is_operational || !isopenturf(loc)) return var/datum/gas_mixture/air_contents = airs[1] - if(air_contents != null) - if(air_contents.return_temperature() > 0) - loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) - air_update_turf() + if(!air_contents || air_contents.return_temperature() <= 0) + return - update_parents() + loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) + air_update_turf() + + update_parents() /obj/machinery/atmospherics/components/unary/outlet_injector/proc/inject() @@ -78,7 +79,7 @@ var/datum/gas_mixture/air_contents = airs[1] - injecting = 1 + injecting = TRUE if(air_contents.return_temperature() > 0) loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm index d5f51757685d..7c890dfb8425 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -48,9 +48,7 @@ var/pressure_delta = our_pressure - environment.return_pressure() var/transfer_moles = pressure_delta*200/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) if(transfer_moles > 0) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) + loc.transfer_air(air_contents, transfer_moles) air_update_turf() update_parents() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 3b570f209c8b..1b6df20c721e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -23,10 +23,9 @@ var/heat_capacity = 0 var/interactive = TRUE // So mapmakers can disable interaction. -/obj/machinery/atmospherics/components/unary/thermomachine/Initialize() +/obj/machinery/atmospherics/components/unary/thermomachine/Initialize(mapload) . = ..() initialize_directions = dir - SSair.start_processing_machine(src) //WS edit, initialize thermomachines to SSairs list of tickable machines /obj/machinery/atmospherics/components/unary/thermomachine/on_construction(obj_color, set_layer) var/obj/item/circuitboard/machine/thermomachine/board = circuit diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 29c0ff985c9c..2ede3d7317b0 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -27,8 +27,10 @@ if(QDELETED(P)) continue SSair.add_to_rebuild_queue(P) + members.Cut() for(var/obj/machinery/atmospherics/components/C in other_atmosmch) C.nullifyPipenet(src) + other_atmosmch.Cut() return ..() /datum/pipeline/process() @@ -38,22 +40,23 @@ update = air.react(src) /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/base) - if(!QDELETED(base)) - building = TRUE - var/volume = 0 - if(istype(base, /obj/machinery/atmospherics/pipe)) - var/obj/machinery/atmospherics/pipe/considered_pipe = base - volume = considered_pipe.volume - members += considered_pipe - if(considered_pipe.air_temporary) - air = considered_pipe.air_temporary - considered_pipe.air_temporary = null - else - addMachineryMember(base) - if(!air) - air = new - air.set_volume(volume) - SSair.add_to_expansion(src, base) + if(QDELETED(base)) + return + building = TRUE + var/volume = 0 + if(istype(base, /obj/machinery/atmospherics/pipe)) + var/obj/machinery/atmospherics/pipe/considered_pipe = base + volume = considered_pipe.volume + members += considered_pipe + if(considered_pipe.air_temporary) + air = considered_pipe.air_temporary + considered_pipe.air_temporary = null + else + addMachineryMember(base) + if(!air) + air = new + air.set_volume(volume) + SSair.add_to_expansion(src, base) ///Has the same effect as build_pipeline(), but this doesn't queue its work, so overrun abounds. It's useful for the pregame /datum/pipeline/proc/build_pipeline_blocking(obj/machinery/atmospherics/base) @@ -70,34 +73,35 @@ if(!air) air = new var/list/possible_expansions = list(base) - while(possible_expansions.len>0) + while(length(possible_expansions)) for(var/obj/machinery/atmospherics/borderline in possible_expansions) var/list/result = borderline.pipeline_expansion(src) - if(result?.len > 0) - for(var/obj/machinery/atmospherics/P in result) - if(istype(P, /obj/machinery/atmospherics/pipe)) - var/obj/machinery/atmospherics/pipe/item = P - if(!members.Find(item)) - - if(item.parent) - var/static/pipenetwarnings = 10 - if(pipenetwarnings > 0) - log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) around [AREACOORD(item)].") - pipenetwarnings-- - if(pipenetwarnings == 0) - log_mapping("build_pipeline(): further messages about pipenets will be suppressed") - members += item - possible_expansions += item - - volume += item.volume - item.parent = src - - if(item.air_temporary) - air.merge(item.air_temporary) - item.air_temporary = null - else - P.setPipenet(src, borderline) - addMachineryMember(P) + if(!length(result)) + continue + for(var/obj/machinery/atmospherics/considered_device in result) + if(!istype(considered_device, /obj/machinery/atmospherics/pipe)) + considered_device.setPipenet(src, borderline) + addMachineryMember(considered_device) + continue + + var/obj/machinery/atmospherics/pipe/item = considered_device + if(item in members) + continue + + if(item.parent) + log_mapping("Possible doubled atmosmachine found at [AREACOORD(item)] with other contents: [json_encode(item.loc.contents)]") + item.stack_trace("Possible doubled atmosmachine found") + continue + + members += item + possible_expansions += item + + volume += item.volume + item.parent = src + + if(item.air_temporary) + air.merge(item.air_temporary) + item.air_temporary = null possible_expansions -= borderline @@ -108,7 +112,7 @@ var/list/returned_airs = C.returnPipenetAirs(src) if (!length(returned_airs) || (null in returned_airs)) stack_trace("addMachineryMember: Nonexistent (empty list) or null machinery gasmix added to pipeline datum from [C] \ - which is of type [C.type]. Nearby: ([C.x], [C.y], [C.z])") + which is of type [C.type]. QDELETED: [QDELETED(C) ? "true" : "false"].") other_airs |= returned_airs /datum/pipeline/proc/addMember(obj/machinery/atmospherics/A, obj/machinery/atmospherics/N) @@ -254,13 +258,11 @@ if(V.on) PL |= V.parents[1] PL |= V.parents[2] -//BeginWS Edit - Porting Relief Valves else if (istype(atmosmch,/obj/machinery/atmospherics/components/binary/relief_valve)) var/obj/machinery/atmospherics/components/binary/relief_valve/V = atmosmch if(V.opened) PL |= V.parents[1] PL |= V.parents[2] -//EndWS Edit - Porting Relief Valves else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch if(C.connected_device) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index d48e202adfc6..811979dd4c39 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -40,7 +40,7 @@ /obj/machinery/meter/Initialize(mapload, new_piping_layer) if(!isnull(new_piping_layer)) target_layer = new_piping_layer - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) if(!target) reattach_to_layer() return ..() diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index f2c03c69139e..1f6e9cab5383 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -106,7 +106,7 @@ /obj/machinery/atmospherics/pipe/layer_manifold/setPipingLayer() piping_layer = PIPING_LAYER_DEFAULT -/obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion() +/obj/machinery/atmospherics/pipe/layer_manifold/pipeline_expansion(datum/pipeline/reference) return get_all_connected_nodes() /obj/machinery/atmospherics/pipe/layer_manifold/disconnect(obj/machinery/atmospherics/reference) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index fcadc8cd4ff6..7daaf9273558 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -79,8 +79,10 @@ /obj/machinery/atmospherics/pipe/returnPipenet() return parent -/obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/P) - parent = P +/obj/machinery/atmospherics/pipe/setPipenet(datum/pipeline/reference, obj/machinery/atmospherics/connection) + if(!QDELETED(parent)) + qdel(parent) + parent = reference /obj/machinery/atmospherics/pipe/Destroy() QDEL_NULL(parent) diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index ad5f95cf349d..db17acc4fa6c 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -15,16 +15,16 @@ var/maximum_pressure = 90 * ONE_ATMOSPHERE -/obj/machinery/portable_atmospherics/Initialize() +/obj/machinery/portable_atmospherics/Initialize(mapload) . = ..() air_contents = new(volume) air_contents.set_temperature(T20C) - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) /obj/machinery/portable_atmospherics/Destroy() - SSair.stop_processing_machine(src) disconnect() - air_contents = null + QDEL_NULL(air_contents) + SSair.stop_processing_machine(src) return ..() diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm index f4363ee88286..e0daf4c61654 100644 --- a/code/modules/atmospherics/multiz.dm +++ b/code/modules/atmospherics/multiz.dm @@ -16,7 +16,7 @@ . += multiz_overlay_node ///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet -/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() +/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion(datum/pipeline/reference) icon = 'icons/obj/atmos.dmi' //Just to refresh. var/turf/T = get_turf(src) var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(T.above()) diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 3a53bfac4735..f7eeeb9f7f96 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -6,11 +6,9 @@ invisibility = INVISIBILITY_MAXIMUM anchored = TRUE -/obj/effect/oneway/CanAllowThrough(atom/movable/mover, turf/target) +/obj/effect/oneway/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - var/turf/T = get_turf(src) - var/turf/MT = get_turf(mover) - return . && (T == MT || get_dir(MT,T) == dir) + return . && border_dir == dir /obj/effect/wind @@ -45,7 +43,7 @@ if(blocked_types.len) blocked_types = typecacheof(blocked_types) -/obj/effect/path_blocker/CanAllowThrough(atom/movable/mover, turf/target) +/obj/effect/path_blocker/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(blocked_types.len) var/list/mover_contents = mover.GetAllContents() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 90502110c9c6..abf9ba4f5e16 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -39,6 +39,8 @@ . = ..() if(!reset) reset = new reset_path(get_turf(src)) + reset.flag = src + RegisterSignal(src, COMSIG_PARENT_PREQDELETED, .proc/reset_flag) //just in case CTF has some map hazards (read: chasms). /obj/item/ctf/ComponentInitialize() . = ..() @@ -55,8 +57,24 @@ to_chat(M, "\The [src] has been returned to base!") STOP_PROCESSING(SSobj, src) -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/ctf/attack_hand(mob/living/user) +/obj/item/ctf/proc/reset_flag(capture = FALSE) + SIGNAL_HANDLER + + var/turf/our_turf = get_turf(src.reset) + if(!our_turf) + return TRUE + forceMove(our_turf) + for(var/mob/M in GLOB.player_list) + var/area/mob_area = get_area(M) + if(istype(mob_area, /area/ctf)) + if(!capture) + to_chat(M, "[src] has been returned to the base!") + STOP_PROCESSING(SSobj, src) + return TRUE //so if called by a signal, it doesn't delete + +//working with attack hand feels like taking my brain and putting it through an industrial pill press so i'm gonna be a bit liberal with the comments +/obj/item/ctf/attack_hand(mob/living/user, list/modifiers) + //pre normal check item stuff, this is for our special flag checks if(!is_ctf_target(user) && !anyonecanpickup) to_chat(user, "Non-players shouldn't be moving the flag!") return @@ -116,6 +134,13 @@ icon_state = "banner" desc = "This is where a banner with Nanotrasen's logo on it would go." layer = LOW_ITEM_LAYER + var/obj/item/ctf/flag + +/obj/effect/ctf/flag_reset/Destroy() + if(flag) + flag.reset = null + flag = null + return ..() /obj/effect/ctf/flag_reset/red name = "red flag landmark" @@ -173,7 +198,7 @@ /obj/machinery/capture_the_flag/Destroy() GLOB.poi_list.Remove(src) - ..() + return ..() /obj/machinery/capture_the_flag/process() for(var/i in spawned_mobs) @@ -653,6 +678,11 @@ for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) CTF.dead_barricades += src +/obj/effect/ctf/dead_barricade/Destroy() + for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + CTF.dead_barricades -= src + return ..() + /obj/effect/ctf/dead_barricade/proc/respawn() if(!QDELETED(src)) new /obj/structure/barricade/security/ctf(get_turf(src)) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index d41b68de24a2..189fe1ebfd11 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -181,6 +181,12 @@ GLOBAL_LIST_EMPTY(gateway_destinations) vis_contents += portal_visuals return ..() +/obj/machinery/gateway/Destroy() + destination.target_gateway = null + GLOB.gateway_destinations -= destination + destination = null + return ..() + /obj/machinery/gateway/proc/generate_destination() destination = new destination_type destination.name = destination_name diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index a1ec18d25653..fcefdef265fe 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -12,7 +12,7 @@ /obj/structure/speaking_tile/Initialize() . = ..() - var/json_file = file("data/npc_saves/Poly.json") + var/json_file = file("data/npc_saves/Polly.json") if(!fexists(json_file)) return var/list/json = json_decode(file2text(json_file)) @@ -45,7 +45,7 @@ if(9) SpeakPeace(list("Alright maybe that's too boring.", "I can't keep manually typing these lines out though.", "It's hard to explain but the code structure I'm using is kind of terrible.")) if(10) - SpeakPeace(list("Oh I have an idea!", "Lets outsource this endless banter to Poly!", "Then you'll be able to keep listening to this without getting bored!")) + SpeakPeace(list("Oh I have an idea!", "Lets outsource this endless banter to Polly!", "Then you'll be able to keep listening to this without getting bored!")) if(isnull(shenanigans) || !shenanigans.len) shenanigans = list("Except the poly file is missing...") if(11 to 14, 16 to 50, 52 to 99, 103 to 107, 109 to 203, 205 to 249, 252 to 665, 667 to 999, 1001 to 5642) @@ -55,7 +55,7 @@ if(15) SpeakPeace(list("See? Isn't this fun?","Now you can mash this for hours without getting bored.","Anyway I'll leave you it.")) if(51) - SpeakPeace(list("The fun never ends around here.", "The Poly text files stores up to 500 statements.", "But you've probably heard a few repeats by now.")) + SpeakPeace(list("The fun never ends around here.", "The Polly text files stores up to 500 statements.", "But you've probably heard a few repeats by now.")) if(100) SpeakPeace(list("And that's a solid hundred.", "Good hustle I guess.", "You've probably heard a lot of repeats by now.")) if(101) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 19bb6631c708..74ac431c5fe9 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -48,9 +48,13 @@ close_switchstates() close_preview() holder.player_details.post_login_callbacks -= li_cb + QDEL_NULL(li_cb) holder = null + buttons.Cut() QDEL_NULL(mode) + QDEL_NULL(modebutton) QDEL_LIST(modeswitch_buttons) + QDEL_NULL(dirbutton) QDEL_LIST(dirswitch_buttons) return ..() diff --git a/code/modules/buildmode/effects/line.dm b/code/modules/buildmode/effects/line.dm index f38e0c53871b..394c0d205a51 100644 --- a/code/modules/buildmode/effects/line.dm +++ b/code/modules/buildmode/effects/line.dm @@ -3,6 +3,9 @@ var/client/cl /obj/effect/buildmode_line/New(client/C, atom/atom_a, atom/atom_b, linename) + if(!C || !atom_a || !atom_b) + stack_trace("Buildmode effect created with odd inputs") + return name = linename abstract_move(get_turf(atom_a)) I = image('icons/misc/mark.dmi', src, "line", 19.0) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm index 69ce2b4a4075..a3ece1cce8c6 100644 --- a/code/modules/cargo/bounties/reagent.dm +++ b/code/modules/cargo/bounties/reagent.dm @@ -238,10 +238,6 @@ /datum/reagent/medicine/atropine,\ /datum/reagent/medicine/cryoxadone,\ /datum/reagent/medicine/salbutamol,\ - /*WS Begin - No Cobby - /datum/reagent/medicine/C2/hercuri,\ - /datum/reagent/medicine/C2/probital,\ - WS End */ /datum/reagent/drug/methamphetamine,\ /datum/reagent/drug/crank,\ /datum/reagent/nitrous_oxide,\ diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 69a9c7d286b4..42aea5437c4b 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -30,6 +30,9 @@ var/obj/structure/closet/supplypod/centcompod/linked_pod /mob/living/simple_animal/pet/gondola/gondolapod/Initialize(mapload, pod) + if(!pod) + stack_trace("Gondola pod created with no pod") + return INITIALIZE_HINT_QDEL linked_pod = pod name = linked_pod.name . = ..() @@ -73,6 +76,6 @@ update_appearance() /mob/living/simple_animal/pet/gondola/gondolapod/death() - qdel(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death + QDEL_NULL(linked_pod) //Will cause the open() proc for the linked supplypod to be called with the "broken" parameter set to true, meaning that it will dump its contents on death qdel(src) ..() diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 314484a5a668..e1568ae1adee 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -43,7 +43,7 @@ var/openingSound //Admin sound to play when the pod opens var/leavingSound //Admin sound to play when the pod leaves var/soundVolume = 80 //Volume to play sounds at. Ignores the cap - var/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. + var/area/bay //Used specifically for the centcom_podlauncher datum. Holds the current bay the user is launching objects from. Bays are specific rooms on the centcom map. var/list/explosionSize = list(0,0,2,3) var/stay_after_drop = FALSE var/specialised = FALSE // It's not a general use pod for cargo/admin use @@ -549,6 +549,9 @@ /obj/effect/pod_landingzone/Initialize(mapload, podParam, single_order = null, clientman) . = ..() + if(!podParam) + stack_trace("Pod landingzone created with no pod") + return INITIALIZE_HINT_QDEL if (ispath(podParam)) //We can pass either a path for a pod (as expressconsoles do), or a reference to an instantiated pod (as the centcom_podlauncher does) podParam = new podParam() //If its just a path, instantiate it pod = podParam diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 991a10b58331..f1fe218b175b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1342,24 +1342,22 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/check_quirk_compatibility(mob/user) var/list/quirk_conflicts = list() var/list/handled_conflicts = list() - for(var/quirk_index in SSquirks.quirk_instances) - var/datum/quirk/quirk_instance = SSquirks.quirk_instances[quirk_index] - if(!quirk_instance) - continue - if(quirk_instance.mood_quirk && CONFIG_GET(flag/disable_human_mood)) - quirk_conflicts[quirk_instance.name] = "Mood and mood quirks are disabled." + for(var/quirk_name in SSquirks.quirks) + var/datum/quirk/quirk_type = SSquirks.quirks[quirk_name] + if(initial(quirk_type.mood_quirk) && CONFIG_GET(flag/disable_human_mood)) + quirk_conflicts[quirk_name] = "Mood and mood quirks are disabled." if(!handled_conflicts["mood"]) handle_quirk_conflict("mood", null, user) handled_conflicts["mood"] = TRUE - if(((quirk_instance.species_lock["type"] == "allowed") && !(pref_species.id in quirk_instance.species_lock)) || (quirk_instance.species_lock["type"] == "blocked" && (pref_species.id in quirk_instance.species_lock))) - quirk_conflicts[quirk_instance.name] = "Quirk unavailable to species." + if((quirk_name in SSquirks.species_blacklist) && (pref_species.id in SSquirks.species_blacklist[quirk_name])) + quirk_conflicts[quirk_name] = "Quirk unavailable to species." if(!handled_conflicts["species"]) handle_quirk_conflict("species", pref_species, user) handled_conflicts["species"] = TRUE for(var/blacklist in SSquirks.quirk_blacklist) for(var/quirk_blacklisted in all_quirks) - if((quirk_blacklisted in blacklist) && !quirk_conflicts[quirk_instance.name] && (quirk_instance.name in blacklist) && !(quirk_instance.name == quirk_blacklisted)) - quirk_conflicts[quirk_instance.name] = "Quirk is mutually exclusive with [quirk_blacklisted]." + if((quirk_blacklisted in blacklist) && !quirk_conflicts[quirk_name] && (quirk_name in blacklist) && !(quirk_name == quirk_blacklisted)) + quirk_conflicts[quirk_name] = "Quirk is mutually exclusive with [quirk_blacklisted]." if(!handled_conflicts["blacklist"]) handle_quirk_conflict("blacklist", null, user) handled_conflicts["blacklist"] = TRUE @@ -1382,24 +1380,24 @@ GLOBAL_LIST_EMPTY(preferences_datums) target_species = additional_argument else return - for(var/quirk_owned in all_quirks) - var/datum/quirk/quirk_owned_instance = SSquirks.quirk_instances[quirk_owned] - balance -= quirk_owned_instance.value + for(var/quirk_name in all_quirks) + var/datum/quirk/quirk_type = SSquirks.quirks[quirk_name] + balance -= initial(quirk_type.value) switch(change_type) if("species") - if(((quirk_owned_instance.species_lock["type"] == "allowed") && !(target_species.id in quirk_owned_instance.species_lock)) || ((quirk_owned_instance.species_lock["type"] == "blocked") && (target_species.id in quirk_owned_instance.species_lock))) - all_quirks_new -= quirk_owned_instance.name - balance += quirk_owned_instance.value + if((quirk_name in SSquirks.species_blacklist) && (pref_species.id in SSquirks.species_blacklist[quirk_name])) + all_quirks_new -= quirk_name + balance += initial(quirk_type.value) if("mood") - if(quirk_owned_instance.mood_quirk) - all_quirks_new -= quirk_owned_instance.name - balance += quirk_owned_instance.value + if(initial(quirk_type.mood_quirk)) + all_quirks_new -= quirk_name + balance += initial(quirk_type.value) if("blacklist") for(var/blacklist in SSquirks.quirk_blacklist) for(var/quirk_blacklisted in all_quirks_new) - if((quirk_blacklisted in blacklist) && (quirk_owned_instance.name in blacklist) && !(quirk_owned_instance.name == quirk_blacklisted)) - all_quirks_new -= quirk_owned_instance.name - balance += quirk_owned_instance.value + if((quirk_blacklisted in blacklist) && (quirk_name in blacklist) && !(quirk_name == quirk_blacklisted)) + all_quirks_new -= quirk_name + balance += initial(quirk_type.value) if(balance < 0) var/list/positive_quirks = list() for(var/quirk_owned in all_quirks_new) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 9f0a56d1d476..b35942dbc138 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -151,7 +151,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(ITEM_SLOT_HEAD) == src) + if(H.get_item_by_slot(ITEM_SLOT_HEAD) == src && !QDELETED(src)) //This can be called as a part of destroy user.remove_language(/datum/language/piratespeak/, TRUE, TRUE, LANGUAGE_HAT) to_chat(user, "You can no longer speak like a pirate.") diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index c59f5b3aeeed..9c1bf3acdc0c 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -65,6 +65,7 @@ /obj/item/clothing/suit/space/chronos/Destroy() dropped() + QDEL_NULL(teleport_now) return ..() /obj/item/clothing/suit/space/chronos/emp_act(severity) @@ -332,6 +333,10 @@ check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE var/obj/item/clothing/suit/space/chronos/chronosuit = null +/datum/action/innate/chrono_teleport/Destroy() + chronosuit = null + return ..() + /datum/action/innate/chrono_teleport/IsAvailable() return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 9b044b8cf0b9..1cdcec95d05f 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -31,6 +31,10 @@ /obj/item/clothing/head/helmet/space/hardsuit/Destroy() . = ..() + if(!QDELETED(suit)) + qdel(suit) + suit = null + QDEL_NULL(soundloop) STOP_PROCESSING(SSobj, src) /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) @@ -111,7 +115,6 @@ greyscale_colors = list(list(11, 19), list(22, 12), list(16, 9)) greyscale_icon_state = "hardsuit" - /obj/item/clothing/suit/space/hardsuit/Initialize() if(jetpack && ispath(jetpack)) jetpack = new jetpack(src) @@ -907,6 +910,7 @@ slowdown = 0 shield_state = "shield-red" shield_on = "shield-red" + jetpack = /obj/item/tank/jetpack/suit /obj/item/clothing/suit/space/hardsuit/shielded/syndi/multitool_act(mob/living/user, obj/item/I) . = ..() @@ -925,10 +929,6 @@ to_chat(user, "You update the hardsuit's hardware, changing back the shield's color to red.") user.update_inv_wear_suit() -/obj/item/clothing/suit/space/hardsuit/shielded/syndi/Initialize() - jetpack = new /obj/item/tank/jetpack/suit(src) - . = ..() - /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi name = "blood-red hardsuit helmet" desc = "An advanced hardsuit helmet with built in energy shielding." @@ -1244,6 +1244,10 @@ . = ..() jump = new(src) +/obj/item/clothing/suit/space/hardsuit/quixote/Destroy() + QDEL_NULL(jump) + return ..() + /obj/item/clothing/suit/space/hardsuit/quixote/equipped(mob/user, slot) . = ..() if(slot == ITEM_SLOT_OCLOTHING) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 9379f52314df..4255335cda74 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -137,10 +137,11 @@ . = ..() /obj/item/clothing/suit/space/hardsuit/Destroy() - if(helmet) + if(!QDELETED(helmet)) helmet.suit = null qdel(helmet) - qdel(jetpack) + helmet = null + QDEL_NULL(jetpack) return ..() /obj/item/clothing/head/helmet/space/hardsuit/Destroy() diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index ea58a2ae65ff..e3e8be62bab7 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -11,6 +11,10 @@ var/datum/component/storage/detached_pockets var/attachment_slot = CHEST +/obj/item/clothing/accessory/Destroy() + set_detached_pockets(null) + return ..() + /obj/item/clothing/accessory/proc/can_attach_accessory(obj/item/clothing/U, mob/user) if(!attachment_slot || (U && U.body_parts_covered & attachment_slot)) return TRUE @@ -23,7 +27,7 @@ if(SEND_SIGNAL(U, COMSIG_CONTAINS_STORAGE)) return FALSE U.TakeComponent(storage) - detached_pockets = storage + set_detached_pockets(storage) U.attached_accessory = src forceMove(U) layer = FLOAT_LAYER @@ -66,6 +70,17 @@ U.attached_accessory = null U.accessory_overlay = null +/obj/item/clothing/accessory/proc/set_detached_pockets(new_pocket) + if(detached_pockets) + UnregisterSignal(detached_pockets, COMSIG_PARENT_QDELETING) + detached_pockets = new_pocket + if(detached_pockets) + RegisterSignal(detached_pockets, COMSIG_PARENT_QDELETING, .proc/handle_pockets_del) + +/obj/item/clothing/accessory/proc/handle_pockets_del(datum/source) + SIGNAL_HANDLER + set_detached_pockets(null) + /obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user) return diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 2a0bc21722a5..b236f4fa5aa1 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -66,7 +66,7 @@ /obj/add_blood_DNA(list/dna) . = ..() - if(length(dna)) + if(length(dna) && !QDELETED(src)) . = AddComponent(/datum/component/forensics, null, null, dna) /obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) diff --git a/code/modules/economy/selling_pad.dm b/code/modules/economy/selling_pad.dm index 5dadf5911ce3..56cafbc35a72 100644 --- a/code/modules/economy/selling_pad.dm +++ b/code/modules/economy/selling_pad.dm @@ -76,7 +76,7 @@ /obj/machinery/computer/selling_pad_control/ui_data(mob/user) var/list/data = list() data["points"] = sell_account.account_balance - data["pad"] = pad.resolve() ? TRUE : FALSE + data["pad"] = pad?.resolve() ? TRUE : FALSE data["sending"] = sending data["status_report"] = status_report return data diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 7d9454aa6cf7..668aaf6195a6 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -129,7 +129,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) #ifdef UNIT_TESTS if(GLOB.current_test) //good day, sir - GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]") + GLOB.current_test.Fail("[main_line]\n[desclines.Join("\n")]", file = E.file, line = E.line) #endif diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 3a7090a65319..ff02f77edaa4 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -16,9 +16,9 @@ for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) Ian.place_on_head(new /obj/item/bedsheet(Ian)) - for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_living_list) - new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) - qdel(Poly) + for(var/mob/living/simple_animal/parrot/Polly/Polly in GLOB.mob_living_list) + new /mob/living/simple_animal/parrot/Polly/ghost(Polly.loc) + qdel(Polly) /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 952f83b36503..45e9551ae25a 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -541,7 +541,7 @@ if(!override) qdel(src) -/obj/structure/spacevine/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/spacevine/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(isvineimmune(mover)) return TRUE diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index e54096b6617c..5232f81bb696 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -83,8 +83,9 @@ if(!(resistance_flags & ON_FIRE) && !force) return QDEL_HINT_LETMELIVE - SSticker.round_end_events -= roundend_callback GLOB.poi_list.Remove(src) + LAZYREMOVE(SSticker.round_end_events, roundend_callback) + roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling for(var/i in GLOB.player_list) var/mob/M = i var/message = "A dark temptation has passed from this world" diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm deleted file mode 100644 index 13c6f35a69df..000000000000 --- a/code/modules/fields/fields.dm +++ /dev/null @@ -1,324 +0,0 @@ - -//Movable and easily code-modified fields! Allows for custom AOE effects that affect movement and anything inside of them, and can do custom turf effects! -//Supports automatic recalculation/reset on movement. -//If there's any way to make this less CPU intensive than I've managed, gimme a call or do it yourself! - kevinz000 - -//Field shapes -#define FIELD_NO_SHAPE 0 //Does not update turfs automatically -#define FIELD_SHAPE_RADIUS_SQUARE 1 //Uses current_range and square_depth_up/down -#define FIELD_SHAPE_CUSTOM_SQUARE 2 //Uses square_height and square_width and square_depth_up/down - -//Proc to make fields. make_field(field_type, field_params_in_associative_list) -/proc/make_field(field_type, list/field_params, override_checks = FALSE, start_field = TRUE) - var/datum/proximity_monitor/advanced/F = new field_type() - if(!F.assume_params(field_params) && !override_checks) - QDEL_NULL(F) - if(!F.check_variables() && !override_checks) - QDEL_NULL(F) - if(start_field && (F || override_checks)) - F.begin_field() - return F - -/datum/proximity_monitor/advanced - var/name = "\improper Energy Field" - //Field setup specifications - var/field_shape = FIELD_NO_SHAPE - var/square_height = 0 - var/square_width = 0 - var/square_depth_up = 0 - var/square_depth_down = 0 - //Processing - var/process_inner_turfs = FALSE //Don't do this unless it's absolutely necessary - var/process_edge_turfs = FALSE //Don't do this either unless it's absolutely necessary, you can just track what things are inside manually or on the initial setup. - var/requires_processing = FALSE - var/setup_edge_turfs = FALSE //Setup edge turfs/all field turfs. Set either or both to ON when you need it, it's defaulting to off unless you do to save CPU. - var/setup_field_turfs = FALSE - var/use_host_turf = FALSE //For fields from items carried on mobs to check turf instead of loc... - - var/list/turf/field_turfs = list() - var/list/turf/edge_turfs = list() - var/list/turf/field_turfs_new = list() - var/list/turf/edge_turfs_new = list() - -/datum/proximity_monitor/advanced/Destroy() - full_cleanup() - STOP_PROCESSING(SSfields, src) - return ..() - -/datum/proximity_monitor/advanced/proc/assume_params(list/field_params) - var/pass_check = TRUE - for(var/param in field_params) - if(vars[param] || isnull(vars[param]) || (param in vars)) - vars[param] = field_params[param] - else - pass_check = FALSE - return pass_check - -/datum/proximity_monitor/advanced/proc/check_variables() - var/pass = TRUE - if(field_shape == FIELD_NO_SHAPE) //If you're going to make a manually updated field you shouldn't be using automatic checks so don't. - pass = FALSE - if(current_range < 0 || square_height < 0 || square_width < 0 || square_depth_up < 0 || square_depth_down < 0) - pass = FALSE - if(!istype(host)) - pass = FALSE - return pass - -/datum/proximity_monitor/advanced/process() - if(process_inner_turfs) - for(var/turf/T in field_turfs) - process_inner_turf(T) - CHECK_TICK //Really crappy lagchecks, needs improvement once someone starts using processed fields. - if(process_edge_turfs) - for(var/turf/T in edge_turfs) - process_edge_turf(T) - CHECK_TICK //Same here. - -/datum/proximity_monitor/advanced/proc/process_inner_turf(turf/T) - -/datum/proximity_monitor/advanced/proc/process_edge_turf(turf/T) - -/datum/proximity_monitor/advanced/New() - if(requires_processing) - START_PROCESSING(SSfields, src) - -/datum/proximity_monitor/advanced/proc/begin_field() - setup_field() - post_setup_field() - -/datum/proximity_monitor/advanced/proc/full_cleanup() //Full cleanup for when you change something that would require complete resetting. - for(var/turf/T in edge_turfs) - cleanup_edge_turf(T) - for(var/turf/T in field_turfs) - cleanup_field_turf(T) - -/datum/proximity_monitor/advanced/proc/check_movement() - if(!use_host_turf) - if(host.loc != last_host_loc) - last_host_loc = host.loc - return TRUE - else - if(get_turf(host) != last_host_loc) - last_host_loc = get_turf(host) - return TRUE - return FALSE - -/datum/proximity_monitor/advanced/proc/recalculate_field(ignore_movement_check = FALSE) //Call every time the field moves (done automatically if you use update_center) or a setup specification is changed. - if(!(ignore_movement_check || check_movement()) && (field_shape != FIELD_NO_SHAPE)) - return - update_new_turfs() - var/list/turf/needs_setup = field_turfs_new.Copy() - if(setup_field_turfs) - for(var/turf/T in field_turfs) - if(!(T in needs_setup)) - cleanup_field_turf(T) - else - needs_setup -= T - CHECK_TICK - for(var/turf/T in needs_setup) - setup_field_turf(T) - CHECK_TICK - if(setup_edge_turfs) - for(var/turf/T in edge_turfs) - cleanup_edge_turf(T) - CHECK_TICK - for(var/turf/T in edge_turfs_new) - setup_edge_turf(T) - CHECK_TICK - -/datum/proximity_monitor/advanced/proc/field_turf_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F, turf/entering) - return TRUE - -/datum/proximity_monitor/advanced/proc/field_turf_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F) - return TRUE - -/datum/proximity_monitor/advanced/proc/field_turf_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_turf/F) - return TRUE - -/datum/proximity_monitor/advanced/proc/field_edge_canpass(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F, turf/entering) - return TRUE - -/datum/proximity_monitor/advanced/proc/field_edge_crossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F) - return TRUE - -/datum/proximity_monitor/advanced/proc/field_edge_uncrossed(atom/movable/AM, obj/effect/abstract/proximity_checker/advanced/field_edge/F) - return TRUE - -/datum/proximity_monitor/advanced/HandleMove() - var/atom/_host = host - var/atom/new_host_loc = _host.loc - if(last_host_loc != new_host_loc) - INVOKE_ASYNC(src, .proc/recalculate_field) - -/datum/proximity_monitor/advanced/proc/post_setup_field() - -/datum/proximity_monitor/advanced/proc/setup_field() - update_new_turfs() - if(setup_field_turfs) - for(var/turf/T in field_turfs_new) - setup_field_turf(T) - CHECK_TICK - if(setup_edge_turfs) - for(var/turf/T in edge_turfs_new) - setup_edge_turf(T) - CHECK_TICK - -/datum/proximity_monitor/advanced/proc/cleanup_field_turf(turf/T) - qdel(field_turfs[T]) - field_turfs -= T - -/datum/proximity_monitor/advanced/proc/cleanup_edge_turf(turf/T) - qdel(edge_turfs[T]) - edge_turfs -= T - -/datum/proximity_monitor/advanced/proc/setup_field_turf(turf/T) - field_turfs[T] = new /obj/effect/abstract/proximity_checker/advanced/field_turf(T, src) - -/datum/proximity_monitor/advanced/proc/setup_edge_turf(turf/T) - edge_turfs[T] = new /obj/effect/abstract/proximity_checker/advanced/field_edge(T, src) - -/datum/proximity_monitor/advanced/proc/update_new_turfs() - if(!istype(host)) - return FALSE - var/turf/center = get_turf(host) - field_turfs_new = list() - edge_turfs_new = list() - switch(field_shape) - if(FIELD_NO_SHAPE) - return FALSE - if(FIELD_SHAPE_RADIUS_SQUARE) - for(var/turf/T in block(locate(center.x-current_range,center.y-current_range,center.z-square_depth_down),locate(center.x+current_range, center.y+current_range,center.z+square_depth_up))) - field_turfs_new += T - edge_turfs_new = field_turfs_new.Copy() - if(current_range >= 1) - var/list/turf/center_turfs = list() - for(var/turf/T in block(locate(center.x-current_range+1,center.y-current_range+1,center.z-square_depth_down),locate(center.x+current_range-1, center.y+current_range-1,center.z+square_depth_up))) - center_turfs += T - for(var/turf/T in center_turfs) - edge_turfs_new -= T - if(FIELD_SHAPE_CUSTOM_SQUARE) - for(var/turf/T in block(locate(center.x-square_width,center.y-square_height,center.z-square_depth_down),locate(center.x+square_width, center.y+square_height,center.z+square_depth_up))) - field_turfs_new += T - edge_turfs_new = field_turfs_new.Copy() - if(square_height >= 1 && square_width >= 1) - var/list/turf/center_turfs = list() - for(var/turf/T in block(locate(center.x-square_width+1,center.y-square_height+1,center.z-square_depth_down),locate(center.x+square_width-1, center.y+square_height-1,center.z+square_depth_up))) - center_turfs += T - for(var/turf/T in center_turfs) - edge_turfs_new -= T - -//Gets edge direction/corner, only works with square radius/WDH fields! -/datum/proximity_monitor/advanced/proc/get_edgeturf_direction(turf/T, turf/center_override = null) - var/turf/checking_from = get_turf(host) - if(istype(center_override)) - checking_from = center_override - if(field_shape != FIELD_SHAPE_RADIUS_SQUARE && field_shape != FIELD_SHAPE_CUSTOM_SQUARE) - return - if(!(T in edge_turfs)) - return - switch(field_shape) - if(FIELD_SHAPE_RADIUS_SQUARE) - if(((T.x == (checking_from.x + current_range)) || (T.x == (checking_from.x - current_range))) && ((T.y == (checking_from.y + current_range)) || (T.y == (checking_from.y - current_range)))) - return get_dir(checking_from, T) - if(T.x == (checking_from.x + current_range)) - return EAST - if(T.x == (checking_from.x - current_range)) - return WEST - if(T.y == (checking_from.y - current_range)) - return SOUTH - if(T.y == (checking_from.y + current_range)) - return NORTH - if(FIELD_SHAPE_CUSTOM_SQUARE) - if(((T.x == (checking_from.x + square_width)) || (T.x == (checking_from.x - square_width))) && ((T.y == (checking_from.y + square_height)) || (T.y == (checking_from.y - square_height)))) - return get_dir(checking_from, T) - if(T.x == (checking_from.x + square_width)) - return EAST - if(T.x == (checking_from.x - square_width)) - return WEST - if(T.y == (checking_from.y - square_height)) - return SOUTH - if(T.y == (checking_from.y + square_height)) - return NORTH - -//DEBUG FIELDS -/datum/proximity_monitor/advanced/debug - name = "\improper Color Matrix Field" - field_shape = FIELD_SHAPE_RADIUS_SQUARE - current_range = 5 - var/set_fieldturf_color = "#aaffff" - var/set_edgeturf_color = "#ffaaff" - setup_field_turfs = TRUE - setup_edge_turfs = TRUE - - -/datum/proximity_monitor/advanced/debug/setup_edge_turf(turf/T) - T.color = set_edgeturf_color - ..() - -/datum/proximity_monitor/advanced/debug/cleanup_edge_turf(turf/T) - T.color = initial(T.color) - ..() - if(T in field_turfs) - T.color = set_fieldturf_color - -/datum/proximity_monitor/advanced/debug/setup_field_turf(turf/T) - T.color = set_fieldturf_color - ..() - -/datum/proximity_monitor/advanced/debug/cleanup_field_turf(turf/T) - T.color = initial(T.color) - ..() - -//DEBUG FIELD ITEM -/obj/item/multitool/field_debug - name = "strange multitool" - desc = "Seems to project a colored field!" - var/list/field_params = list("field_shape" = FIELD_SHAPE_RADIUS_SQUARE, "current_range" = 5, "set_fieldturf_color" = "#aaffff", "set_edgeturf_color" = "#ffaaff") - var/field_type = /datum/proximity_monitor/advanced/debug - var/operating = FALSE - var/datum/proximity_monitor/advanced/current = null - var/mob/listeningTo - -/obj/item/multitool/field_debug/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/multitool/field_debug/Destroy() - STOP_PROCESSING(SSobj, src) - QDEL_NULL(current) - listeningTo = null - return ..() - -/obj/item/multitool/field_debug/proc/setup_debug_field() - var/list/new_params = field_params.Copy() - new_params["host"] = src - current = make_field(field_type, new_params) - -/obj/item/multitool/field_debug/attack_self(mob/user) - operating = !operating - to_chat(user, "You turn [src] [operating? "on":"off"].") - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null - if(!istype(current) && operating) - RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/on_mob_move) - listeningTo = user - setup_debug_field() - else if(!operating) - QDEL_NULL(current) - -/obj/item/multitool/field_debug/dropped() - . = ..() - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) - listeningTo = null - -/obj/item/multitool/field_debug/proc/on_mob_move() - SIGNAL_HANDLER - - check_turf(get_turf(src)) - -/obj/item/multitool/field_debug/process() - check_turf(get_turf(src)) - -/obj/item/multitool/field_debug/proc/check_turf(turf/T) - current.HandleMove() diff --git a/code/modules/fields/turf_objects.dm b/code/modules/fields/turf_objects.dm deleted file mode 100644 index ce872622b0c3..000000000000 --- a/code/modules/fields/turf_objects.dm +++ /dev/null @@ -1,67 +0,0 @@ - -/obj/effect/abstract/proximity_checker/advanced - name = "field" - desc = "Why can you see energy fields?!" - icon = null - icon_state = null - alpha = 0 - invisibility = INVISIBILITY_ABSTRACT - flags_1 = ON_BORDER_1 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/datum/proximity_monitor/advanced/parent = null - -/obj/effect/abstract/proximity_checker/advanced/Initialize(mapload, _monitor) - if(_monitor) - parent = _monitor - return ..() - -/obj/effect/abstract/proximity_checker/advanced/center - name = "field anchor" - desc = "No." - -/obj/effect/abstract/proximity_checker/advanced/field_turf - name = "energy field" - desc = "Get off my turf!" - -/obj/effect/abstract/proximity_checker/advanced/field_turf/CanAllowThrough(atom/movable/AM, turf/target) - . = ..() - if(parent) - return parent.field_turf_canpass(AM, src, target) - -/obj/effect/abstract/proximity_checker/advanced/field_turf/on_entered(datum/source, atom/movable/AM) - if(parent) - return parent.field_turf_crossed(AM, src) - return TRUE - -/obj/effect/abstract/proximity_checker/advanced/field_turf/on_uncrossed(datum/source, atom/movable/AM) - if(parent) - return parent.field_turf_uncrossed(AM, src) - return TRUE - -/obj/effect/abstract/proximity_checker/advanced/field_edge - name = "energy field edge" - desc = "Edgy description here." - -/obj/effect/abstract/proximity_checker/advanced/field_edge/CanAllowThrough(atom/movable/AM, turf/target) - . = ..() - if(parent) - return parent.field_edge_canpass(AM, src, target) - -/obj/effect/abstract/proximity_checker/advanced/field_edge/on_entered(datum/source, atom/movable/AM) - if(parent) - return parent.field_edge_crossed(AM, src) - return TRUE - -/obj/effect/abstract/proximity_checker/advanced/field_edge/on_uncrossed(datum/source, atom/movable/AM) - if(parent) - return parent.field_edge_uncrossed(AM, src) - return TRUE - -/proc/is_turf_in_field(turf/T, datum/proximity_monitor/advanced/F) //Looking for ways to optimize this! - for(var/obj/effect/abstract/proximity_checker/advanced/O in T) - if(istype(O, /obj/effect/abstract/proximity_checker/advanced/field_edge)) - if(O.parent == F) - return FIELD_EDGE - if(O.parent == F) - return FIELD_TURF - return FALSE diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 176a7183f560..1c4c0aa5377f 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -160,7 +160,7 @@ cast_projectile.original = target cast_projectile.fired_from = src cast_projectile.firer = user - cast_projectile.impacted = list(user = TRUE) + LAZYSET(cast_projectile.impacted, user, TRUE) cast_projectile.preparePixelProjectile(target, user) cast_projectile.fire() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 61c63b5407b0..7c604a15c22b 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -101,6 +101,9 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/simple/Initialize(mapload, mob/living/carbon/T) . = ..() + if(!T) + stack_trace("A hallucination was created with no target") + return INITIALIZE_HINT_QDEL target = T current_image = GetImage() if(target.client) @@ -660,7 +663,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(get_turf(airlock), 'sound/machines/boltsup.ogg',30,0,3) qdel(src) -/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, turf/_target) +/obj/effect/hallucination/fake_door_lock/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover == target && airlock.density) return FALSE diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index db58392b12e7..06c2b28e903c 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -123,7 +123,7 @@ /obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE) if(!isGlass) return - if(QDELING(src) || !target) //Invalid loc + if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc return if(bartender_check(target) && ranged) return diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 327c7b422398..4fa5354339c5 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -59,6 +59,11 @@ RefreshParts() fry_loop = new(list(src), FALSE) +/obj/machinery/deepfryer/Destroy() + QDEL_NULL(frying) + QDEL_NULL(fry_loop) + return ..() + /obj/machinery/deepfryer/RefreshParts() var/oil_efficiency for(var/obj/item/stock_parts/micro_laser/M in component_parts) diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index 90fb5c27ae7b..4c1a8695d838 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -93,8 +93,9 @@ . = ..() /obj/machinery/grill/Destroy() - grilled_item = null - . = ..() + QDEL_NULL(grilled_item) + QDEL_NULL(grill_loop) + return ..() /obj/machinery/grill/handle_atom_del(atom/A) if(A == grilled_item) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 72219b159b4d..ba728daf7797 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -40,6 +40,8 @@ /obj/machinery/microwave/Destroy() eject() + QDEL_NULL(soundloop) + QDEL_LIST(ingredients) if(wires) QDEL_NULL(wires) . = ..() diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index e8c31b9c4c7b..ea07e2f70b27 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -89,7 +89,6 @@ and clear when youre done! if you dont i will use :newspaper2: on you /obj/machinery/computer/holodeck/LateInitialize()//from here linked is populated and the program list is generated. its also set to load the offline program linked = GLOB.areas_by_type[mapped_start_area] - bottom_left = locate(linked.x, linked.y, src.z) var/area/computer_area = get_area(src) if(istype(computer_area, /area/holodeck)) @@ -99,7 +98,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you // the following is necessary for power reasons if(!linked) - log_world("No matching holodeck area found") + log_mapping("No matching holodeck area found") qdel(src) return else if (!offline_program) @@ -115,6 +114,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you else linked.power_usage = list(AREA_USAGE_LEN) + bottom_left = locate(linked.x, linked.y, z) COOLDOWN_START(src, holodeck_cooldown, HOLODECK_CD) generate_program_list() load_program(offline_program,TRUE) diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 3f164952fbb4..9c69b8e89812 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -28,31 +28,36 @@ /obj/effect/holodeck_effect/cards icon = 'icons/obj/toy.dmi' icon_state = "deck_nanotrasen_full" - var/obj/item/toy/cards/deck/D + var/obj/item/toy/cards/deck/deck /obj/effect/holodeck_effect/cards/activate(obj/machinery/computer/holodeck/HC) - D = new(loc) + deck = new(loc) safety(!(HC.obj_flags & EMAGGED)) - D.holo = HC - return D + deck.holo = HC + RegisterSignal(deck, COMSIG_PARENT_QDELETING, .proc/handle_card_delete) + return deck + +/obj/effect/holodeck_effect/cards/proc/handle_card_delete(datum/source) + SIGNAL_HANDLER + deck = null /obj/effect/holodeck_effect/cards/safety(active) - if(!D) + if(!deck) return if(active) - D.card_hitsound = null - D.card_force = 0 - D.card_throwforce = 0 - D.card_throw_speed = 3 - D.card_throw_range = 7 - D.card_attack_verb = list("attacked") + deck.card_hitsound = null + deck.card_force = 0 + deck.card_throwforce = 0 + deck.card_throw_speed = 3 + deck.card_throw_range = 7 + deck.card_attack_verb = list("attacked") else - D.card_hitsound = 'sound/weapons/bladeslice.ogg' - D.card_force = 5 - D.card_throwforce = 10 - D.card_throw_speed = 3 - D.card_throw_range = 7 - D.card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") + deck.card_hitsound = 'sound/weapons/bladeslice.ogg' + deck.card_force = 5 + deck.card_throwforce = 10 + deck.card_throw_speed = 3 + deck.card_throw_range = 7 + deck.card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") /obj/effect/holodeck_effect/sparks/activate(obj/machinery/computer/holodeck/HC) @@ -68,24 +73,29 @@ /obj/effect/holodeck_effect/mobspawner var/mobtype = /mob/living/simple_animal/hostile/carp/holocarp - var/mob/mob = null + var/mob/our_mob = null /obj/effect/holodeck_effect/mobspawner/activate(obj/machinery/computer/holodeck/HC) if(islist(mobtype)) mobtype = pick(mobtype) - mob = new mobtype(loc) - mob.flags_1 |= HOLOGRAM_1 + our_mob = new mobtype(loc) + our_mob.flags_1 |= HOLOGRAM_1 // these vars are not really standardized but all would theoretically create stuff on death - for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & mob.vars) - mob.vars[v] = null - return mob + for(var/v in list("butcher_results","corpse","weapon1","weapon2","blood_volume") & our_mob.vars) + our_mob.vars[v] = null + RegisterSignal(our_mob, COMSIG_PARENT_QDELETING, .proc/handle_mob_delete) + return our_mob /obj/effect/holodeck_effect/mobspawner/deactivate(obj/machinery/computer/holodeck/HC) - if(mob) - HC.derez(mob) + if(our_mob) + HC.derez(our_mob) qdel(src) +/obj/effect/holodeck_effect/mobspawner/proc/handle_mob_delete(datum/source) + SIGNAL_HANDLER + our_mob = null + /obj/effect/holodeck_effect/mobspawner/pet mobtype = list( /mob/living/simple_animal/butterfly, /mob/living/simple_animal/chick/holo, diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index c7f0ebe190bf..7fa710323207 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -33,6 +33,9 @@ // This is for adminspawn or map-placed growns. They get the default stats of their seed type. seed = new seed() seed.adjust_potency(50-seed.potency) + else if(!seed) + stack_trace("Grown object created without a seed. WTF") + return INITIALIZE_HINT_QDEL pixel_x = base_pixel_x + rand(-5, 5) pixel_y = base_pixel_y + rand(-5, 5) diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index b9d903ddf72a..ec6618df7fc9 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -38,9 +38,17 @@ seed_modifier = round(seed.potency / 25) var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier) var/old_cotton_amount = cotton.amount - for(var/obj/item/stack/ST in user.loc) - if(ST != cotton && istype(ST, cotton_type) && ST.amount < ST.max_amount) - ST.attackby(cotton, user) + for(var/obj/item/stack/potential_stack in user.loc) + if(QDELETED(potential_stack)) + continue + if(potential_stack == cotton) + continue + if(!istype(potential_stack, cotton_type)) + continue + if(potential_stack.amount >= potential_stack.max_amount) + continue + potential_stack.attackby(cotton, user) + if(cotton.amount > old_cotton_amount) to_chat(user, "You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].") qdel(src) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index c04bd8ee3195..008009a35765 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE var/plantname = "Plants" // Name of plant when planted. - var/obj/item/product // A type path. The thing that is created when the plant is harvested. + var/obj/item/product // A type path. The thing that is created when the plant is harvested. var/productdesc var/species = "" // Used to update icons. Should match the name in the sprites unless all icon_* are overridden. @@ -24,7 +24,7 @@ var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested. var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways. var/growthstages = 6 // Amount of growth sprites the plant has. - var/instability = 5 //Chance that a plant will mutate in each stage of it's life. + var/instability = 5 // Chance that a plant will mutate in each stage of it's life. var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom. var/list/mutatelist = list() // The type of plants that this plant can mutate into. var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info. @@ -35,10 +35,10 @@ // Stronger reagents must always come first to avoid being displaced by weaker ones. // Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier) - var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth - var/weed_chance = 5 //Percentage chance per tray update to grow weeds - var/research = 0 //defines "discovery value", which will give a one-time point payout if a seed is given to an R&D console. Seed discovery is determined on a ship-by-ship basis. - var/seed_flags = MUTATE_EARLY //Determines if a plant is allowed to mutate early at 30+ instability + var/weed_rate = 1 // If the chance below passes, then this many weeds sprout during growth + var/weed_chance = 5 // Percentage chance per tray update to grow weeds + var/research = 0 // Defines "discovery value", which will give a one-time point payout if a seed is given to an R&D console. Seed discovery is determined on a ship-by-ship basis. + var/seed_flags = MUTATE_EARLY // Determines if a plant is allowed to mutate early at 30+ instability /obj/item/seeds/Initialize(mapload, nogenes = 0) . = ..() @@ -75,6 +75,11 @@ genes += new /datum/plant_gene/reagent(reag_id, reagents_add[reag_id]) reagents_from_genes() //quality coding +/obj/item/seeds/Destroy() + if(flags_1 & INITIALIZED_1) + QDEL_LIST(genes) + return ..() + /obj/item/seeds/examine(mob/user) . = ..() . += "Use a pen on it to rename it or change its description." @@ -259,7 +264,7 @@ var/list/data = null if(rid == "blood") // Hack to make blood in plants always O- data = list("blood_type" = "O-") - if(rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin) + if(istype(T) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) // apple tastes of apple. data = T.tastes diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm index 10b8a019233d..99eae15ba9ca 100644 --- a/code/modules/instruments/songs/_song.dm +++ b/code/modules/instruments/songs/_song.dm @@ -146,7 +146,9 @@ stop_playing() SSinstruments.on_song_del(src) lines = null - using_instrument = null + if(using_instrument) + using_instrument.songs_using -= src + using_instrument = null allowed_instrument_ids = null parent = null return ..() diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 9a32cacb53e5..1f42ec424706 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -53,7 +53,9 @@ Key procs var/atom/owner /// Initializes, and copies in the languages from the current atom if available. -/datum/language_holder/New(_owner) +/datum/language_holder/New(atom/_owner) + if(_owner && QDELETED(_owner)) + CRASH("Langauge holder added to a qdeleting thing, what the fuck \ref[_owner]") owner = _owner if(istype(owner, /datum/mind)) var/datum/mind/M = owner diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index c05d901a02cb..a5a68d98d609 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -26,9 +26,7 @@ // Will update the light (duh). // Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() - set waitfor = FALSE - if (QDELETED(src)) - return + SHOULD_NOT_SLEEP(TRUE) if(light_system != STATIC_LIGHT) CRASH("update_light() for [src] with following light_system value: [light_system]") diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index bdc18d230029..7b6bc79aec45 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -34,7 +34,7 @@ /atom/movable/lighting_object/Destroy(force) if (force) SSlighting.objects_queue -= src - if (loc != myturf) + if (loc != myturf && loc) var/turf/oldturf = get_turf(myturf) var/turf/newturf = get_turf(loc) stack_trace("A lighting object was qdeleted with a different loc then it is suppose to have ([COORD(oldturf)] -> [COORD(newturf)])") diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index baf98d801337..fd26e1215f7c 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -2,7 +2,7 @@ for(var/turf/T in world) var/area/A = T.loc if(IS_DYNAMIC_LIGHTING(T) && IS_DYNAMIC_LIGHTING(A)) - new/atom/movable/lighting_object(T) + new /atom/movable/lighting_object(T) // Initial starlight updates used to be done in lighting_object initialize, // but doing them here means ChangeTurf doesn't occasionally update starlight twice. diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index a83591fe97ab..9aeed0602f24 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -61,7 +61,8 @@ source_atom = null source_turf = null pixel_turf = null - . = ..() + + return ..() // Yes this doesn't align correctly on anything other than 4 width tabs. // If you want it to go switch everybody to elastic tab stops. diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 57ffb011c438..39d443929e21 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -149,6 +149,7 @@ for(var/turf/turf_to_disable as anything in border) turf_to_disable.blocks_air = TRUE turf_to_disable.set_sleeping(TRUE) + turf_to_disable.air_update_turf(TRUE) // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 5adc1b373471..e9ac7662edab 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -240,12 +240,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/obj/structure/bodycontainer/morgue/j = pick(trays) var/mob/living/carbon/human/h = new /mob/living/carbon/human(j, 1) h.death() - for (var/part in h.internal_organs) //randomly remove organs from each body, set those we keep to be in stasis + for (var/obj/item/organ/internal_organ as anything in h.internal_organs) //randomly remove organs from each body, set those we keep to be in stasis if (prob(40)) - qdel(part) + qdel(internal_organ) else - var/obj/item/organ/O = part - O.organ_flags |= ORGAN_FROZEN + internal_organ.organ_flags |= ORGAN_FROZEN j.update_appearance() qdel(src) @@ -277,11 +276,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) new /obj/item/toy/balloon/corgi(thing) else openturfs += thing + //cake + knife to cut it! - var/turf/food_turf = get_turf(pick(table)) - new /obj/item/kitchen/knife(food_turf) - var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf) - iancake.desc = "Happy birthday, Ian!" + if(length(table)) + var/turf/food_turf = get_turf(pick(table)) + new /obj/item/kitchen/knife(food_turf) + var/obj/item/reagent_containers/food/snacks/store/cake/birthday/iancake = new(food_turf) + iancake.desc = "Happy birthday, Ian!" + //some balloons! this picks an open turf and pops a few balloons in and around that turf, yay. for(var/i in 1 to balloon_clusters) var/turf/clusterspot = pick_n_take(openturfs) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 5d412ad6fb8f..5d4db89f59d1 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -172,7 +172,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) /obj/structure/extraction_point/Destroy() GLOB.total_extraction_beacons -= src - ..() + return ..() /obj/effect/extraction_holder name = "extraction holder" diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index bad8c876d39d..dc42690d1b68 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -17,9 +17,12 @@ GLOBAL_LIST(labor_sheet_values) /obj/machinery/mineral/labor_claim_console/Initialize() . = ..() - Radio = new/obj/item/radio(src) + Radio = new /obj/item/radio(src) Radio.listening = FALSE locate_stacking_machine() + //If we can't find a stacking machine end it all ok? + if(!stacking_machine) + return INITIALIZE_HINT_QDEL if(!GLOB.labor_sheet_values) var/sheet_list = list() @@ -30,6 +33,13 @@ GLOBAL_LIST(labor_sheet_values) sheet_list += list(list("ore" = initial(sheet.name), "value" = initial(sheet.point_value))) GLOB.labor_sheet_values = sortList(sheet_list, /proc/cmp_sheet_list) +/obj/machinery/mineral/labor_claim_console/Destroy() + QDEL_NULL(Radio) + if(stacking_machine) + stacking_machine.console = null + stacking_machine = null + return ..() + /proc/cmp_sheet_list(list/a, list/b) return a["value"] - b["value"] @@ -88,9 +98,7 @@ GLOBAL_LIST(labor_sheet_values) /obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if(stacking_machine) - stacking_machine.CONSOLE = src - else - qdel(src) + stacking_machine.console = src /obj/machinery/mineral/labor_claim_console/emag_act(mob/user) if(!(obj_flags & EMAGGED)) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 77947d71043b..698e0a2dae25 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -419,6 +419,12 @@ var/obj/item/warp_cube/linked var/teleporting = FALSE +/obj/item/warp_cube/Destroy() + if(!QDELETED(linked)) + qdel(linked) + linked = null + return ..() + /obj/item/warp_cube/attack_self(mob/user) var/turf/current_location = get_turf(user) var/area/current_area = current_location.loc @@ -944,6 +950,12 @@ . += "This weapon contains a gradual heat accelerator that increases shot power as the weapon's energy stores are depleted. Shots at low power are significantly stronger, but also have incredibly short range." /obj/item/gun/energy/spur/update_appearance() + if(!cell) + chargesound = null + recoil = 1 + fire_sound = 'sound/weapons/spur_high.ogg' + return + var/maxcharge = cell.maxcharge var/charge = cell.charge diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 508cea2c3507..6ac92bd75e34 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -19,16 +19,17 @@ if(needs_item_input && anchored) register_input_turf() -/// Gets the turf in the `input_dir` direction adjacent to the machine, and registers signals for ATOM_ENTERED and ATOM_CREATED. Calls the `pickup_item()` proc when it receives these signals. +/// Gets the turf in the `input_dir` direction adjacent to the machine, and registers signals for ATOM_ENTERED. Calls the `pickup_item()` proc when it receives these signals. +/// DO NOT ADD COMSIG_ATOM_CREATED, SINCE PICKUP_ITEM WILL QDEL THE ITEM AND QDELING AN INITIALISING THING IS STUPID /obj/machinery/mineral/proc/register_input_turf() input_turf = get_step(src, input_dir) if(input_turf) // make sure there is actually a turf - RegisterSignal(input_turf, list(COMSIG_ATOM_CREATED, COMSIG_ATOM_ENTERED), .proc/pickup_item) + RegisterSignal(input_turf, COMSIG_ATOM_ENTERED, .proc/pickup_item) /// Unregisters signals that are registered the machine's input turf, if it has one. /obj/machinery/mineral/proc/unregister_input_turf() if(input_turf) - UnregisterSignal(input_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_CREATED)) + UnregisterSignal(input_turf, COMSIG_ATOM_ENTERED) /obj/machinery/mineral/Moved() . = ..() @@ -135,6 +136,8 @@ var/datum/material/selected_material = null var/selected_alloy = null var/datum/techweb/stored_research + ///Proximity monitor associated with this atom, needed for proximity checks. + var/datum/proximity_monitor/proximity_monitor /obj/machinery/mineral/processing_unit/Initialize() . = ..() diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 68c9666aa9eb..4f1cc8a08bc1 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -16,7 +16,13 @@ . = ..() machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if (machine) - machine.CONSOLE = src + machine.console = src + +/obj/machinery/mineral/stacking_unit_console/Destroy() + if(machine) + machine.console = null + machine = null + return ..() /obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I) if(!multitool_check_buffer(user, I)) @@ -78,13 +84,15 @@ circuit = /obj/item/circuitboard/machine/stacking_machine input_dir = EAST output_dir = WEST - var/obj/machinery/mineral/stacking_unit_console/CONSOLE + var/obj/machinery/mineral/stacking_unit_console/console var/stk_types = list() var/stk_amt = list() var/stack_list[0] //Key: Type. Value: Instance of type. var/stack_amt = 50 //amount to stack before releassing var/datum/component/remote_materials/materials var/force_connect = FALSE + ///Proximity monitor associated with this atom, needed for proximity checks. + var/datum/proximity_monitor/proximity_monitor /obj/machinery/mineral/stacking_machine/Initialize(mapload) . = ..() @@ -92,7 +100,9 @@ materials = AddComponent(/datum/component/remote_materials, "stacking", mapload, FALSE, mapload && force_connect) /obj/machinery/mineral/stacking_machine/Destroy() - CONSOLE = null + if(console) + console.machine = null + console = null materials = null return ..() @@ -103,8 +113,8 @@ /obj/machinery/mineral/stacking_machine/multitool_act(mob/living/user, obj/item/multitool/M) if(istype(M)) if(istype(M.buffer, /obj/machinery/mineral/stacking_unit_console)) - CONSOLE = M.buffer - CONSOLE.machine = src + console = M.buffer + console.machine = src to_chat(user, "You link [src] to the console in [M]'s buffer.") return TRUE diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 6df19e1a11de..707d68a871f7 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -48,6 +48,7 @@ /mob/living/simple_animal/hostile/mining_drone/Initialize() . = ..() + stored_gun = new(src) var/datum/action/innate/minedrone/toggle_light/toggle_light_action = new() toggle_light_action.Grant(src) @@ -68,6 +69,7 @@ /mob/living/simple_animal/hostile/mining_drone/Destroy() + QDEL_NULL(stored_gun) for (var/datum/action/innate/minedrone/action in actions) qdel(action) return ..() @@ -140,16 +142,14 @@ to_chat(M, "[src] has been set to attack hostile wildlife.") return -/mob/living/simple_animal/hostile/mining_drone/CanAllowThrough(atom/movable/O) +/mob/living/simple_animal/hostile/mining_drone/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(istype(O, /obj/projectile/kinetic)) - var/obj/projectile/kinetic/K = O - if(K.kinetic_gun) - for(var/A in K.kinetic_gun.get_modkits()) - var/obj/item/borg/upgrade/modkit/M = A - if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough)) - return TRUE - if(istype(O, /obj/projectile/destabilizer)) + if(istype(mover, /obj/projectile/kinetic)) + var/obj/projectile/kinetic/projectile = mover + if(projectile.kinetic_gun) + if (locate(/obj/item/borg/upgrade/modkit/minebot_passthrough) in projectile.kinetic_gun.modkits) + return TRUE + else if(istype(mover, /obj/projectile/destabilizer)) return TRUE /mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 2b93f03deb72..67379f1df8b5 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -129,7 +129,7 @@ icon_state = "wasteplanet_sand" item_state = "wasteplanet_sand" singular_name = "rocky dust" - grind_results = list(/datum/reagent/silicon = 10, /datum/reagent/lithium = 2, /datum/reagent/radium = 1, /datum/reagent/chlorine = 1, /datum/reagent/aluminium = 1)//may be unsafe for human consumption + grind_results = list(/datum/reagent/silicon = 10, /datum/reagent/lithium = 2, /datum/reagent/uranium/radium = 1, /datum/reagent/chlorine = 1, /datum/reagent/aluminium = 1)//may be unsafe for human consumption /obj/item/stack/ore/glass/beach name = "beige sand pile" diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 3d22ed748ea7..ee74d0475a34 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -99,6 +99,10 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/auto_deadmin_on_login() return +/mob/dead/Destroy() + LAZYREMOVEASSOC(SSmobs.dead_players_by_virtual_z, "[virtual_z()]", src) + return ..() + /mob/dead/Login() . = ..() if(!client) diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index 373950e296dc..5c47ccd6d526 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -6,8 +6,8 @@ client.set_db_player_flags() if(!mind) mind = new /datum/mind(key) - mind.active = 1 - mind.current = src + mind.active = TRUE + mind.set_current(src) . = ..() if(!. || !client) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 6597e5282a9f..6f37de4c4c77 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -422,8 +422,10 @@ if(mind) if(transfer_after) mind.late_joiner = TRUE - mind.active = 0 //we wish to transfer the key manually - mind.transfer_to(H) //won't transfer key since the mind is not active + mind.active = FALSE //we wish to transfer the key manually + mind.original_character_slot_index = client.prefs.default_slot + mind.transfer_to(H) //won't transfer key since the mind is not active + mind.set_original_character(H) H.name = real_name client.init_verbs() diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a577cbcc9f25..a986fc5be298 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -179,7 +179,6 @@ if(blood_id == /datum/reagent/blood) //actual blood reagent var/blood_data = list() //set the blood data - blood_data["donor"] = src blood_data["viruses"] = list() for(var/thing in diseases) @@ -280,6 +279,8 @@ break if(!B) B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) + if(QDELETED(B)) //Give it up + return B.bloodiness = min((B.bloodiness + BLOOD_AMOUNT_PER_DECAL), BLOOD_POOL_MAX) B.transfer_mob_blood_dna(src) //give blood info to the blood decal. if(temp_blood_DNA) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index b87ebfc0a97d..80daa8de3e3c 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -28,13 +28,14 @@ stored_dna.species = new rando_race() /mob/living/brain/Destroy() - if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. - if(stat!=DEAD) //If not dead. - death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA - if(mind) //You aren't allowed to return to brains that don't exist - mind.current = null - ghostize() //Ghostize checks for key so nothing else is necessary. + if(key) //If there is a mob connected to this thing. Have to check key twice to avoid false death reporting. + if(stat!=DEAD) //If not dead. + death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA + if(mind) //You aren't allowed to return to brains that don't exist + mind.set_current(null) + ghostize() //Ghostize checks for key so nothing else is necessary. container = null + QDEL_NULL(stored_dna) return ..() /mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 3f55549c3b6f..a70520462f39 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -184,6 +184,9 @@ if(brainmob) QDEL_NULL(brainmob) QDEL_LIST(traumas) + + if(owner?.mind) //You aren't allowed to return to brains that don't exist + owner.mind.set_current(null) return ..() /obj/item/organ/brain/on_life() diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 3c1bebae21ac..186dedcc86d5 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -37,7 +37,7 @@ if(!hit_atom) return if(!isliving(hit_atom)) - if(hit_atom.density && !hit_atom.CanPass(src)) + if(hit_atom.density && !hit_atom.CanPass(src, get_dir(hit_atom, src))) visible_message("[src] smashes into [hit_atom]!", "[src] smashes into [hit_atom]!") Paralyze(40, ignore_canstun = TRUE) return diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index ee011b69715c..39958b84fc0d 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -71,6 +71,10 @@ var/obj/item/clothing/mask/facehugger_item/hugger_item = BecomeItem() user.put_in_hands(hugger_item) +/mob/living/simple_animal/hostile/facehugger/Destroy() + mask_facehugger?.facehugger_mob = null + return ..() + /** * Attempts to have the facehugger couple with the given target. Checks all possibilities and plays them out accordingly. * diff --git a/code/modules/mob/living/carbon/alien/utilities/structures.dm b/code/modules/mob/living/carbon/alien/utilities/structures.dm index 6989434995f9..3ebba3ed7958 100644 --- a/code/modules/mob/living/carbon/alien/utilities/structures.dm +++ b/code/modules/mob/living/carbon/alien/utilities/structures.dm @@ -310,6 +310,8 @@ var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive layer = MOB_LAYER var/mob/living/simple_animal/hostile/facehugger/child + ///Proximity monitor associated with this atom, needed for proximity checks. + var/datum/proximity_monitor/proximity_monitor /obj/structure/alien/egg/Initialize(mapload) . = ..() @@ -364,13 +366,13 @@ /obj/structure/alien/egg/proc/Grow() status = GROWN update_appearance() - proximity_monitor.SetRange(1) + proximity_monitor.set_range(1) //drops and kills the hugger if any is remaining /obj/structure/alien/egg/proc/Burst(kill = TRUE) if(status == GROWN || status == GROWING) - proximity_monitor.SetRange(0) status = BURST + proximity_monitor.set_range(0) update_appearance() flick("egg_opening", src) addtimer(CALLBACK(src, .proc/finish_bursting, kill), 15) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f6bf7d8d08ab..84f67c8f8814 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -11,6 +11,7 @@ QDEL_LIST(hand_bodyparts) QDEL_LIST(internal_organs) + internal_organs_slot.Cut() QDEL_LIST(bodyparts) QDEL_LIST(implants) remove_from_all_data_huds() diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index d38b04d9c714..3a4591fabb98 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -385,7 +385,7 @@ blown_kiss.original = target blown_kiss.fired_from = user blown_kiss.firer = user // don't hit ourself that would be really annoying - blown_kiss.impacted = list(user = TRUE) // just to make sure we don't hit the wearer + LAZYSET(blown_kiss.impacted, user, TRUE) // just to make sure we don't hit the wearer blown_kiss.preparePixelProjectile(target, user) blown_kiss.fire() qdel(src) @@ -411,7 +411,7 @@ blown_kiss.original = taker blown_kiss.fired_from = offerer blown_kiss.firer = offerer // don't hit ourself that would be really annoying - blown_kiss.impacted = list(offerer = TRUE) // just to make sure we don't hit the wearer + LAZYSET(blown_kiss.impacted, offerer, TRUE) // just to make sure we don't hit the wearer blown_kiss.preparePixelProjectile(taker, offerer) blown_kiss.suppressed = SUPPRESSED_VERY // this also means it's a direct offer blown_kiss.fire() diff --git a/code/modules/mob/living/carbon/hologram/hologram.dm b/code/modules/mob/living/carbon/hologram/hologram.dm index 9479a2357c36..840488a3c120 100644 --- a/code/modules/mob/living/carbon/hologram/hologram.dm +++ b/code/modules/mob/living/carbon/hologram/hologram.dm @@ -225,7 +225,7 @@ var/formatted_laws = "Hologram law:\n" formatted_laws += flavortext ? "[flavortext]" : "No laws set!" //If flavortext set, show it, else show "No laws set!" formatted_laws += "\nEmergency holograms are ghost spawns that can majorly affect the round due to their versatility. Act with common sense.\n"+\ - "Using the role to grief or metagame against your set laws will be met with a silicon ban.\n" + "Using the role to grief or metagame against your set laws will be met with a silicon ban.\n" var/policy = get_policy(ROLE_POSIBRAIN) //if we need something different than the use of posibrains for policy and bans, ping mark and he'll add a new define for it if(policy) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d1ec98b84d4b..ecd847b3b37f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -40,6 +40,7 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) + QDEL_LIST(bioware) GLOB.human_list -= src return ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 25651680b46d..fb2071302cb1 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -141,7 +141,7 @@ if(istype(AM, /obj/item)) I = AM throwpower = I.throwforce - if(I.thrownby == src) //No throwing stuff at yourself to trigger hit reactions + if(I.thrownby == WEAKREF(src)) //No throwing stuff at yourself to trigger hit reactions return ..() if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK)) hitpush = FALSE diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index c54c453dc15f..551e60501940 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -60,7 +60,7 @@ if(dongle.translate_binary) return TRUE -/mob/living/carbon/human/radio(message, list/message_mods = list(), list/spans, language) //Poly has a copy of this, lazy bastard +/mob/living/carbon/human/radio(message, list/message_mods = list(), list/spans, language) //Polly has a copy of this, lazy bastard . = ..() if(. != FALSE) return . diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 5f4a7d708e80..0379bca7bb34 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -54,6 +54,7 @@ /datum/species/golem/random name = "Random Golem" + id = "random golem" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN var/static/list/random_golem_types @@ -445,7 +446,7 @@ var/obj/item/I if(istype(AM, /obj/item)) I = AM - if(I.thrownby == H) //No throwing stuff at yourself to trigger the teleport + if(I.thrownby == WEAKREF(H)) //No throwing stuff at yourself to trigger the teleport return 0 else reactive_teleport(H) @@ -577,7 +578,7 @@ var/obj/item/I if(istype(AM, /obj/item)) I = AM - if(I.thrownby == H) //No throwing stuff at yourself to make bananas + if(I.thrownby == WEAKREF(H)) //No throwing stuff at yourself to make bananas return 0 else new/obj/item/grown/bananapeel/specialpeel(get_turf(H)) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 084113dd1b7f..94cd1523344a 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -525,18 +525,25 @@ examine_limb_id = SPECIES_JELLYPERSON +//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW +/datum/species/jelly/luminescent/Destroy(force, ...) + current_extract = null + QDEL_NULL(glow) + QDEL_NULL(integrate_extract) + QDEL_NULL(extract_major) + QDEL_NULL(extract_minor) + return ..() + + /datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) ..() if(current_extract) current_extract.forceMove(C.drop_location()) current_extract = null - qdel(glow) - if(integrate_extract) - integrate_extract.Remove(C) - if(extract_minor) - extract_minor.Remove(C) - if(extract_major) - extract_major.Remove(C) + QDEL_NULL(glow) + QDEL_NULL(integrate_extract) + QDEL_NULL(extract_major) + QDEL_NULL(extract_minor) /datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() @@ -558,7 +565,7 @@ /datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) if(intensity) glow_intensity = intensity - glow.set_light(glow_intensity, glow_intensity, C.dna.features["mcolor"]) + glow.set_light_range_power_color(glow_intensity, glow_intensity, C.dna.features["mcolor"]) /obj/effect/dummy/luminescent_glow name = "luminescent glow" @@ -582,13 +589,9 @@ button_icon_state = "slimeconsume" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/luminescent/species - -/datum/action/innate/integrate_extract/New(_species) - ..() - species = _species /datum/action/innate/integrate_extract/proc/update_name() + var/datum/species/jelly/luminescent/species = target if(!species || !species.current_extract) name = "Integrate Extract" desc = "Eat a slime extract to use its properties." @@ -597,6 +600,7 @@ desc = "Eject your current slime extract." /datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) + var/datum/species/jelly/luminescent/species = target if(!species || !species.current_extract) button_icon_state = "slimeconsume" else @@ -605,11 +609,13 @@ /datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) - if(species && species.current_extract) + var/datum/species/jelly/luminescent/species = target + if(species?.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) /datum/action/innate/integrate_extract/Activate() var/mob/living/carbon/human/H = owner + var/datum/species/jelly/luminescent/species = target if(!is_species(H, /datum/species/jelly/luminescent) || !species) return CHECK_DNA_AND_SPECIES(H) @@ -645,25 +651,23 @@ icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" var/activation_type = SLIME_ACTIVATE_MINOR - var/datum/species/jelly/luminescent/species - -/datum/action/innate/use_extract/New(_species) - ..() - species = _species /datum/action/innate/use_extract/IsAvailable() if(..()) + var/datum/species/jelly/luminescent/species = target if(species && species.current_extract && (world.time > species.extract_cooldown)) return TRUE return FALSE /datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) - if(species && species.current_extract) + var/datum/species/jelly/luminescent/species = owner + if(species?.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) /datum/action/innate/use_extract/Activate() var/mob/living/carbon/human/H = owner + var/datum/species/jelly/luminescent/species = owner if(!is_species(H, /datum/species/jelly/luminescent) || !species) return CHECK_DNA_AND_SPECIES(H) @@ -690,24 +694,35 @@ var/datum/action/innate/link_minds/link_minds var/list/mob/living/linked_mobs = list() var/list/datum/action/innate/linked_speech/linked_actions = list() - var/mob/living/carbon/human/slimelink_owner + var/datum/weakref/slimelink_owner var/current_link_id = 0 examine_limb_id = SPECIES_JELLYPERSON +//Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW +/datum/species/jelly/stargazer/Destroy() + for(var/mob/living/link_to_clear as anything in linked_mobs) + unlink_mob(link_to_clear) + linked_mobs.Cut() + QDEL_NULL(project_thought) + QDEL_NULL(link_minds) + slimelink_owner = null + return ..() + /datum/species/jelly/stargazer/on_species_loss(mob/living/carbon/C) ..() - for(var/M in linked_mobs) - unlink_mob(M) + for(var/mob/living/link_to_clear as anything in linked_mobs) + unlink_mob(link_to_clear) if(project_thought) - project_thought.Remove(C) + QDEL_NULL(project_thought) if(link_minds) - link_minds.Remove(C) + QDEL_NULL(link_minds) + slimelink_owner = null /datum/species/jelly/stargazer/spec_death(gibbed, mob/living/carbon/human/H) ..() - for(var/M in linked_mobs) - unlink_mob(M) + for(var/mob/living/link_to_clear as anything in linked_mobs) + unlink_mob(link_to_clear) /datum/species/jelly/stargazer/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() @@ -715,7 +730,7 @@ project_thought.Grant(C) link_minds = new(src) link_minds.Grant(C) - slimelink_owner = C + slimelink_owner = WEAKREF(C) link_mob(C) /datum/species/jelly/stargazer/proc/link_mob(mob/living/M) @@ -727,8 +742,11 @@ return FALSE if(M in linked_mobs) return FALSE + var/mob/living/carbon/human/owner = slimelink_owner.resolve() + if(!owner) + return FALSE linked_mobs.Add(M) - to_chat(M, "You are now connected to [slimelink_owner.real_name]'s Slime Link.") + to_chat(M, "You are now connected to [owner.real_name]'s Slime Link.") var/datum/action/innate/linked_speech/action = new(src) linked_actions.Add(action) action.Grant(M) @@ -743,9 +761,12 @@ UnregisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING)) var/datum/action/innate/linked_speech/action = linked_actions[link_id] action.Remove(M) - to_chat(M, "You are no longer connected to [slimelink_owner.real_name]'s Slime Link.") - linked_mobs[link_id] = null - linked_actions[link_id] = null + var/mob/living/carbon/human/owner = slimelink_owner.resolve() + if(owner) + to_chat(M, "You are no longer connected to [owner.real_name]'s Slime Link.") + linked_mobs -= M + linked_actions -= action + qdel(action) /datum/action/innate/linked_speech name = "Slimelink" @@ -753,14 +774,12 @@ button_icon_state = "link_speech" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/stargazer/species - -/datum/action/innate/linked_speech/New(_species) - ..() - species = _species /datum/action/innate/linked_speech/Activate() var/mob/living/carbon/human/H = owner + if(H.stat == DEAD) + return + var/datum/species/jelly/stargazer/species = target if(!species || !(H in species.linked_mobs)) to_chat(H, "The link seems to have been severed...") Remove(H) @@ -773,9 +792,11 @@ Remove(H) return - if(message) - var/msg = "\[[species.slimelink_owner.real_name]'s Slime Link\] [H]: [message]" - log_directed_talk(H, species.slimelink_owner, msg, LOG_SAY, "slime link") + var/mob/living/carbon/human/star_owner = species.slimelink_owner.resolve() + + if(message && star_owner) + var/msg = "\[[star_owner.real_name]'s Slime Link\] [H]: [message]" + log_directed_talk(H, star_owner, msg, LOG_SAY, "slime link") for(var/X in species.linked_mobs) var/mob/living/M = X to_chat(M, msg) @@ -830,11 +851,6 @@ button_icon_state = "mindlink" icon_icon = 'icons/mob/actions/actions_slime.dmi' background_icon_state = "bg_alien" - var/datum/species/jelly/stargazer/species - -/datum/action/innate/link_minds/New(_species) - ..() - species = _species /datum/action/innate/link_minds/Activate() var/mob/living/carbon/human/H = owner @@ -847,6 +863,7 @@ return var/mob/living/target = H.pulling + var/datum/species/jelly/stargazer/species = target to_chat(H, "You begin linking [target]'s mind to yours...") to_chat(target, "You feel a foreign presence within your mind...") diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 36766f34ca53..4d9d41bd411d 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -67,6 +67,12 @@ max_integrity = 200 resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/storage/backpack/snail/dropped(mob/user, silent) + . = ..() + emptyStorage() + if(!QDELETED(src)) + qdel(src) + /obj/item/storage/backpack/snail/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, "snailshell") 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 96410f0cdcb7..8c53a6ca9a07 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -108,22 +108,4 @@ species_l_leg = /obj/item/bodypart/leg/left/zombie species_r_leg = /obj/item/bodypart/leg/right/zombie -/datum/species/human/krokodil_addict/replace_body(mob/living/carbon/C, datum/species/new_species, robotic = FALSE) - ..() - var/skintone - if(ishuman(C)) - var/mob/living/carbon/human/H = C - skintone = H.skin_tone - - for(var/obj/item/bodypart/BP as anything in C.bodyparts) - if(IS_ORGANIC_LIMB(BP)) - if(BP.body_zone == BODY_ZONE_HEAD || BP.body_zone == BODY_ZONE_CHEST) - BP.is_dimorphic = TRUE - BP.skin_tone ||= skintone - BP.limb_id = SPECIES_HUMAN - BP.should_draw_greyscale = TRUE - BP.name = "human [parse_zone(BP.body_zone)]" - BP.update_limb() - - #undef REGENERATION_DELAY diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index feaf0973c9c9..0fc21db37d8c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -8,6 +8,10 @@ damageoverlaytemp = 0 update_damage_hud() + //Just don't run if we're qdeleted already + if(QDELETED(src)) + return ..() + if(!IS_IN_STASIS(src)) //Reagent processing needs to come before breathing, to prevent edge cases. @@ -15,7 +19,7 @@ . = ..() - if (QDELETED(src)) + if(QDELETED(src)) return if(.) //not dead diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 057abfc3c1f3..4916d062da29 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -17,7 +17,7 @@ /mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, break_modifier = 1)//WS Edit - Breakable Bones SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone) var/hit_percent = (100-blocked)/100 - if(!damage || (!forced && hit_percent <= 0)) + if(!damage || (!forced && hit_percent <= 0) || !(flags_1 & INITIALIZED_1)) return FALSE var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index f4b5f85b91a6..e16dcf9e3326 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -85,6 +85,12 @@ /obj/item/clothing/head/mob_holder/container_resist_act() release() +/obj/item/clothing/head/mob_holder/drone/Initialize(mapload, mob/living/M, worn_state, head_icon, lh_icon, rh_icon, worn_slot_flags = NONE) + //If we're not being put onto a drone, end it all + if(!isdrone(M)) + return INITIALIZE_HINT_QDEL + return ..() + /obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L) . = ..() if(!isdrone(L)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a26d45c16add..8e01f457ef2e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -314,7 +314,7 @@ if(!iscarbon(src)) M.LAssailant = null else - M.LAssailant = usr + M.LAssailant = WEAKREF(usr) if(isliving(M)) var/mob/living/L = M SEND_SIGNAL(M, COMSIG_LIVING_GET_PULLED, src) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 6bb9e9aad856..31676cd64007 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -93,8 +93,9 @@ "Your armor has softened a hit to your [parse_zone(zone)]." ) apply_damage(I.throwforce, dtype, zone, armor) - if(I.thrownby) - log_combat(I.thrownby, src, "threw and hit", I) + var/mob/thrown_by = I.thrownby?.resolve() + if(thrown_by) + log_combat(thrown_by, src, "threw and hit", I) else return 1 else diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 709550cbc562..9634040582e0 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -3,7 +3,7 @@ update_turf_movespeed(loc) -/mob/living/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d782d21dfd53..81d1cc78ca92 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,14 +38,14 @@ var/can_be_carded = TRUE var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 - var/icon/holo_icon//Default is assigned when AI is created. + var/icon/holo_icon //Default is assigned when AI is created. var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/multitool/aiMulti var/mob/living/simple_animal/bot/Bot var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. - var/datum/effect_system/spark_spread/spark_system//So they can initialize sparks whenever/N + var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever/N //MALFUNCTION var/datum/module_picker/malf_picker @@ -106,7 +106,7 @@ new/obj/structure/AIcore/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. - ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) if(L && istype(L, /datum/ai_laws)) laws = L laws.associate(src) @@ -193,7 +193,11 @@ /mob/living/silicon/ai/Destroy() GLOB.ai_list -= src - qdel(eyeobj) // No AI, no Eye + QDEL_NULL(eyeobj) // No AI, no Eye + QDEL_NULL(aiMulti) + QDEL_NULL(spark_system) + if(robot_control) + QDEL_NULL(robot_control) malfhack = null . = ..() @@ -335,11 +339,11 @@ var/is_anchored = FALSE if(move_resist == MOVE_FORCE_OVERPOWERING) move_resist = MOVE_FORCE_NORMAL - REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, src) + REMOVE_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) else is_anchored = TRUE move_resist = MOVE_FORCE_OVERPOWERING - ADD_TRAIT(src, TRAIT_NO_TELEPORT, src) + ADD_TRAIT(src, TRAIT_NO_TELEPORT, AI_ANCHOR_TRAIT) to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored @@ -381,9 +385,11 @@ trackeable += track.humans + track.others var/list/target = list() for(var/I in trackeable) - var/mob/M = trackeable[I] - if(M.name == string) - target += M + var/datum/weakref/to_resolve = trackeable[I] + var/mob/to_track = to_resolve.resolve() + if(!to_track || to_track.name != string) + continue + target += to_track if(name == string) target += src if(target.len) @@ -989,9 +995,9 @@ return /mob/living/silicon/ai/spawned/Initialize(mapload, datum/ai_laws/L, mob/target_ai) - . = ..() if(!target_ai) target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct + . = ..() /mob/living/silicon/ai/proc/camera_visibility(mob/camera/aiEye/moved_eye) GLOB.cameranet.visibility(moved_eye, client, all_eyes, USE_STATIC_OPAQUE) diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index a3ffd460dd67..27136c4bbc94 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -9,20 +9,20 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /datum/cameranet var/name = "Camera Net" // Name to show for VV and stat() - // The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). + /// The cameras on the map, no matter if they work or not. Updated in obj/machinery/camera.dm by New() and Del(). var/list/cameras = list() - // The chunks of the map, mapping the areas that the cameras can see. + /// The chunks of the map, mapping the areas that the cameras can see. var/list/chunks = list() var/ready = 0 - // The object used for the clickable stat() button. + /// The object used for the clickable stat() button. var/obj/effect/statclick/statclick - // The objects used in vis_contents of obscured turfs + /// The objects used in vis_contents of obscured turfs var/list/vis_contents_objects var/obj/effect/overlay/camera_static/vis_contents_opaque var/obj/effect/overlay/camera_static/vis_contents_transparent - // The image given to the effect in vis_contents on AI clients + /// The image given to the effect in vis_contents on AI clients var/image/obscured var/image/obscured_transparent @@ -37,14 +37,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) obscured_transparent = new('icons/effects/cameravis.dmi', vis_contents_transparent, null, CAMERA_STATIC_LAYER) obscured_transparent.plane = CAMERA_STATIC_PLANE -// Checks if a chunk has been Generated in x, y, z. +/// Checks if a chunk has been Generated in x, y, z. /datum/cameranet/proc/chunkGenerated(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) return chunks["[x],[y],[z]"] -// Returns the chunk in the x, y, z. -// If there is no chunk, it creates a new chunk and returns that. +/// Returns the chunk in the x, y, z. +/// If there is no chunk, it creates a new chunk and returns that. /datum/cameranet/proc/getCameraChunk(x, y, z) x &= ~(CHUNK_SIZE - 1) y &= ~(CHUNK_SIZE - 1) @@ -53,8 +53,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(!.) chunks[key] = . = new /datum/camerachunk(x, y, z) -// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. - +/// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set. /datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes, use_static = USE_STATIC_OPAQUE) if(!islist(moved_eyes)) moved_eyes = moved_eyes ? list(moved_eyes) : list() @@ -106,8 +105,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(USE_STATIC_OPAQUE) client.images -= GLOB.cameranet.obscured -// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. - +/// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. /datum/cameranet/proc/updateVisibility(atom/A, opacity_check = 1) if(!SSticker || (opacity_check && !A.opacity)) return @@ -119,29 +117,25 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return chunk.hasChanged() -// Removes a camera from a chunk. - +/// Removes a camera from a chunk. /datum/cameranet/proc/removeCamera(obj/machinery/camera/c) majorChunkChange(c, 0) -// Add a camera to a chunk. - +/// Add a camera to a chunk. /datum/cameranet/proc/addCamera(obj/machinery/camera/c) if(c.can_use()) majorChunkChange(c, 1) -// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. - +/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. /datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) if(c.can_use()) majorChunkChange(c, 1) -// Never access this proc directly!!!! -// This will update the chunk and all the surrounding chunks. -// It will also add the atom to the cameras list if you set the choice to 1. -// Setting the choice to 0 will remove the camera from the chunks. -// If you want to update the chunks around an object, without adding/removing a camera, use choice 2. - +/// Never access this proc directly!!!! +/// This will update the chunk and all the surrounding chunks. +/// It will also add the atom to the cameras list if you set the choice to 1. +/// Setting the choice to 0 will remove the camera from the chunks. +/// If you want to update the chunks around an object, without adding/removing a camera, use choice 2. /datum/cameranet/proc/majorChunkChange(atom/c, choice) if(!c) return @@ -164,8 +158,19 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) chunk.cameras |= c chunk.hasChanged() -// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. - +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() + +/// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) return checkTurfVis(position) diff --git a/code/modules/mob/living/silicon/ai/robot_control.dm b/code/modules/mob/living/silicon/ai/robot_control.dm index e84a62694d3c..b70ae816b790 100644 --- a/code/modules/mob/living/silicon/ai/robot_control.dm +++ b/code/modules/mob/living/silicon/ai/robot_control.dm @@ -1,6 +1,12 @@ /datum/robot_control var/mob/living/silicon/ai/owner +/datum/robot_control/Destroy(force, ...) + if(!QDELETED(owner)) + CRASH("Robot Control panel destroyed even though owner AI is not being destroyed.") + owner = null + return ..() + /datum/robot_control/New(mob/living/silicon/ai/new_owner) if(!istype(new_owner)) qdel(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7ec7f6b83459..cc646cfcc98c 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -90,6 +90,7 @@ /mob/living/silicon/pai/Destroy() QDEL_NULL(internal_instrument) + QDEL_NULL(laws) if(cable) QDEL_NULL(cable) if (loc != card) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 02f1918ccef4..1af879fc878e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -200,12 +200,14 @@ if(T && istype(radio) && istype(radio.keyslot)) radio.keyslot.forceMove(T) radio.keyslot = null - qdel(wires) - qdel(module) - qdel(eye_lights) - wires = null - module = null - eye_lights = null + QDEL_NULL(wires) + QDEL_NULL(module) + QDEL_NULL(eye_lights) + QDEL_NULL(inv1) + QDEL_NULL(inv2) + QDEL_NULL(inv3) + QDEL_NULL(spark_system) + QDEL_LIST(upgrades) cell = null return ..() @@ -438,11 +440,11 @@ return update_icons() /mob/living/silicon/robot/update_icons() + if(QDELETED(src)) + return cut_overlays() icon_state = module.cyborg_base_icon - //WS changes - Thanks Cit - Allows modules to use different icon files icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon)) - //EndWS Changes if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' pixel_x = initial(pixel_x) @@ -505,7 +507,7 @@ /mob/living/silicon/robot/proc/SetLockdown(state = TRUE) // They stay locked down if their wire is cut. - if(wires.is_cut(WIRE_LOCKDOWN)) + if(wires?.is_cut(WIRE_LOCKDOWN)) state = TRUE if(state) throw_alert("locked", /atom/movable/screen/alert/locked) @@ -1146,7 +1148,7 @@ /mob/living/silicon/robot/proc/logevent(string = "") if(!string) return - if(stat == DEAD) //Dead borgs log no longer + if(stat == DEAD || QDELETED(src)) //Dead borgs log no longer //Gone return if(!modularInterface) stack_trace("Cyborg [src] ([type]) was somehow missing their integrated tablet. Please make a bug report.") diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 6ef4c9a67f27..1923df3b50eb 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -71,6 +71,7 @@ QDEL_NULL(aicamera) QDEL_NULL(builtInCamera) QDEL_NULL(aiPDA) + QDEL_NULL(laws) GLOB.silicon_mobs -= src return ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index be4807b33369..5b4d66893f5b 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -701,7 +701,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/get_next_patrol_target() // search the beacon list for the next target in the list. - for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[z]"]) + for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[virtual_z()]"]) if(NB.location == next_destination) //Does the Beacon location text match the destination? destination = new_destination //We now know the name of where we want to go. patrol_target = NB.loc //Get its location and set it as the target. @@ -709,7 +709,7 @@ Pass a positive integer as an argument to override a bot's default speed. return TRUE /mob/living/simple_animal/bot/proc/find_nearest_beacon() - for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[z]"]) + for(var/obj/machinery/navbeacon/NB in GLOB.navbeacons["[virtual_z()]"]) var/dist = get_dist(src, NB) if(nearest_beacon) //Loop though the beacon net to find the true closest beacon. //Ignore the beacon if were are located on it. diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 7697ac90f37f..02bf813396f8 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -158,8 +158,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if(istype(AM, /obj/item)) playsound(src, honksound, 50, TRUE, -1) var/obj/item/I = AM - if(I.throwforce < health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human))) - var/mob/living/carbon/human/H = I.thrownby + var/mob/thrown_by = I.thrownby?.resolve() + if(I.throwforce < health && thrown_by && (istype(thrown_by, /mob/living/carbon/human))) + var/mob/living/carbon/human/H = thrown_by retaliate(H) ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index f55d71a8590f..4629dd87c157 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -249,8 +249,9 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby)) - var/mob/living/carbon/human/H = I.thrownby + var/mob/thrown_by = I.thrownby?.resolve() + if(I.throwforce < src.health && thrown_by && ishuman(thrown_by)) + var/mob/living/carbon/human/H = thrown_by retaliate(H) ..() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 778cd3ff4910..df3cfe349808 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -42,6 +42,7 @@ var/can_repair_constructs = FALSE var/can_repair_self = FALSE var/runetype + var/datum/action/innate/cult/create_rune/our_rune var/holy = FALSE /mob/living/simple_animal/hostile/construct/Initialize() @@ -60,13 +61,17 @@ S.action.button.moved = "6:[pos],4:-2" spellnum++ if(runetype) - var/datum/action/innate/cult/create_rune/CR = new runetype(src) - CR.Grant(src) + our_rune = new runetype(src) + our_rune.Grant(src) var/pos = 2+spellnum*31 - CR.button.screen_loc = "6:[pos],4:-2" - CR.button.moved = "6:[pos],4:-2" + our_rune.button.screen_loc = "6:[pos],4:-2" + our_rune.button.moved = "6:[pos],4:-2" add_overlay("glow_[icon_state][holy]") +/mob/living/simple_animal/hostile/construct/Destroy() + QDEL_NULL(our_rune) + return ..() + /mob/living/simple_animal/hostile/construct/Login() . = ..() if(!. || !client) @@ -450,15 +455,11 @@ background_icon_state = "bg_demon" buttontooltipstyle = "cult" button_icon_state = "cult_mark" - var/mob/living/simple_animal/hostile/construct/harvester/the_construct - -/datum/action/innate/seek_prey/Grant(mob/living/C) - the_construct = C - ..() /datum/action/innate/seek_prey/Activate() if(GLOB.cult_narsie == null) return + var/mob/living/simple_animal/hostile/construct/harvester/the_construct = owner if(the_construct.seeking) desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!" button_icon_state = "cult_mark" diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 193c3fdb51fc..1916a7c52adb 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -88,7 +88,7 @@ gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/list/family = list()//var restored from savefile, has count of each child type - var/list/children = list()//Actual mob instances of children + var/list/children = list()//Actual mob weak references of children var/cats_deployed = 0 var/memory_saved = FALSE held_state = "cat" @@ -112,7 +112,7 @@ /mob/living/simple_animal/pet/cat/Runtime/make_babies() var/mob/baby = ..() if(baby) - children += baby + children += WEAKREF(baby) return baby /mob/living/simple_animal/pet/cat/Runtime/death() @@ -139,13 +139,14 @@ var/list/file_data = list() family = list() if(!dead) - for(var/mob/living/simple_animal/pet/cat/kitten/C in children) - if(istype(C,type) || C.stat || !C.z || (C.flags_1 & HOLOGRAM_1)) + for(var/datum/weakref/childRef in children) + var/mob/living/simple_animal/pet/cat/kitten/child = childRef.resolve() + if(istype(child, type) || child.stat || !child.z || (child.flags_1 & HOLOGRAM_1)) continue - if(C.type in family) - family[C.type] += 1 + if(child.type in family) + family[child.type] += 1 else - family[C.type] = 1 + family[child.type] = 1 file_data["family"] = family fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index c9695c6e1a61..c24271d9b09e 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -41,6 +41,10 @@ var/glasses_overlay_file = 'icons/mob/pets.dmi' var/obj/item/clothing/glasses/glasses = null //snek glasses +/mob/living/simple_animal/hostile/retaliate/poison/snake/Destroy() + if(glasses) + QDEL_NULL(glasses) + return ..() /mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target) . = oview(vision_range, targets_from) //get list of things in vision range diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 9d39d055b7c4..00344f48da59 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -101,7 +101,7 @@ /obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/healer/G) . = ..() - if(G.guardiancolor) + if(G?.guardiancolor) add_atom_colour(G.guardiancolor, FIXED_COLOUR_PRIORITY) /obj/structure/receiving_pad/proc/disappear() diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 8fa2ce4b516f..c87b82091597 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -92,7 +92,8 @@ return ..() else . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line - var/list/searched_for = oview(vision_range, targets_from) + var/atom/target_from = GET_TARGETS_FROM(src) + var/list/searched_for = oview(vision_range, target_from) for(var/obj/A in searched_for) . += A for(var/mob/A in searched_for) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index ec4516703253..09fdf0d763ba 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -116,12 +116,12 @@ melee_damage_lower = 5 melee_damage_upper = 10 poison_per_bite = 3 - var/atom/movable/cocoon_target + var/datum/weakref/cocoon_target_ref var/fed = 0 var/obj/effect/proc_holder/wrap/wrap var/datum/action/innate/spider/lay_eggs/lay_eggs var/datum/action/innate/spider/set_directive/set_directive - var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs + var/static/list/consumed_mobs = list() //the refs of mobs that have been consumed by nurse spiders to lay eggs gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize() @@ -137,6 +137,7 @@ RemoveAbility(wrap) QDEL_NULL(lay_eggs) QDEL_NULL(set_directive) + QDEL_NULL(wrap) return ..() //broodmothers are the queen of the spiders, can send messages to all them and web faster. That rare round where you get a queen spider and turn your 'for honor' players into 'r6siege' players will be a fun one. @@ -258,10 +259,10 @@ stop_automated_movement = FALSE walk(src,0) -/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(C) +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(mob/living/target) if(busy == MOVING_TO_TARGET) - if(cocoon_target == C && get_dist(src,cocoon_target) > 1) - cocoon_target = null + if(cocoon_target_ref == WEAKREF(target) && get_dist(src, target) > 1) + cocoon_target_ref = null busy = FALSE stop_automated_movement = FALSE @@ -272,7 +273,7 @@ //first, check for potential food nearby to cocoon for(var/mob/living/C in can_see) if(C.stat && !istype(C, /mob/living/simple_animal/hostile/poison/giant_spider) && !C.anchored) - cocoon_target = C + cocoon_target_ref = WEAKREF(C) busy = MOVING_TO_TARGET Goto(C, move_to_delay) //give up if we can't reach them after 10 seconds @@ -295,14 +296,17 @@ continue if(isitem(O) || isstructure(O) || ismachinery(O)) - cocoon_target = O + cocoon_target_ref = WEAKREF(O) busy = MOVING_TO_TARGET stop_automated_movement = 1 Goto(O, move_to_delay) //give up if we can't reach them after 10 seconds addtimer(CALLBACK(src, .proc/GiveUp, O), 10 SECONDS) - else if(busy == MOVING_TO_TARGET && cocoon_target) + else if(busy == MOVING_TO_TARGET && cocoon_target_ref) + var/mob/living/cocoon_target = cocoon_target_ref.resolve() + if(!cocoon_target) + return if(get_dist(src, cocoon_target) <= 1) cocoon() @@ -311,6 +315,7 @@ stop_automated_movement = FALSE /mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/cocoon() + var/mob/living/cocoon_target = cocoon_target_ref?.resolve() if(stat != DEAD && cocoon_target && !cocoon_target.anchored) if(cocoon_target == src) to_chat(src, "You can't wrap yourself!") @@ -333,8 +338,8 @@ var/obj/structure/spider/cocoon/C = new(cocoon_target.loc) if(isliving(cocoon_target)) var/mob/living/L = cocoon_target - if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway - consumed_mobs[L.tag] = TRUE + if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[REF(L)])) //if they're not dead, you can consume them anyway + consumed_mobs[REF(L)] = TRUE fed++ lay_eggs.UpdateButtonIcon(TRUE) visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.","You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.") @@ -395,6 +400,8 @@ action_icon = 'icons/mob/actions/actions_animal.dmi' action_icon_state = "wrap_0" action_background_icon_state = "bg_alien" + //Set this to false since we're our own action, for some reason + has_action = FALSE /obj/effect/proc_holder/wrap/Initialize() . = ..() @@ -435,7 +442,7 @@ var/atom/movable/target_atom = target if(target_atom.anchored) return - user.cocoon_target = target_atom + user.cocoon_target_ref = WEAKREF(target_atom) INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/.proc/cocoon) remove_ranged_ability() return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index 64c74b5700e7..bf0337488dcb 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -37,28 +37,34 @@ var/message_cooldown = 0 var/list/nummies = list() var/choking = FALSE + var/moved /mob/living/simple_animal/hostile/retaliate/goose/Initialize() . = ..() RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/goosement) +/mob/living/simple_animal/hostile/retaliate/goose/Destroy() + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + return ..() + /mob/living/simple_animal/hostile/retaliate/goose/proc/goosement(atom/movable/AM, OldLoc, Dir, Forced) if(stat == DEAD) return - nummies.Cut() - nummies += loc.contents + moved = TRUE if(prob(5) && random_retaliate) Retaliate() /mob/living/simple_animal/hostile/retaliate/goose/handle_automated_action() - if(length(nummies)) + if(moved && length(loc?.contents)) + moved = FALSE var/obj/item/E = locate() in nummies if(E && E.loc == loc) feed(E) nummies -= E /mob/living/simple_animal/hostile/retaliate/goose/vomit/handle_automated_action() - if(length(nummies)) + if(moved && length(loc?.contents)) + var/list/nummies = loc.contents var/obj/item/E = pick(nummies) if(!(E.custom_materials && E.custom_materials[SSmaterials.GetMaterialRef(/datum/material/plastic)])) nummies -= E // remove non-plastic item from queue @@ -106,7 +112,6 @@ deadchat_plays_goose() /mob/living/simple_animal/hostile/retaliate/goose/vomit/Destroy() - UnregisterSignal(src, COMSIG_MOVABLE_MOVED) QDEL_NULL(goosevomit) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index e012268a5e42..106c9ad54f60 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -47,8 +47,9 @@ var/stat_attack = CONSCIOUS var/stat_exclusive = FALSE //Mobs with this set to TRUE will exclusively attack things defined by stat_attack, stat_attack DEAD means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction - //Use set_targets_from to modify this var - var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such + //Use GET_TARGETS_FROM(mob) to access this + //Attempting to call GET_TARGETS_FROM(mob) when this var is null will just return mob as a base + var/datum/weakref/targets_from //all range/attack/etc. calculations should be done from the atom this weakrefs, useful for Vehicles and such. var/attack_all_objects = FALSE //if true, equivalent to having a wanted_objects list containing ALL objects. var/lose_patience_timer_id //id for a timer to call LoseTarget(), used to stop mobs fixating on a target they can't reach @@ -69,16 +70,12 @@ /mob/living/simple_animal/hostile/Initialize() . = ..() - - if(!targets_from) - set_targets_from(src) wanted_objects = typecacheof(wanted_objects) - /mob/living/simple_animal/hostile/Destroy() - set_targets_from(null) //We can't use losetarget here because fucking cursed blobs override it to do nothing the motherfuckers GiveTarget(null) + walk(src, 0) return ..() /mob/living/simple_animal/hostile/Life() @@ -96,7 +93,8 @@ EscapeConfinement() if(AICanContinue(possible_targets)) - if(!QDELETED(target) && !targets_from.Adjacent(target)) + var/atom/target_from = GET_TARGETS_FROM(src) + if(!QDELETED(target) && !target_from.Adjacent(target)) DestroyPathToTarget() if(!MoveToTarget(possible_targets)) //if we lose our target if(AIShouldSleep(possible_targets)) // we try to acquire a new one @@ -146,15 +144,19 @@ //////////////HOSTILE MOB TARGETTING AND AGGRESSION//////////// /mob/living/simple_animal/hostile/proc/ListTargets() //Step 1, find out what we can see + var/atom/target_from = GET_TARGETS_FROM(src) if(!search_objects) - . = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide + . = hearers(vision_range, target_from) - src //Remove self, so we don't suicide var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha)) . += typecache_filter_list(view(vision_range, targets_from), hostile_machines) + for(var/HM in typecache_filter_list(range(vision_range, target_from), hostile_machines)) + if(can_see(target_from, HM, vision_range)) + . += HM else - . = oview(vision_range, targets_from) + . = oview(vision_range, target_from) /mob/living/simple_animal/hostile/proc/FindTarget(list/possible_targets, HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about . = list() @@ -188,10 +190,11 @@ /mob/living/simple_animal/hostile/proc/PickTarget(list/Targets)//Step 3, pick amongst the possible, attackable targets if(target != null)//If we already have a target, but are told to pick again, calculate the lowest distance between all possible, and pick from the lowest distance targets + var/atom/target_from = GET_TARGETS_FROM(src) for(var/pos_targ in Targets) var/atom/A = pos_targ - var/target_dist = get_dist(targets_from, target) - var/possible_target_distance = get_dist(targets_from, A) + var/target_dist = get_dist(target_from, target) + var/possible_target_distance = get_dist(target_from, A) if(target_dist < possible_target_distance) Targets -= A if(!Targets.len)//We didnt find nothin! @@ -270,7 +273,8 @@ GainPatience() /mob/living/simple_animal/hostile/proc/CheckAndAttack() - if(target && targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && !incapacitated()) + var/atom/target_from = GET_TARGETS_FROM(src) + if(target && isturf(target_from.loc) && target.Adjacent(target_from) && !incapacitated()) AttackingTarget() /mob/living/simple_animal/hostile/proc/MoveToTarget(list/possible_targets)//Step 5, handle movement between us and our target @@ -278,14 +282,15 @@ if(!target || !CanAttack(target)) LoseTarget() return 0 + var/atom/target_from = GET_TARGETS_FROM(src) if(target in possible_targets) var/turf/T = get_turf(src) if(target.virtual_z() != T.virtual_z()) LoseTarget() return 0 - var/target_distance = get_dist(targets_from,target) + var/target_distance = get_dist(target_from,target) if(ranged) //We ranged? Shoot at em - if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown + if(!target.Adjacent(target_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown OpenFire(target) if(charger && (target_distance > minimum_distance) && (target_distance <= charge_distance))//Attempt to close the distance with a charge. enter_charge(target) @@ -301,7 +306,7 @@ else Goto(target,move_to_delay,minimum_distance) if(target) - if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from)) //If they're next to us, attack + if(isturf(target_from.loc) && target.Adjacent(target_from)) //If they're next to us, attack MeleeAction() else if(rapid_melee > 1 && target_distance <= melee_queue_distance) @@ -310,7 +315,7 @@ return 1 return 0 if(environment_smash) - if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still + if(target.loc != null && get_dist(target_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them! OpenFire(target) if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target @@ -345,6 +350,9 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget() SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target) + //Target can be removed by the signal's effects + if(QDELETED(target)) + return in_melee = TRUE return target.attack_animal(src) @@ -376,7 +384,8 @@ /mob/living/simple_animal/hostile/proc/summon_backup(distance, exact_faction_match) do_alert_animation(src) playsound(loc, 'sound/machines/chime.ogg', 50, TRUE, -1) - for(var/mob/living/simple_animal/hostile/M in oview(distance, targets_from)) + var/atom/target_from = GET_TARGETS_FROM(src) + for(var/mob/living/simple_animal/hostile/M in oview(distance, target_from)) if(faction_check_mob(M, TRUE)) if(M.AIStatus == AI_OFF) return @@ -408,9 +417,10 @@ /mob/living/simple_animal/hostile/proc/Shoot(atom/targeted_atom) - if(QDELETED(targeted_atom) || targeted_atom == targets_from.loc || targeted_atom == targets_from) + var/atom/target_from = GET_TARGETS_FROM(src) + if(QDELETED(targeted_atom) || targeted_atom == target_from.loc || targeted_atom == target_from) return - var/turf/startloc = get_turf(targets_from) + var/turf/startloc = get_turf(target_from) if(casingtype) var/obj/item/ammo_casing/casing = new casingtype(startloc) playsound(src, projectilesound, 100, TRUE) @@ -424,7 +434,7 @@ P.yo = targeted_atom.y - startloc.y P.xo = targeted_atom.x - startloc.x if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space - newtonian_move(get_dir(targeted_atom, targets_from)) + newtonian_move(get_dir(targeted_atom, target_from)) P.original = targeted_atom P.preparePixelProjectile(targeted_atom, src) P.fire() @@ -452,15 +462,16 @@ dodging = TRUE /mob/living/simple_animal/hostile/proc/DestroyObjectsInDirection(direction) - var/turf/T = get_step(targets_from, direction) + var/atom/target_from = GET_TARGETS_FROM(src) + var/turf/T = get_step(target_from, direction) if(QDELETED(T)) return - if(T.Adjacent(targets_from)) + if(T.Adjacent(target_from)) if(CanSmashTurfs(T)) T.attack_animal(src) return for(var/obj/O in T.contents) - if(!O.Adjacent(targets_from)) + if(!O.Adjacent(target_from)) continue if((ismachinery(O) || isstructure(O)) && O.density && environment_smash >= ENVIRONMENT_SMASH_STRUCTURES && !O.IsObscured()) O.attack_animal(src) @@ -469,7 +480,8 @@ /mob/living/simple_animal/hostile/proc/DestroyPathToTarget() if(environment_smash) EscapeConfinement() - var/dir_to_target = get_dir(targets_from, target) + var/atom/target_from = GET_TARGETS_FROM(src) + var/dir_to_target = get_dir(target_from, target) var/dir_list = list() if(ISDIAGONALDIR(dir_to_target)) //it's diagonal, so we need two directions to hit for(var/direction in GLOB.cardinals) @@ -489,18 +501,19 @@ /mob/living/simple_animal/hostile/proc/EscapeConfinement() + var/atom/target_from = GET_TARGETS_FROM(src) if(buckled) buckled.attack_animal(src) - if(!isturf(targets_from.loc) && targets_from.loc != null)//Did someone put us in something? - var/atom/A = targets_from.loc + if(!isturf(target_from.loc) && target_from.loc != null)//Did someone put us in something? + var/atom/A = target_from.loc A.attack_animal(src)//Bang on it till we get out - /mob/living/simple_animal/hostile/proc/FindHidden() if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper)) var/atom/A = target.loc + var/atom/target_from = GET_TARGETS_FROM(src) Goto(A,move_to_delay,minimum_distance) - if(A.Adjacent(targets_from)) + if(A.Adjacent(target_from)) A.attack_animal(src) return 1 @@ -646,24 +659,19 @@ Stun((knockdown_time * 2), ignore_canstun = TRUE) charge_end() else if(hit_atom.density && !hit_atom.CanPass(src, get_dir(hit_atom, src))) - visible_message(("[src] smashes into [hit_atom]!")) + visible_message(span_danger("[src] smashes into [hit_atom]!")) Stun((knockdown_time * 2), ignore_canstun = TRUE) if(charge_state) charge_state = FALSE update_icons() -/mob/living/simple_animal/hostile/proc/set_targets_from(atom/target_from) - if(targets_from) - UnregisterSignal(targets_from, COMSIG_PARENT_QDELETING) - targets_from = target_from - if(targets_from) - RegisterSignal(targets_from, COMSIG_PARENT_QDELETING, .proc/handle_targets_from_del) - -/mob/living/simple_animal/hostile/proc/handle_targets_from_del(datum/source) - SIGNAL_HANDLER - if(targets_from != src) - set_targets_from(src) +/mob/living/simple_animal/hostile/proc/get_targets_from() + var/atom/target_from = targets_from.resolve() + if(!target_from) + targets_from = null + return src + return target_from /mob/living/simple_animal/hostile/proc/handle_target_del(datum/source) SIGNAL_HANDLER diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 0df00f99c1c7..06b2924033d9 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -34,11 +34,11 @@ footstep_type = FOOTSTEP_MOB_BAREFOOT -/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/O) +/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(istype(O, /mob/living/simple_animal/hostile/jungle/mook)) - var/mob/living/simple_animal/hostile/jungle/mook/M = O - if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing) + if(istype(mover, /mob/living/simple_animal/hostile/jungle/mook)) + var/mob/living/simple_animal/hostile/jungle/mook/mook_moover = mover + if(mook_moover.attack_state == MOOK_ATTACK_ACTIVE && mook_moover.throwing) return TRUE /mob/living/simple_animal/hostile/jungle/mook/death() @@ -93,9 +93,10 @@ melee_damage_lower = 15 melee_damage_upper = 15 var/mob_direction = get_dir(src,target) + var/atom/target_from = GET_TARGETS_FROM(src) if(get_dist(src,target) > 1) step(src,mob_direction) - if(targets_from && isturf(targets_from.loc) && target.Adjacent(targets_from) && isliving(target)) + if(isturf(target_from.loc) && target.Adjacent(target_from) && isliving(target)) var/mob/living/L = target L.attack_animal(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index aa86ccfd4d06..a4678a69799a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -73,7 +73,7 @@ Featuring: return 0 LoseTarget() //Target was our mecha, so null it out M.aimob_enter_mech(src) - set_targets_from(M) + targets_from = WEAKREF(M) allow_movement_on_non_turfs = TRUE //duh var/do_ranged = 0 for(var/equip in mecha.equipment) @@ -99,7 +99,7 @@ Featuring: mecha.aimob_exit_mech(src) allow_movement_on_non_turfs = FALSE - set_targets_from(src) + targets_from = null //Find a new mecha wanted_objects = typecacheof(/obj/mecha/combat, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 27bdf0b3dd3e..fd810a352380 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -423,7 +423,7 @@ Difficulty: Hard severity = EXPLODE_LIGHT // puny mortals return ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/megafauna/bubblegum/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination)) return TRUE @@ -525,7 +525,7 @@ Difficulty: Hard new /obj/effect/decal/cleanable/blood(get_turf(src)) . = ..() -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) // hallucinations should not be stopping bubblegum or eachother return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index e25165cbbdfe..4ded55413f8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -270,10 +270,9 @@ Difficulty: Very Hard else SSexplosions.medturf += target - - +//There can only ever be one blackbox, and we want to know if there already is one when we spawn +GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) //Black Box - /obj/machinery/smartfridge/black_box name = "black box" desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it." @@ -302,11 +301,9 @@ Difficulty: Very Hard /obj/machinery/smartfridge/black_box/Initialize() . = ..() - var/static/obj/machinery/smartfridge/black_box/current - if(current && current != src) - qdel(src, force=TRUE) - return - current = src + if(GLOB.blackbox != src) + return INITIALIZE_HINT_QDEL_FORCE + GLOB.blackbox = src ReadMemory() /obj/machinery/smartfridge/black_box/process() @@ -351,6 +348,8 @@ Difficulty: Very Hard /obj/machinery/smartfridge/black_box/Destroy(force = FALSE) if(force) + if(GLOB.blackbox == src) + GLOB.blackbox = null for(var/thing in src) qdel(thing) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c22d5dcd9dc9..1da36f8787d5 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -85,7 +85,6 @@ Difficulty: Hard var/did_reset = TRUE //if we timed out, returned to our beacon, and healed some var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...", "Kix fiex. Liepmrk...") var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.") - var/list/stored_nearby = list() // stores people nearby the hierophant when it enters the death animation /mob/living/simple_animal/hostile/megafauna/hierophant/Initialize() . = ..() @@ -411,6 +410,7 @@ Difficulty: Hard blinking = TRUE //we do a fancy animation, release a huge burst(), and leave our staff. visible_message("\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\"") visible_message("[src] shrinks, releasing a massive burst of energy!") + var/list/stored_nearby = list() for(var/mob/living/L in view(7,src)) stored_nearby += L // store the people to grant the achievements to once we die hierophant_burst(null, get_turf(src), 10) @@ -535,7 +535,7 @@ Difficulty: Hard QUEUE_SMOOTH_NEIGHBORS(src) return ..() -/obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, turf/target) +/obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(QDELETED(caster)) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index b487f38d002d..42836c58cf6b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -138,6 +138,8 @@ Difficulty: Hard /// Slams the ground around the wendigo throwing back enemies caught nearby /mob/living/simple_animal/hostile/megafauna/wendigo/proc/ground_slam(range, delay) var/turf/orgin = get_turf(src) + if(!orgin) + return var/list/all_turfs = RANGE_TURFS(range, orgin) for(var/i = 0 to range) for(var/turf/T in all_turfs) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index c9391c4cab28..ca595d4d682f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -315,7 +315,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca AM.forceMove(C) return ..() -/mob/living/simple_animal/hostile/mimic/xenobio/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/mimic/xenobio/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(istype(mover, /obj/structure/closet)) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index ce83232c3430..4376e9e0ae21 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -69,7 +69,8 @@ /mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) if(..()) //we have a target - if(isliving(target) && !target.Adjacent(targets_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams + var/atom/target_from = GET_TARGETS_FROM(src) + if(isliving(target) && !target.Adjacent(target_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams OpenFire(target) /mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index b24f055d3bb9..11cdc80c97cc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -56,7 +56,8 @@ /mob/living/simple_animal/hostile/asteroid/curseblob/proc/check_for_target() if(QDELETED(set_target) || set_target.stat != CONSCIOUS || z != set_target.z) - qdel(src) + if(!QDELETED(src)) + qdel(src) return TRUE /mob/living/simple_animal/hostile/asteroid/curseblob/GiveTarget(new_target) @@ -71,7 +72,7 @@ return //if it's not our target, we ignore it -/mob/living/simple_animal/hostile/asteroid/curseblob/CanAllowThrough(atom/movable/mover, turf/target) +/mob/living/simple_animal/hostile/asteroid/curseblob/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover == set_target) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 5bbe307790f2..33bd3e6ba0f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -68,19 +68,18 @@ While using this makes the system rely on OnFire, it still gives options for tim icon_icon = 'icons/mob/actions/actions_elites.dmi' button_icon_state = "" background_icon_state = "bg_default" - var/mob/living/simple_animal/hostile/asteroid/elite/M var/chosen_message var/chosen_attack_num = 0 /datum/action/innate/elite_attack/Grant(mob/living/L) - if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) - M = L - return ..() - return FALSE + if(!istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) + return FALSE + return ..() /datum/action/innate/elite_attack/Activate() - M.chosen_attack = chosen_attack_num - to_chat(M, chosen_message) + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + elite_owner.chosen_attack = chosen_attack_num + to_chat(elite_owner, chosen_message) //The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. @@ -327,7 +326,7 @@ While using this makes the system rely on OnFire, it still gives options for tim ourelite = null return ..() -/obj/effect/temp_visual/elite_tumor_wall/CanAllowThrough(atom/movable/mover, turf/target) +/obj/effect/temp_visual/elite_tumor_wall/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover == ourelite || mover == activator) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 28e8bc82ef71..91fdf286aae7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -53,6 +53,10 @@ var/rand_tent = 0 var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() +/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Destroy() + children_list.Cut() + return ..() + /datum/action/innate/elite_attack/tentacle_patch name = "Tentacle Patch" button_icon_state = "tentacle_patch" @@ -128,11 +132,10 @@ for(var/i in 1 to 2) if(children_list.len >= 8) return - var/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/newchild = new /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child(loc) + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/newchild = new /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child(loc, src) newchild.GiveTarget(target) newchild.faction = faction.Copy() visible_message("[newchild] appears below [src]!") - newchild.mother = src children_list += newchild /mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/rage() @@ -186,7 +189,17 @@ guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) deathmessage = "falls to the ground." status_flags = CANPUSH - var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = null + var/datum/weakref/mother_ref + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/Initialize(mapload, mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother) + . = ..() + mother_ref = WEAKREF(mother) + +/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/Destroy() + var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = mother_ref?.resolve() + if(mother) + mother.children_list -= src + return ..() /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/OpenFire(target) ranged_cooldown = world.time + 40 @@ -199,8 +212,6 @@ /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/death() . = ..() - if(mother != null) - mother.children_list -= src visible_message("[src] explodes!") explosion(get_turf(loc),0,0,0,flame_range = 3, adminlog = FALSE) gib() diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 3d85af5dc84c..8c1e47926935 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -39,6 +39,13 @@ riot.Grant(src) INVOKE_ASYNC(src, .proc/get_player) +/mob/living/simple_animal/hostile/regalrat/Destroy() + coffer.Remove(src) + riot.Remove(src) + QDEL_NULL(coffer) + QDEL_NULL(riot) + return ..() + /mob/living/simple_animal/hostile/regalrat/proc/get_player() var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Royal Rat, cheesey be his crown?", ROLE_SENTIENCE, null, FALSE, 100, POLL_IGNORE_SENTIENCE_POTION) if(LAZYLEN(candidates) && !mind) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 63a796a80954..0eb4232e65fd 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -7,7 +7,7 @@ if(!L.stat) return L else - enemies -= L + remove_enemy(L) else if(ismecha(A)) var/obj/mecha/M = A if(M.occupant) @@ -29,19 +29,37 @@ if(isliving(A)) var/mob/living/M = A if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) - enemies |= M + add_enemy(M) else if(ismecha(A)) var/obj/mecha/M = A if(M.occupant) - enemies |= M - enemies |= M.occupant + add_enemy(M) + add_enemy(M.occupant) for(var/mob/living/simple_animal/hostile/retaliate/H in around) if(faction_check_mob(H) && !attack_same && !H.attack_same) - H.enemies |= enemies - return 0 + H.add_enemies(enemies) /mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(. > 0 && stat == CONSCIOUS) Retaliate() + +/mob/living/simple_animal/hostile/retaliate/proc/add_enemy(new_enemy) + RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) + enemies |= new_enemy + +/mob/living/simple_animal/hostile/retaliate/proc/add_enemies(new_enemies) + for(var/new_enemy in new_enemies) + RegisterSignal(new_enemy, COMSIG_PARENT_QDELETING, .proc/remove_enemy, override = TRUE) + enemies |= new_enemy + +/mob/living/simple_animal/hostile/retaliate/proc/clear_enemies() + for(var/enemy in enemies) + UnregisterSignal(enemy, COMSIG_PARENT_QDELETING) + enemies.Cut() + +/mob/living/simple_animal/hostile/retaliate/proc/remove_enemy(datum/enemy_to_remove) + SIGNAL_HANDLER + UnregisterSignal(enemy_to_remove, COMSIG_PARENT_QDELETING) + enemies -= enemy_to_remove diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 020b160bbed9..e518955d91af 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -19,6 +19,8 @@ smoothing_flags = NONE /// The amount of time it takes to create a venus human trap. var/growth_time = 120 SECONDS + /// The current vines + var/list/vines = list() /obj/structure/alien/resin/flower_bud_enemy/Initialize() . = ..() @@ -29,9 +31,13 @@ anchors += locate(x+2,y-2,z) for(var/turf/T in anchors) - Beam(T, "vine", maxdistance=5, beam_type=/obj/effect/ebeam/vine) + vines += Beam(T, "vine", maxdistance=5, beam_type=/obj/effect/ebeam/vine) addtimer(CALLBACK(src, .proc/bear_fruit), growth_time) +/obj/structure/alien/resin/flower_bud_enemy/Destroy() + QDEL_LIST(vines) + return ..() + /** * Spawns a venus human trap, then qdels itself. * @@ -47,10 +53,10 @@ mouse_opacity = MOUSE_OPACITY_ICON desc = "A thick vine, painful to the touch." -/obj/effect/ebeam/vine/Initialize() +/obj/effect/ebeam/vine/Initialize(mapload) . = ..() var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered, + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) @@ -60,7 +66,7 @@ var/mob/living/L = AM if(!isvineimmune(L)) L.adjustBruteLoss(5) - to_chat(L, "You cut yourself on the thorny vines.") + to_chat(L, span_alert("You cut yourself on the thorny vines.")) /** * Venus Human Trap @@ -145,6 +151,7 @@ /mob/living/simple_animal/hostile/venus_human_trap/Destroy() for(var/datum/beam/vine as anything in vines) qdel(vine) // reference is automatically deleted by remove_vine + vines.Cut() return ..() /** @@ -191,5 +198,8 @@ * Arguments: * * datum/beam/vine - The vine to be removed from the list. */ -/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine, force) +/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine) + SIGNAL_HANDLER + + UnregisterSignal(vine, COMSIG_PARENT_QDELETING) vines -= vine diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d506eee8ad4b..d63c300e8ba6 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -70,7 +70,6 @@ var/parrot_state = PARROT_WANDER //Hunt for a perch when created var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down - var/parrot_dam_zone = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) //For humans, select a bodypart to attack var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower. var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving @@ -81,7 +80,7 @@ var/speech_shuffle_rate = 20 var/list/available_channels = list() - //Headset for Poly to yell at engineers :) + //Headset for Polly to yell at engineers :) var/obj/item/radio/headset/ears = null //The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from, @@ -123,6 +122,18 @@ /mob/living/simple_animal/parrot/proc/perch_mob_player)) +/mob/living/simple_animal/parrot/Destroy() + walk(src, 0) + if(ears) + QDEL_NULL(ears) + if(held_item) + QDEL_NULL(held_item) + + set_perch(null) + set_interest(null) + + return ..() + /mob/living/simple_animal/parrot/examine(mob/user) . = ..() if(stat) @@ -276,18 +287,18 @@ * Attack responces */ //Humans, monkeys, aliens -/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/M) +/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/attacker) ..() if(client) return - if(!stat && M.a_intent == INTENT_HARM) + if(!stat && attacker.a_intent == INTENT_HARM) icon_state = icon_living //It is going to be flying regardless of whether it flees or attacks if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - parrot_interest = M + set_interest(attacker) parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. if(health > 30) //Let's get in there and squawk it up! @@ -295,18 +306,18 @@ else parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! drop_held_item(0) - if(stat != DEAD && M.a_intent == INTENT_HELP) + if(stat != DEAD && attacker.a_intent == INTENT_HELP) handle_automated_speech(1) //assured speak/emote return -/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M) - return attack_hand(M) +/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/attacker) + return attack_hand(attacker) -/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/M) - return attack_hand(M) +/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/attacker) + return attack_hand(attacker) //Simple animals -/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M) +/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/attacker) . = ..() //goodbye immortal parrots if(client) @@ -315,8 +326,8 @@ if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - if(M.melee_damage_upper > 0 && !stat) - parrot_interest = M + if(attacker.melee_damage_upper > 0 && !stat) + set_interest(attacker) parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless icon_state = icon_living @@ -335,7 +346,7 @@ parrot_state |= PARROT_FLEE icon_state = icon_living drop_held_item(0) - else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Poly wants a cracker. + else if(istype(O, /obj/item/reagent_containers/food/snacks/cracker)) //Polly wants a cracker. qdel(O) if(health < maxHealth) adjustBruteLoss(-10) @@ -352,7 +363,7 @@ if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - parrot_interest = null + set_interest(null) parrot_state = PARROT_WANDER | PARROT_FLEE //Been shot and survived! RUN LIKE HELL! //parrot_been_shot += 5 icon_state = icon_living @@ -444,7 +455,7 @@ speak = newspeak //Search for item to steal - parrot_interest = search_for_item() + set_interest(search_for_item()) if(parrot_interest) manual_emote("looks in [parrot_interest]'s direction and takes flight.") parrot_state = PARROT_SWOOP | PARROT_STEAL @@ -455,7 +466,7 @@ else if(parrot_state == PARROT_WANDER) //Stop movement, we'll set it later walk(src, 0) - parrot_interest = null + set_interest(null) //Wander around aimlessly. This will help keep the loops from searches down //and possibly move the mob into a new are in view of something they can use @@ -464,15 +475,15 @@ return if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do. - var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item - if(AM) - if(istype(AM, /obj/item) || isliving(AM)) //If stealable item - parrot_interest = AM + var/atom/movable/potential_perch = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item + if(potential_perch) + if(istype(potential_perch, /obj/item) || isliving(potential_perch)) //If stealable item + set_interest(potential_perch) manual_emote("turns and flies towards [parrot_interest].") parrot_state = PARROT_SWOOP | PARROT_STEAL return else //Else it's a perch - parrot_perch = AM + set_perch(potential_perch) parrot_state = PARROT_SWOOP | PARROT_RETURN return return @@ -512,7 +523,7 @@ parrot_interest.forceMove(src) visible_message("[src] grabs [held_item]!", "You grab [held_item]!", "You hear the sounds of wings flapping furiously.") - parrot_interest = null + set_interest(null) parrot_state = PARROT_SWOOP | PARROT_RETURN return @@ -526,7 +537,7 @@ else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) walk(src, 0) if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isnt inside of something else. - parrot_perch = null + set_perch(null) parrot_state = PARROT_WANDER return @@ -560,7 +571,7 @@ //If we're attacking a nothing, an object, a turf or a ghost for some stupid reason, switch to wander if(!parrot_interest || !isliving(parrot_interest)) - parrot_interest = null + set_interest(null) parrot_state = PARROT_WANDER return @@ -574,7 +585,7 @@ //If the mob we've been chasing/attacking dies or falls into crit, check for loot! if(L.stat) - parrot_interest = null + set_interest(null) if(!held_item) held_item = steal_from_ground() if(!held_item) @@ -598,8 +609,8 @@ //-----STATE MISHAP else //This should not happen. If it does lets reset everything and try again walk(src,0) - parrot_interest = null - parrot_perch = null + set_interest(null) + set_perch(null) drop_held_item() parrot_state = PARROT_WANDER return @@ -872,13 +883,29 @@ to_chat(src, "You will now [a_intent] others.") return +/mob/living/simple_animal/parrot/proc/set_interest(atom/movable/new_interest) + if(parrot_interest) + UnregisterSignal(parrot_interest, COMSIG_PARENT_QDELETING) + parrot_interest = null + if(new_interest) + parrot_interest = new_interest + RegisterSignal(parrot_interest, COMSIG_PARENT_QDELETING, PROC_REF(set_interest)) + +/mob/living/simple_animal/parrot/proc/set_perch(obj/new_perch) + if(parrot_perch) + UnregisterSignal(parrot_perch, COMSIG_PARENT_QDELETING) + parrot_perch = null + if(new_perch) + parrot_perch = new_perch + RegisterSignal(parrot_perch, COMSIG_PARENT_QDELETING, PROC_REF(set_perch)) + /* * Sub-types */ -/mob/living/simple_animal/parrot/Poly - name = "Poly" - desc = "Poly the Parrot. An expert on quantum cracker theory." - speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") +/mob/living/simple_animal/parrot/Polly + name = "Polly" + desc = "Polly the Parrot. An expert on quantum cracker theory." + speak = list("Polly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") gold_core_spawnable = NO_SPAWN speak_chance = 3 var/memory_saved = FALSE @@ -886,7 +913,7 @@ var/longest_survival = 0 var/longest_deathstreak = 0 -/mob/living/simple_animal/parrot/Poly/Initialize() +/mob/living/simple_animal/parrot/Polly/Initialize() ears = new /obj/item/radio/headset/headset_eng(src) available_channels = list(":e") Read_Memory() @@ -907,33 +934,33 @@ . = ..() -/mob/living/simple_animal/parrot/Poly/Life() +/mob/living/simple_animal/parrot/Polly/Life() if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) Write_Memory(FALSE) memory_saved = TRUE ..() -/mob/living/simple_animal/parrot/Poly/death(gibbed) +/mob/living/simple_animal/parrot/Polly/death(gibbed) if(!memory_saved) Write_Memory(TRUE) if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) - var/mob/living/simple_animal/parrot/Poly/ghost/G = new(loc) + var/mob/living/simple_animal/parrot/Polly/ghost/G = new(loc) if(mind) mind.transfer_to(G) else G.key = key ..(gibbed) -/mob/living/simple_animal/parrot/Poly/proc/Read_Memory() - if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/Poly.sav") +/mob/living/simple_animal/parrot/Polly/proc/Read_Memory() + if(fexists("data/npc_saves/Polly.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/Polly.sav") S["phrases"] >> speech_buffer S["roundssurvived"] >> rounds_survived S["longestsurvival"] >> longest_survival S["longestdeathstreak"] >> longest_deathstreak - fdel("data/npc_saves/Poly.sav") + fdel("data/npc_saves/Polly.sav") else - var/json_file = file("data/npc_saves/Poly.json") + var/json_file = file("data/npc_saves/Polly.json") if(!fexists(json_file)) return var/list/json = json_decode(file2text(json_file)) @@ -944,8 +971,8 @@ if(!islist(speech_buffer)) speech_buffer = list() -/mob/living/simple_animal/parrot/Poly/proc/Write_Memory(dead) - var/json_file = file("data/npc_saves/Poly.json") +/mob/living/simple_animal/parrot/Polly/proc/Write_Memory(dead) + var/json_file = file("data/npc_saves/Polly.json") var/list/file_data = list() if(islist(speech_buffer)) file_data["phrases"] = speech_buffer @@ -966,8 +993,8 @@ fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) -/mob/living/simple_animal/parrot/Poly/ghost - name = "The Ghost of Poly" +/mob/living/simple_animal/parrot/Polly/ghost + name = "The Ghost of Polly" desc = "Doomed to squawk the Earth." color = "#FFFFFF77" speak_chance = 20 @@ -975,16 +1002,16 @@ incorporeal_move = INCORPOREAL_MOVE_BASIC butcher_results = list(/obj/item/ectoplasm = 1) -/mob/living/simple_animal/parrot/Poly/ghost/Initialize() +/mob/living/simple_animal/parrot/Polly/ghost/Initialize() memory_saved = TRUE //At this point nothing is saved . = ..() -/mob/living/simple_animal/parrot/Poly/ghost/handle_automated_speech() +/mob/living/simple_animal/parrot/Polly/ghost/handle_automated_speech() if(ismob(loc)) return ..() -/mob/living/simple_animal/parrot/Poly/ghost/handle_automated_movement() +/mob/living/simple_animal/parrot/Polly/ghost/handle_automated_movement() if(isliving(parrot_interest)) if(!ishuman(parrot_interest)) parrot_interest = null @@ -993,7 +1020,7 @@ Possess(parrot_interest) ..() -/mob/living/simple_animal/parrot/Poly/ghost/proc/Possess(mob/living/carbon/human/H) +/mob/living/simple_animal/parrot/Polly/ghost/proc/Possess(mob/living/carbon/human/H) if(!ishuman(H)) return var/datum/disease/parrot_possession/P = new diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 00e64d63c6ed..c21a2a6f365d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -168,6 +168,9 @@ nest.spawned_mobs -= src nest = null + if(access_card) + QDEL_NULL(access_card) + return ..() /mob/living/simple_animal/attackby(obj/item/O, mob/user, params) @@ -623,7 +626,14 @@ if(AIStatus == togglestatus) return + GLOB.simple_animals[AIStatus] -= src + GLOB.simple_animals[togglestatus] += list(src) + AIStatus = togglestatus + var/virt_z = "[virtual_z()]" + if(!virt_z) + return + switch(togglestatus) if(AI_Z_OFF) LAZYADDASSOC(SSidlenpcpool.idle_mobs_by_virtual_level, virt_z, src) @@ -631,16 +641,14 @@ else LAZYREMOVEASSOC(SSidlenpcpool.idle_mobs_by_virtual_level, virt_z, src) - GLOB.simple_animals[AIStatus] -= src - GLOB.simple_animals[togglestatus] += list(src) - AIStatus = togglestatus - /mob/living/simple_animal/proc/check_should_sleep() if (pulledby || shouldwakeup) toggle_ai(AI_ON) return var/virt_z = "[virtual_z()]" + if(!virt_z) + return var/players_on_virtual_z = LAZYACCESS(SSmobs.players_by_virtual_z, virt_z) if(!length(players_on_virtual_z)) toggle_ai(AI_Z_OFF) @@ -655,5 +663,8 @@ /mob/living/simple_animal/on_virtual_z_change(new_virtual_z, previous_virtual_z) . = ..() + if(previous_virtual_z) + LAZYREMOVEASSOC(SSidlenpcpool.idle_mobs_by_virtual_level, "[previous_virtual_z]", src) toggle_ai(initial(AIStatus)) - check_should_sleep() + if(new_virtual_z) + check_should_sleep() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 777144a068cf..5260c76e8a01 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -54,13 +54,13 @@ break if(Target.health <= -70 || Target.stat == DEAD) - Target = null + set_target(null) AIproc = 0 break if(Target) if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) - Target = null + set_target(null) AIproc = 0 break if(!AIproc) @@ -98,7 +98,7 @@ // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them step_to(src, Target) else - Target = null + set_target(null) AIproc = 0 break @@ -174,12 +174,10 @@ if(M.stat == DEAD) // our victim died if(!client) if(!rabid && !attacked) - if(M.LAssailant && M.LAssailant != M) + var/mob/last_to_hurt = M.LAssailant?.resolve() + if(last_to_hurt && last_to_hurt != M) if(prob(50)) - if(!(M.LAssailant in Friends)) - Friends[M.LAssailant] = 1 - else - ++Friends[M.LAssailant] + add_friendship(last_to_hurt, 1) else to_chat(src, "This subject does not have a strong enough life energy anymore...") @@ -290,7 +288,7 @@ --target_patience if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention target_patience = 0 - Target = null + set_target(null) if(AIproc && SStun > world.time) return @@ -305,7 +303,7 @@ if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends if(Friends.len > 0 && prob(1)) var/mob/nofriend = pick(Friends) - --Friends[nofriend] + add_friendship(nofriend, -1) if(!Target) if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to @@ -339,16 +337,16 @@ if(targets.len > 0) if(attacked || rabid || hungry == 2) - Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care + set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care else for(var/mob/living/carbon/C in targets) if(!Discipline && prob(5)) if(ishuman(C) || isalienadult(C)) - Target = C + set_target(C) break if(islarva(C) || ismonkey(C)) - Target = C + set_target(C) break if (Target) @@ -422,13 +420,13 @@ if (Leader == who) // Already following him to_say = pick("Yes...", "Lead...", "Follow...") else if (Friends[who] > Friends[Leader]) // VIVA - Leader = who + set_leader(who) to_say = "Yes... I follow [who]..." else to_say = "No... I follow [Leader]..." else if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) - Leader = who + set_leader(who) to_say = "I follow..." else // Not friendly enough to_say = pick("No...", "I no follow...") @@ -436,27 +434,27 @@ if (buckled) // We are asked to stop feeding if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) Feedstop() - Target = null + set_target(null) if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) - --Friends[who] + add_friendship(who, -1) to_say = "Grrr..." // I'm angry but I do it else to_say = "Fine..." else if (Target) // We are asked to stop chasing if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) - Target = null + set_target(null) if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) - --Friends[who] + add_friendship(who, -1) to_say = "Grrr..." // I'm angry but I do it else to_say = "Fine..." else if (Leader) // We are asked to stop following if (Leader == who) to_say = "Yes... I stay..." - Leader = null + set_leader(null) else if (Friends[who] > Friends[Leader]) - Leader = null + set_leader(null) to_say = "Yes... I stop..." else to_say = "No... keep follow..." @@ -478,7 +476,7 @@ to_say = "No... won't stay..." else if (findtext(phrase, "attack")) if (rabid && prob(20)) - Target = who + set_target(who) AIprocess() //Wake up the slime's Target AI, needed otherwise this doesn't work to_say = "ATTACK!?!?" else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) @@ -486,14 +484,14 @@ if (findtext(phrase, lowertext(L.name))) if (isslime(L)) to_say = "NO... [L] slime friend" - --Friends[who] //Don't ask a slime to attack its friend + add_friendship(who, -1) //Don't ask a slime to attack its friend else if(!Friends[L] || Friends[L] < 1) - Target = L + set_target(L) AIprocess()//Wake up the slime's Target AI, needed otherwise this doesn't work to_say = "Ok... I attack [Target]" else to_say = "No... like [L] ..." - --Friends[who] //Don't ask a slime to attack its friend + add_friendship(who, -1) //Don't ask a slime to attack its friend break else to_say = "No... no listen" diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 1503455c4a23..c7174470dc5c 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -197,7 +197,7 @@ M.powerlevel = new_powerlevel if(i != 1) step_away(M,src) - M.Friends = Friends.Copy() + M.set_friends(Friends) babies += M M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 654b7d9bd7e6..d8d34a804958 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -1,3 +1,4 @@ +#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) /mob/living/simple_animal/slime name = "grey baby slime (123)" icon = 'icons/mob/slimes.dmi' @@ -109,10 +110,9 @@ for (var/A in actions) var/datum/action/AC = A AC.Remove(src) - Target = null - Leader = null - Friends.Cut() - speech_buffer.Cut() + set_target(null) + set_leader(null) + clear_friends() return ..() /mob/living/simple_animal/slime/proc/set_colour(new_colour) @@ -334,10 +334,7 @@ /mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. - if (user in Friends) - ++Friends[user] - else - Friends[user] = 1 + add_friendship(user, 1) to_chat(user, "You feed the slime the plasma. It chirps happily.") var/obj/item/stack/sheet/mineral/plasma/S = W S.use(1) @@ -405,7 +402,7 @@ adjustBruteLoss(rand(15,20)) if(!client) if(Target) // Like cats - Target = null + set_target(null) ++Discipline return @@ -450,8 +447,7 @@ if(Discipline == 1) attacked = 0 - if(Target) - Target = null + set_target(null) if(buckled) Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto. @@ -487,3 +483,55 @@ /mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) . = ..(mapload, pick(slime_colours), prob(50)) + +/mob/living/simple_animal/slime/proc/set_target(new_target) + var/old_target = Target + Target = new_target + if(old_target && !SLIME_CARES_ABOUT(old_target)) + UnregisterSignal(old_target, COMSIG_PARENT_QDELETING) + if(Target) + RegisterSignal(Target, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/set_leader(new_leader) + var/old_leader = Leader + Leader = new_leader + if(old_leader && !SLIME_CARES_ABOUT(old_leader)) + UnregisterSignal(old_leader, COMSIG_PARENT_QDELETING) + if(Leader) + RegisterSignal(Leader, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) + if(!Friends[new_friend]) + Friends[new_friend] = 0 + Friends[new_friend] += amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) + Friends[new_friend] = amount + if(new_friend) + RegisterSignal(new_friend, COMSIG_PARENT_QDELETING, .proc/clear_memories_of, override = TRUE) + +/mob/living/simple_animal/slime/proc/remove_friend(friend) + Friends -= friend + if(friend && !SLIME_CARES_ABOUT(friend)) + UnregisterSignal(friend, COMSIG_PARENT_QDELETING) + +/mob/living/simple_animal/slime/proc/set_friends(new_buds) + clear_friends() + for(var/mob/friend as anything in new_buds) + set_friendship(friend, new_buds[friend]) + +/mob/living/simple_animal/slime/proc/clear_friends() + for(var/mob/friend as anything in Friends) + remove_friend(friend) + +/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) + SIGNAL_HANDLER + if(source == Target) + set_target(null) + if(source == Leader) + set_leader(null) + remove_friend(source) + +#undef SLIME_CARES_ABOUT diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index 00cac3ed2b84..ae0871880818 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -4,9 +4,7 @@ SStgui.on_logout(src) unset_machine() remove_from_player_list() - if(client?.movingmob) //In the case the client was transferred to another mob and not deleted. - LAZYREMOVE(client.movingmob.client_mobs_in_contents, src) - client.movingmob = null + clear_client_in_contents() ..() if(loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d5e26b6aef3f..49fe6a0f059e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -16,13 +16,11 @@ * * qdels any client colours in place on this mob * - * Unsets the currently active machine - * - * Clears roundstart quirks list + * Clears any refs to the mob inside its current location * * Ghostizes the client attached to this mob * - * Removes references to the mob from its former mind, and vice versa + * If our mind still exists, clear its current var to prevent harddels * * Parent call */ @@ -47,12 +45,10 @@ QDEL_LIST(client_colours) active_storage = null unset_machine() - ghostize() - if(mind) - mind.handle_mob_deletion(src) - if(istype(loc, /atom/movable)) - var/atom/movable/movable_loc = loc - LAZYREMOVE(movable_loc.client_mobs_in_contents, src) + clear_client_in_contents() //Gotta do this here as well as Logout, since client will be null by the time it gets there, cause of that ghostize + ghostize() //False, since we're deleting it currently + if(mind?.current == src) //Let's just be safe yeah? This will occasionally be cleared, but not always. Can't do it with ghostize without changing behavior + mind.set_current(null) return ..() @@ -1349,3 +1345,64 @@ /// Used for typing indicator, relevant on /living level /mob/proc/set_typing_indicator(state) return + +/mob/vv_edit_var(var_name, var_value) + switch(var_name) + if(NAMEOF(src, control_object)) + var/obj/O = var_value + if(!istype(O) || (O.obj_flags & DANGEROUS_POSSESSION)) + return FALSE + if(NAMEOF(src, machine)) + set_machine(var_value) + . = TRUE + if(NAMEOF(src, focus)) + set_focus(var_value) + . = TRUE + if(NAMEOF(src, nutrition)) + set_nutrition(var_value) + . = TRUE + if(NAMEOF(src, stat)) + set_stat(var_value) + . = TRUE + if(NAMEOF(src, dizziness)) + set_dizziness(var_value) + . = TRUE + if(NAMEOF(src, eye_blind)) + set_blindness(var_value) + . = TRUE + if(NAMEOF(src, eye_blurry)) + set_blurriness(var_value) + . = TRUE + + if(!isnull(.)) + datum_flags |= DF_VAR_EDITED + return + + var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown)) + var/diff + if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value)) + remove_movespeed_modifier(/datum/movespeed_modifier/admin_varedit) + diff = var_value - cached_multiplicative_slowdown + + . = ..() + + if(. && slowdown_edit && isnum(diff)) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, multiplicative_slowdown = diff) + +/mob/proc/set_active_storage(new_active_storage) + if(active_storage) + UnregisterSignal(active_storage, COMSIG_PARENT_QDELETING) + active_storage = new_active_storage + if(active_storage) + RegisterSignal(active_storage, COMSIG_PARENT_QDELETING, .proc/active_storage_deleted) + +/mob/proc/active_storage_deleted(datum/source) + SIGNAL_HANDLER + set_active_storage(null) + +///Clears the client in contents list of our current "eye". Prevents hard deletes +/mob/proc/clear_client_in_contents() + if(client?.movingmob) //In the case the client was transferred to another mob and not deleted. + client.movingmob.client_mobs_in_contents -= src + UNSETEMPTY(client.movingmob.client_mobs_in_contents) + client.movingmob = null diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 4e8a0a057c6e..6873ee602dac 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -151,8 +151,8 @@ /// Can this mob enter shuttles var/move_on_shuttle = 1 - ///The last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) - var/mob/living/carbon/LAssailant = null + ///A weakref to the last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition) + var/datum/weakref/LAssailant = null /** * construct spells and mime spells. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f7ef27f0c298..4c4a58378410 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -396,7 +396,7 @@ A.name = header A.desc = message A.action = action - A.target = source + A.target_ref = WEAKREF(source) if(!alert_overlay) alert_overlay = new(source) alert_overlay.layer = FLOAT_LAYER diff --git a/code/modules/mob/mob_lists.dm b/code/modules/mob/mob_lists.dm index 861a87649ebf..5484c41680d2 100644 --- a/code/modules/mob/mob_lists.dm +++ b/code/modules/mob/mob_lists.dm @@ -22,7 +22,6 @@ if(client) remove_from_current_living_players() - ///Adds the mob reference to the list of all the dead mobs. If mob is cliented, it adds it to the list of all dead player-mobs. /mob/proc/add_to_dead_mob_list() if(QDELETED(src)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 498538185578..0b68a919b17c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -305,7 +305,7 @@ var/mob/M = AM if(M.buckled) continue - if(!AM.CanPass(src) || AM.density) + if(AM.density || !AM.CanPass(src, get_dir(AM, src))) if(AM.anchored) return AM if(pulling == AM) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index ab15d70a29ba..aa8a869da38a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -92,7 +92,7 @@ if(tr_flags & TR_KEEPORGANS) for(var/X in O.internal_organs) var/obj/item/organ/I = X - I.Remove(O, 1) + I.Remove(O, TRUE) if(mind) mind.transfer_to(O) @@ -105,11 +105,11 @@ for(var/X in internal_organs) var/obj/item/organ/I = X int_organs += I - I.Remove(src, 1) + I.Remove(src, TRUE) for(var/X in int_organs) var/obj/item/organ/I = X - I.Insert(O, 1) + I.Insert(O, TRUE) var/obj/item/bodypart/chest/torso = O.get_bodypart(BODY_ZONE_CHEST) if(cavity_object) diff --git a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm index 27eb3a6ae970..92369d9917ff 100644 --- a/code/modules/modular_computers/NTNet/NTNRC/conversation.dm +++ b/code/modules/modular_computers/NTNet/NTNRC/conversation.dm @@ -22,6 +22,8 @@ /datum/ntnet_conversation/Destroy() if(SSnetworks.station_network) SSnetworks.station_network.chat_channels.Remove(src) + for(var/datum/computer_file/program/chatclient/chatterbox in clients) + purge_client(chatterbox) return ..() /datum/ntnet_conversation/proc/add_message(message, username) @@ -38,23 +40,30 @@ return messages = messages.Copy(messages.len-50 ,0) -/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/C) - if(!istype(C)) +/datum/ntnet_conversation/proc/add_client(datum/computer_file/program/chatclient/new_user) + if(!istype(new_user)) return - clients.Add(C) - add_status_message("[C.username] has joined the channel.") + new_user.conversations |= src + clients.Add(new_user) + add_status_message("[new_user.username] has joined the channel.") // No operator, so we assume the channel was empty. Assign this user as operator. if(!operator) - changeop(C) + changeop(new_user) -/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/C) - if(!istype(C) || !(C in clients)) +//Clear all of our references to a client, used for client deletion +/datum/ntnet_conversation/proc/purge_client(datum/computer_file/program/chatclient/forget) + remove_client(forget) + forget.conversations -= src + +/datum/ntnet_conversation/proc/remove_client(datum/computer_file/program/chatclient/leaving) + if(!istype(leaving)) return - clients.Remove(C) - add_status_message("[C.username] has left the channel.") + if(leaving in clients) + clients.Remove(leaving) + add_status_message("[leaving.username] has left the channel.") // Channel operator left, pick new operator - if(C == operator) + if(leaving == operator) operator = null if(clients.len) var/datum/computer_file/program/chatclient/newop = pick(clients) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index fba43fdd5403..92afe88776b0 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -25,8 +25,6 @@ /obj/machinery/modular_computer/console/preset/proc/install_programs() return - - // ===== ENGINEERING CONSOLE ===== /obj/machinery/modular_computer/console/preset/engineering console_department = "Engineering" diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index 34fd2d25a034..bc65f94ad440 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -43,7 +43,7 @@ var/list/alarm = our_sort[areaname] var/list/sources = alarm[3] if (!(source in sources)) - sources += source + sources += WEAKREF(source) return TRUE var/obj/machinery/camera/cam = null @@ -54,7 +54,7 @@ cam = our_cams[1] else if(cameras && istype(cameras, /obj/machinery/camera)) cam = cameras - our_sort[home.name] = list(home, (cam ? cam : cameras), list(source)) + our_sort[home.name] = list(home, (cam ? cam : cameras), list(WEAKREF(source))) update_alarm_display() return TRUE @@ -76,7 +76,7 @@ /datum/computer_file/program/alarm_monitor/proc/cancelAlarm(class, area/A, obj/origin) var/list/L = alarms[class] - var/cleared = 0 + var/cleared = FALSE var/arealevelalarm = FALSE // set to TRUE for alarms that set/clear whole areas if (class=="Fire") arealevelalarm = TRUE @@ -85,14 +85,18 @@ if (!arealevelalarm) // the traditional behaviour var/list/alarm = L[I] var/list/srcs = alarm[3] - if (origin in srcs) - srcs -= origin - if (srcs.len == 0) - cleared = 1 + if (WEAKREF(origin) in srcs) + srcs -= WEAKREF(origin) + for(var/datum/weakref/ref as anything in srcs) + if(ref.resolve()) + continue + srcs -= ref + if (!length(srcs)) + cleared = TRUE L -= I else L -= I // wipe the instances entirely - cleared = 1 + cleared = TRUE update_alarm_display() diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index b34c7e7dfb30..ff776b417a17 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -14,12 +14,20 @@ var/username var/active_channel var/list/channel_history = list() - var/operator_mode = FALSE // Channel operator mode - var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords) + var/operator_mode = FALSE // Channel operator mode + var/netadmin_mode = FALSE // Administrator mode (invisible to other users + bypasses passwords) + //A list of all the converstations we're a part of + var/list/datum/ntnet_conversation/conversations = list() /datum/computer_file/program/chatclient/New() username = "DefaultUser[rand(100, 999)]" +/datum/computer_file/program/chatclient/Destroy() + for(var/datum/ntnet_conversation/discussion as anything in conversations) + discussion.purge_client(src) + conversations.Cut() + return ..() + /datum/computer_file/program/chatclient/ui_act(action, params) . = ..() if(.) diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 7e2954611bfc..d1c6335587a4 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -36,11 +36,15 @@ refresh() /datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE) + for(var/supermatter in supermatters) + clear_supermatter(supermatter) supermatters = null ..() // Refreshes list of active supermatter crystals /datum/computer_file/program/supermatter_monitor/proc/refresh() + for(var/supermatter in supermatters) + clear_supermatter(supermatter) supermatters = list() var/turf/T = get_turf(ui_host()) if(!T) @@ -50,9 +54,7 @@ if (!isturf(S.loc) || !S.virtual_z() == T.virtual_z()) continue supermatters.Add(S) - - if(!(active in supermatters)) - active = null + RegisterSignal(S, COMSIG_PARENT_QDELETING, .proc/react_to_del) /datum/computer_file/program/supermatter_monitor/proc/get_status() . = SUPERMATTER_INACTIVE @@ -185,3 +187,13 @@ active = S set_signals() return TRUE + +/datum/computer_file/program/supermatter_monitor/proc/react_to_del(datum/source) + SIGNAL_HANDLER + clear_supermatter(source) + +/datum/computer_file/program/supermatter_monitor/proc/clear_supermatter(matter) + supermatters -= matter + if(matter == active) + active = null + UnregisterSignal(matter, COMSIG_PARENT_QDELETING) diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 2e735158b6fe..bad68010557c 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -117,7 +117,7 @@ return null /obj/item/computer_hardware/hard_drive/Destroy() - stored_files = null + QDEL_LIST(stored_files) return ..() /obj/item/computer_hardware/hard_drive/Initialize() diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index f6a8b7333f9c..c00d32d25809 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -49,7 +49,7 @@ /obj/item/energy_katana/dropped(mob/user) . = ..() - jaunt.Remove(user) + jaunt?.Remove(user) user.update_icons() //If we hit the Ninja who owns this Katana, they catch it. @@ -96,6 +96,7 @@ /obj/item/energy_katana/Destroy() QDEL_NULL(spark_system) + QDEL_NULL(jaunt) return ..() /datum/action/innate/dash/ninja diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index c4ba5eede53a..cb355014d4e7 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -72,6 +72,11 @@ Contents: cell.name = "black power cell" cell.icon_state = "bscell" +/obj/item/clothing/suit/space/space_ninja/Destroy() + QDEL_NULL(spark_system) + QDEL_NULL(cell) + return ..() + // Space Suit temperature regulation and power usage /obj/item/clothing/suit/space/space_ninja/process() var/mob/living/carbon/human/user = src.loc diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm index 60756a2ce9e1..420b7aad4055 100644 --- a/code/modules/overmap/_overmap_datum.dm +++ b/code/modules/overmap/_overmap_datum.dm @@ -65,10 +65,13 @@ /datum/overmap/Destroy(force, ...) SSovermap.overmap_objects -= src if(docked_to) - Undock(TRUE) - SSovermap.overmap_container[x][y] -= src + docked_to.post_undocked() + docked_to.contents -= src + if(isnum(x) && isnum(y)) + SSovermap.overmap_container[x][y] -= src token.parent = null QDEL_NULL(token) + QDEL_LIST(contents) return ..() /** @@ -328,7 +331,7 @@ docked_to.contents -= src var/datum/overmap/old_docked_to = docked_to docked_to = null - token.Move(OVERMAP_TOKEN_TURF(x, y)) + token.forceMove(OVERMAP_TOKEN_TURF(x, y)) INVOKE_ASYNC(old_docked_to, .proc/post_undocked, src) docking = FALSE SEND_SIGNAL(src, COMSIG_OVERMAP_UNDOCK, old_docked_to) diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index 5c672f12a189..e39b6bc88866 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -81,7 +81,7 @@ current_ship = null /obj/machinery/computer/helm/proc/cancel_jump() - priority_announce("Bluespace Pylon spooling down. Jump calibration aborted.", sender_override="[current_ship.name] Bluespace Pylon", zlevel=virtual_z()) + priority_announce("Bluespace Pylon spooling down. Jump calibration aborted.", sender_override = "[current_ship.name] Bluespace Pylon", zlevel = virtual_z()) calibrating = FALSE deltimer(jump_timer) @@ -92,20 +92,20 @@ SStgui.close_uis(src) if(JUMP_STATE_CHARGING) jump_state = JUMP_STATE_IONIZING - priority_announce("Bluespace Jump Calibration completed. Ionizing Bluespace Pylon.", sender_override="[current_ship.name] Bluespace Pylon", zlevel=virtual_z()) + priority_announce("Bluespace Jump Calibration completed. Ionizing Bluespace Pylon.", sender_override = "[current_ship.name] Bluespace Pylon", zlevel = virtual_z()) if(JUMP_STATE_IONIZING) jump_state = JUMP_STATE_FIRING - priority_announce("Bluespace Ionization finalized; preparing to fire Bluespace Pylon.", sender_override="[current_ship.name] Bluespace Pylon", zlevel=virtual_z()) + priority_announce("Bluespace Ionization finalized; preparing to fire Bluespace Pylon.", sender_override = "[current_ship.name] Bluespace Pylon", zlevel = virtual_z()) if(JUMP_STATE_FIRING) jump_state = JUMP_STATE_FINALIZED - priority_announce("Bluespace Pylon launched.", sender_override="[current_ship.name] Bluespace Pylon", sound='sound/magic/lightning_chargeup.ogg', zlevel=virtual_z()) + priority_announce("Bluespace Pylon launched.", sender_override = "[current_ship.name] Bluespace Pylon", sound = 'sound/magic/lightning_chargeup.ogg', zlevel = virtual_z()) addtimer(CALLBACK(src, .proc/do_jump), 10 SECONDS) return - addtimer(CALLBACK(src, .proc/jump_sequence, TRUE), JUMP_CHARGE_DELAY) + jump_timer = addtimer(CALLBACK(src, .proc/jump_sequence, TRUE), JUMP_CHARGE_DELAY, TIMER_STOPPABLE) /obj/machinery/computer/helm/proc/do_jump() - priority_announce("Bluespace Jump Initiated.", sender_override="[current_ship.name] Bluespace Pylon", sound='sound/magic/lightningbolt.ogg', zlevel=virtual_z()) - current_ship.shuttle_port.intoTheSunset() + priority_announce("Bluespace Jump Initiated.", sender_override = "[current_ship.name] Bluespace Pylon", sound = 'sound/magic/lightningbolt.ogg', zlevel = virtual_z()) + qdel(current_ship) /obj/machinery/computer/helm/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) if(current_ship && current_ship != port.current_ship) @@ -183,7 +183,7 @@ //Detect any ships in this location we can dock to if(istype(object)) - for(var/obj/docking_port/stationary/docking_port in object.shuttle_port.docking_points) + for(var/obj/docking_port/stationary/docking_port as anything in object.shuttle_port.docking_points) if(current_ship.shuttle_port.check_dock(docking_port, silent = TRUE)) available_dock = TRUE break @@ -211,23 +211,27 @@ .["aiControls"] = allow_ai_control .["burnDirection"] = current_ship.burn_direction .["burnPercentage"] = current_ship.burn_percentage - for(var/obj/machinery/power/shuttle/engine/E as anything in current_ship.shuttle_port.engine_list) + for(var/datum/weakref/engine in current_ship.shuttle_port.engine_list) + var/obj/machinery/power/shuttle/engine/real_engine = engine.resolve() + if(!real_engine) + current_ship.shuttle_port.engine_list -= engine + continue var/list/engine_data - if(!E.thruster_active) + if(!real_engine.thruster_active) engine_data = list( - name = E.name, + name = real_engine.name, fuel = 0, maxFuel = 100, - enabled = E.enabled, - ref = REF(E) + enabled = real_engine.enabled, + ref = REF(engine) ) else engine_data = list( - name = E.name, - fuel = E.return_fuel(), - maxFuel = E.return_fuel_cap(), - enabled = E.enabled, - ref = REF(E) + name = real_engine.name, + fuel = real_engine.return_fuel(), + maxFuel = real_engine.return_fuel_cap(), + enabled = real_engine.enabled, + ref = REF(engine) ) .["engineInfo"] += list(engine_data) @@ -300,9 +304,13 @@ say(current_ship.Dock(to_act)) return if("toggle_engine") - var/obj/machinery/power/shuttle/engine/E = locate(params["engine"]) in current_ship.shuttle_port.engine_list - E.enabled = !E.enabled - E.update_icon_state() + var/datum/weakref/engine = locate(params["engine"]) in current_ship.shuttle_port.engine_list + var/obj/machinery/power/shuttle/engine/real_engine = engine.resolve() + if(!real_engine) + current_ship.shuttle_port.engine_list -= engine + return + real_engine.enabled = !real_engine.enabled + real_engine.update_icon_state() current_ship.refresh_engines() return if("change_burn_percentage") diff --git a/code/modules/overmap/missions.dm b/code/modules/overmap/missions.dm index 98146f3ac4ad..e3461ced00de 100644 --- a/code/modules/overmap/missions.dm +++ b/code/modules/overmap/missions.dm @@ -50,9 +50,11 @@ qdel(src) /datum/mission/Destroy() + UnregisterSignal(source_outpost, COMSIG_PARENT_QDELETING) LAZYREMOVE(source_outpost.missions, src) source_outpost = null if(servant) + UnregisterSignal(servant, COMSIG_PARENT_QDELETING) LAZYREMOVE(servant.missions, src) servant = null for(var/bound in bound_atoms) diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index 4b62f777da73..c6f0ed4a193e 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -55,12 +55,13 @@ /datum/overmap/dynamic/Destroy() for(var/obj/docking_port/stationary/dock as anything in reserve_docks) reserve_docks -= dock - qdel(dock, TRUE) + qdel(dock) + ruin_turfs = null + . = ..() + //This NEEDS to be last so any docked ships get deleted properly if(mapzone) mapzone.clear_reservation() QDEL_NULL(mapzone) - ruin_turfs = null - return ..() /datum/overmap/dynamic/get_jump_to_turf() if(reserve_docks) @@ -102,7 +103,7 @@ for(var/obj/docking_port/stationary/dock as anything in reserve_docks) reserve_docks -= dock - qdel(dock, TRUE) + qdel(dock) reserve_docks = null if(mapzone) mapzone.clear_reservation() diff --git a/code/modules/overmap/overmap_token.dm b/code/modules/overmap/overmap_token.dm index b69b63142cf0..4d4ca6d23bda 100644 --- a/code/modules/overmap/overmap_token.dm +++ b/code/modules/overmap/overmap_token.dm @@ -37,7 +37,7 @@ update_appearance() /obj/overmap/Destroy(force) - if(parent) + if(!QDELETED(parent)) stack_trace("attempted to qdel a token that still has a parent") return QDEL_HINT_LETMELIVE if(render_map) diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index d48df5159671..a04355197dd6 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -59,7 +59,7 @@ /// Short memo of the ship shown to new joins var/memo = null ///Assoc list of remaining open job slots (job = remaining slots) - var/list/job_slots = list(new /datum/job/captain() = 1, new /datum/job/assistant() = 5) + var/list/job_slots ///Time that next job slot change can occur COOLDOWN_DECLARE(job_slot_adjustment_cooldown) @@ -110,17 +110,29 @@ SSovermap.controlled_ships += src /datum/overmap/ship/controlled/Destroy() + //SHOULD be called first + . = ..() SSovermap.controlled_ships -= src + helms.Cut() + LAZYCLEARLIST(owner_candidates) if(!QDELETED(shuttle_port)) - shuttle_port.intoTheSunset() + shuttle_port.current_ship = null + qdel(shuttle_port, TRUE) + shuttle_port = null if(!QDELETED(ship_account)) QDEL_NULL(ship_account) + if(!QDELETED(shipkey)) + QDEL_NULL(shipkey) + QDEL_LIST(manifest) + job_slots.Cut() for(var/a_key in applications) + if(isnull(applications[a_key])) + continue // it handles removal itself qdel(applications[a_key]) + LAZYCLEARLIST(applications) // set ourselves to ownerless to unregister signals set_owner_mob(null) - return ..() /datum/overmap/ship/controlled/get_jump_to_turf() return get_turf(shuttle_port) @@ -187,10 +199,10 @@ var/thrust_used = 0 //The amount of thrust that the engines will provide with one burn refresh_engines() calculate_avg_fuel() - for(var/obj/machinery/power/shuttle/engine/E as anything in shuttle_port.engine_list) - if(!E.enabled) + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in shuttle_port.get_engines()) + if(!real_engine.enabled) continue - thrust_used += E.burn_engine(percentage, deltatime) + thrust_used += real_engine.burn_engine(percentage, deltatime) thrust_used = thrust_used / (shuttle_port.turf_count * 100) est_thrust = thrust_used / percentage * 100 //cheeky way of rechecking the thrust, check it every time it's used @@ -202,10 +214,10 @@ */ /datum/overmap/ship/controlled/proc/refresh_engines() var/calculated_thrust - for(var/obj/machinery/power/shuttle/engine/E as anything in shuttle_port.engine_list) - E.update_engine() - if(E.enabled) - calculated_thrust += E.thrust + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in shuttle_port.get_engines()) + real_engine.update_engine() + if(real_engine.enabled) + calculated_thrust += real_engine.thrust est_thrust = calculated_thrust / (shuttle_port.turf_count * 100) /** @@ -214,10 +226,10 @@ /datum/overmap/ship/controlled/proc/calculate_avg_fuel() var/fuel_avg = 0 var/engine_amnt = 0 - for(var/obj/machinery/power/shuttle/engine/E as anything in shuttle_port.engine_list) - if(!E.enabled) + for(var/obj/machinery/power/shuttle/engine/real_engine as anything in shuttle_port.get_engines()) + if(!real_engine.enabled) continue - fuel_avg += E.return_fuel() / E.return_fuel_cap() + fuel_avg += real_engine.return_fuel() / real_engine.return_fuel_cap() engine_amnt++ if(!engine_amnt || !fuel_avg) avg_fuel_amnt = 0 diff --git a/code/modules/overmap/ships/ship_datum.dm b/code/modules/overmap/ships/ship_datum.dm index c3b00b0b6f26..9c68b0ed8ae2 100644 --- a/code/modules/overmap/ships/ship_datum.dm +++ b/code/modules/overmap/ships/ship_datum.dm @@ -33,9 +33,9 @@ RegisterSignal(docked_to, COMSIG_OVERMAP_MOVED, .proc/on_docked_to_moved) /datum/overmap/ship/Destroy() - . = ..() if(movement_callback_id) deltimer(movement_callback_id, SSovermap_movement) + return ..() /datum/overmap/ship/complete_dock(datum/overmap/dock_target, datum/docking_ticket/ticket) . = ..() diff --git a/code/modules/pixelshifting/pixelshift.dm b/code/modules/pixelshifting/pixelshift.dm index 2dbba6fa993b..491dcfd5c3c3 100644 --- a/code/modules/pixelshifting/pixelshift.dm +++ b/code/modules/pixelshifting/pixelshift.dm @@ -63,7 +63,7 @@ /mob/living/CanAllowThrough(atom/movable/mover, border_dir) // Make sure to not allow projectiles of any kind past where they normally wouldn't. - if(!istype(mover, /obj/projectile) && !mover.throwing && passthroughable & get_dir(src, border_dir)) + if(!istype(mover, /obj/projectile) && !mover.throwing && (passthroughable & border_dir)) return TRUE return ..() diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index e47f24c01044..4a9be6160916 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -27,12 +27,11 @@ . = ..() eat_dir = newdir -/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) +/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!anchored) return - var/move_dir = get_dir(loc, AM.loc) - if(move_dir == eat_dir) + if(border_dir == eat_dir) return TRUE /obj/machinery/plumbing/grinder_chemical/proc/on_entered(datum/source, atom/movable/AM) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f57a82b00d8f..f8156a97a5d4 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -250,17 +250,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25) if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) - area.power_light = FALSE - area.power_equip = FALSE - area.power_environ = FALSE - area.power_change() - area.poweralert(FALSE, src) + if(area) + area.power_light = FALSE + area.power_equip = FALSE + area.power_environ = FALSE + area.power_change() + area.poweralert(FALSE, src) if(occupier) malfvacate(1) - qdel(wires) - wires = null + if(wires) + QDEL_NULL(wires) if(cell) - qdel(cell) + QDEL_NULL(cell) if(terminal) disconnect_terminal() . = ..() diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index d83ce869e93e..8d711ad804fa 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -18,7 +18,7 @@ . = ..() find_circs() connect_to_network() - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) update_appearance() component_parts = list(new /obj/item/circuitboard/machine/generator) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index d03c7d5c3af4..289c43c3e3bc 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -14,8 +14,8 @@ CanAtmosPass = ATMOS_PASS_NO light_range = 4 layer = ABOVE_OBJ_LAYER - var/obj/machinery/field/generator/FG1 = null - var/obj/machinery/field/generator/FG2 = null + var/obj/machinery/field/generator/field_gen_1 = null + var/obj/machinery/field/generator/field_gen_2 = null /obj/machinery/field/containment/Initialize() . = ..() @@ -27,8 +27,12 @@ AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/field/containment/Destroy() - FG1.fields -= src - FG2.fields -= src + if(field_gen_1) + field_gen_1.fields -= src + field_gen_1 = null + if(field_gen_2) + field_gen_2.fields -= src + field_gen_2 = null CanAtmosPass = ATMOS_PASS_YES air_update_turf(TRUE) return ..() @@ -59,12 +63,12 @@ return FALSE /obj/machinery/field/containment/attack_animal(mob/living/simple_animal/M) - if(!FG1 || !FG2) + if(!field_gen_1 || !field_gen_2) qdel(src) return if(ismegafauna(M)) M.visible_message("[M] glows fiercely as the containment field flickers out!") - FG1.calc_power(INFINITY) //rip that 'containment' field + field_gen_1.calc_power(INFINITY) //rip that 'containment' field M.adjustHealth(-M.obj_damage) else return ..() @@ -80,12 +84,12 @@ /obj/machinery/field/containment/proc/set_master(master1,master2) if(!master1 || !master2) return FALSE - FG1 = master1 - FG2 = master2 + field_gen_1 = master1 + field_gen_2 = master2 return TRUE /obj/machinery/field/containment/shock(mob/living/user) - if(!FG1 || !FG2) + if(!field_gen_1 || !field_gen_2) qdel(src) return FALSE ..() @@ -112,7 +116,7 @@ return -/obj/machinery/field/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/field/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(hasShocked || isliving(mover) || ismachinery(mover) || isstructure(mover) || ismecha(mover)) return FALSE diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 995beb23eb07..ee61bccbad51 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -16,6 +16,7 @@ light_range = 15 light_color = COLOR_RED gender = FEMALE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF /obj/singularity/narsie/large name = "Nar'Sie" diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index e10a79eaf74a..d14bacdf0a0e 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -28,7 +28,7 @@ var/last_warning var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six var/drifting_dir = 0 // Chosen direction to drift in - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF | LANDING_PROOF | HYPERSPACE_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION /obj/singularity/Initialize(mapload, starting_energy = 50) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index d923dc2df185..dfe24e46cb5b 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -189,8 +189,6 @@ /obj/machinery/power/smes/Destroy() if(SSticker.IsRoundInProgress()) var/turf/T = get_turf(src) - message_admins("SMES deleted at [ADMIN_VERBOSEJMP(T)]") - log_game("SMES deleted at [AREACOORD(T)]") investigate_log("deleted at [AREACOORD(T)]", INVESTIGATE_SINGULO) if(terminal) disconnect_terminal() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index bb50b3b2c2e8..b35974b8b930 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -36,6 +36,7 @@ RegisterSignal(SSsun, COMSIG_SUN_MOVED, .proc/queue_update_solar_exposure) /obj/machinery/power/solar/Destroy() + UnregisterSignal(SSsun, COMSIG_SUN_MOVED) unset_control() //remove from control computer return ..() @@ -109,6 +110,9 @@ /obj/machinery/power/solar/update_overlays() . = ..() + //This can get called while it's not initialized + if(!panel) + return var/matrix/turner = matrix() turner.Turn(azimuth_current) panel.transform = turner @@ -349,6 +353,7 @@ M.unset_control() if(connected_tracker) connected_tracker.unset_control() + UnregisterSignal(SSsun, COMSIG_SUN_MOVED) return ..() //search for unconnected panels and trackers in the computer powernet and connect them diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 05b9be90cd62..f34a268738d5 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -269,10 +269,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) -/obj/machinery/power/supermatter_crystal/Initialize() +/obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() uid = gl_uid++ - SSair.start_processing_machine(src) + SSair.start_processing_machine(src, mapload) countdown = new(src) countdown.start() GLOB.poi_list |= src diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 9cb80fe57c41..6222f147861e 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -54,7 +54,9 @@ /obj/item/ammo_casing/Destroy() . = ..() - if(!BB) + if(BB) + QDEL_NULL(BB) + else SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name) /obj/item/ammo_casing/update_icon_state() diff --git a/code/modules/projectiles/ammunition/energy/portal.dm b/code/modules/projectiles/ammunition/energy/portal.dm index 6f2b02644640..492878613658 100644 --- a/code/modules/projectiles/ammunition/energy/portal.dm +++ b/code/modules/projectiles/ammunition/energy/portal.dm @@ -4,7 +4,8 @@ harmful = FALSE fire_sound = 'sound/weapons/pulse3.ogg' select_name = "blue" - var/obj/item/gun/energy/wormhole_projector/gun + //Weakref to the gun that shot us + var/datum/weakref/gun /obj/item/ammo_casing/energy/wormhole/orange projectile_type = /obj/projectile/beam/wormhole/orange @@ -12,7 +13,7 @@ /obj/item/ammo_casing/energy/wormhole/Initialize(mapload, obj/item/gun/energy/wormhole_projector/wh) . = ..() - gun = wh + gun = WEAKREF(wh) /obj/item/ammo_casing/energy/wormhole/throw_proj() . = ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9d51296f3424..f91fa467cfef 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -96,6 +96,8 @@ QDEL_NULL(chambered) if(azoom) QDEL_NULL(azoom) + if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK + QDEL_NULL(suppressed) return ..() /obj/item/gun/handle_atom_del(atom/A) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f810dc221dbf..b186569afad4 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -20,7 +20,6 @@ var/use_cyborg_cell = FALSE //whether the gun's cell drains the cyborg user's cell to recharge var/dead_cell = FALSE //set to true so the gun is given an empty cell - //WS Begin - Gun Cells var/internal_cell = FALSE ///if the gun's cell cannot be replaced var/small_gun = FALSE ///if the gun is small and can only fit the small gun cell var/big_gun = FALSE ///if the gun is big and can fit the comically large gun cell @@ -30,7 +29,6 @@ var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' //Sound of ejecting a cell. UPDATE PLEASE var/sound_volume = 40 //Volume of loading/unloading sounds var/load_sound_vary = TRUE //Should the load/unload sounds vary? - //WS End /obj/item/gun/energy/emp_act(severity) . = ..() @@ -75,7 +73,8 @@ if (cell) QDEL_NULL(cell) STOP_PROCESSING(SSobj, src) - return ..() + . = ..() + ammo_type.Cut() /obj/item/gun/energy/handle_atom_del(atom/A) if(A == cell) @@ -216,7 +215,7 @@ /obj/item/gun/energy/update_overlays() . = ..() - if(!automatic_charge_overlays) + if(!automatic_charge_overlays || QDELETED(src)) return // Every time I see code this "flexible", a kitten fucking dies var/overlay_icon_state = "[icon_state]_charge" diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index db923335b369..1ecb29a27a64 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -183,11 +183,12 @@ /obj/item/gun/energy/dueling/Destroy() . = ..() - if(duel.gun_A == src) - duel.gun_A = null - if(duel.gun_B == src) - duel.gun_B = null - duel = null + if(duel) + if(duel.gun_A == src) + duel.gun_A = null + if(duel.gun_B == src) + duel.gun_B = null + duel = null /obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user) . = ..() diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index 2ef1f8293bcf..029c5f8a2693 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -25,6 +25,10 @@ START_PROCESSING(SSobj, src) /obj/item/minigunpack/Destroy() + if(!QDELETED(gun)) + qdel(gun) + gun = null + QDEL_NULL(battery) STOP_PROCESSING(SSobj, src) return ..() @@ -119,6 +123,12 @@ AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) return ..() +/obj/item/gun/energy/minigun/Destroy() + if(!QDELETED(ammo_pack)) + qdel(ammo_pack) + ammo_pack = null + return ..() + /obj/item/gun/energy/minigun/attack_self(mob/living/user) return diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 1311920eb8b2..44c667892e4a 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -221,10 +221,10 @@ for(var/i in 1 to ammo_type.len) var/obj/item/ammo_casing/energy/wormhole/W = ammo_type[i] if(istype(W)) - W.gun = src + W.gun = WEAKREF(src) var/obj/projectile/beam/wormhole/WH = W.BB if(istype(WH)) - WH.gun = src + WH.gun = WEAKREF(src) /obj/item/gun/energy/wormhole_projector/process_chamber() ..() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 6ef3367b67d6..63c4ef8aa2d0 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -51,7 +51,8 @@ /obj/item/gun/magic/Initialize() . = ..() charges = max_charges - chambered = new ammo_type(src) + if(ammo_type) + chambered = new ammo_type(src) if(can_charge) START_PROCESSING(SSobj, src) diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/misc/medbeam.dm index d0fd3052ed97..7061d7769ba4 100644 --- a/code/modules/projectiles/guns/misc/medbeam.dm +++ b/code/modules/projectiles/guns/misc/medbeam.dm @@ -101,21 +101,33 @@ return 0 var/obj/dummy = new(user_turf) dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows - for(var/turf/turf in getline(user_turf,target)) - if(mounted && turf == user_turf) + var/turf/previous_step = user_turf + var/first_step = TRUE + for(var/turf/next_step as anything in (getline(user_turf, target) - user_turf)) + if(first_step) + for(var/obj/blocker in user_turf) + if(!blocker.density || !(blocker.flags_1 & ON_BORDER_1)) + continue + if(blocker.CanPass(dummy, get_dir(user_turf, next_step))) + continue + return FALSE // Could not leave the first turf. + first_step = FALSE + if(mounted && next_step == user_turf) + continue //Mechs are dense and thus fail the check - if(turf.density) + if(next_step.density) qdel(dummy) - return 0 - for(var/atom/movable/AM in turf) - if(!AM.CanPass(dummy,turf,1)) + return FALSE + for(var/atom/movable/movable as anything in next_step) + if(!movable.CanPass(dummy, get_dir(next_step, previous_step))) qdel(dummy) - return 0 - for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams! + return FALSE + for(var/obj/effect/ebeam/medical/B in next_step)// Don't cross the str-beams! if(B.owner.origin != current_beam.origin) explosion(B.loc,0,3,5,8) qdel(dummy) - return 0 + return FALSE + previous_step = next_step qdel(dummy) return 1 diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8f2488be7f69..a50b6eed4ae6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -157,14 +157,14 @@ /// If true directly targeted turfs can be hit var/can_hit_turfs = FALSE + var/static/list/projectile_connections = list( + COMSIG_ATOM_ENTERED = .proc/on_entered, + ) + /obj/projectile/Initialize() . = ..() decayedRange = range - - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = .proc/on_entered - ) - AddElement(/datum/element/connect_loc, loc_connections) + AddElement(/datum/element/connect_loc, projectile_connections) /obj/projectile/proc/Range() range-- @@ -334,7 +334,7 @@ if(!trajectory) qdel(src) return FALSE - if(impacted[A]) // NEVER doublehit + if(LAZYISIN(impacted, A)) // NEVER doublehit return FALSE var/datum/point/pcache = trajectory.copy_to() var/turf/T = get_turf(A) @@ -342,7 +342,7 @@ ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) - impacted = list() // Shoot a x-ray laser at a pair of mirrors I dare you + impacted = null // Shoot a x-ray laser at a pair of mirrors I dare you ignore_source_check = TRUE // Firer is no longer immune decayedRange = max(0, decayedRange - reflect_range_decrease) ricochet_chance *= ricochet_decay_chance @@ -383,7 +383,7 @@ if(QDELETED(src) || !T || !target) return // 2. - impacted[target] = TRUE //hash lookup > in for performance in hit-checking + LAZYSET(impacted, target, TRUE) //hash lookup > in for performance in hit-checking // 3. var/mode = prehit_pierce(target) if(mode == PROJECTILE_DELETE_WITHOUT_HITTING) @@ -459,7 +459,7 @@ //Returns true if the target atom is on our current turf and above the right layer //If direct target is true it's the originally clicked target. /obj/projectile/proc/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE) - if(QDELETED(target) || impacted[target]) + if(QDELETED(target) || LAZYISIN(impacted, target)) return FALSE if(!ignore_loc && (loc != target.loc) && !(can_hit_turfs && direct_target && loc == target)) return FALSE @@ -533,8 +533,8 @@ * Projectile can pass through * Used to not even attempt to Bump() or fail to Cross() anything we already hit. */ -/obj/projectile/CanPassThrough(atom/blocker, turf/target, blocker_opinion) - return impacted[blocker]? TRUE : ..() +/obj/projectile/CanPassThrough(atom/blocker, movement_dir, blocker_opinion) + return LAZYISIN(impacted, blocker) ? TRUE : ..() /** * Projectile moved: @@ -758,8 +758,6 @@ process_homing() var/forcemoved = FALSE for(var/i in 1 to SSprojectiles.global_iterations_per_move) - if(QDELETED(src)) - return trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) @@ -780,6 +778,8 @@ else if(T != loc) step_towards(src, T) hitscan_last = loc + if(QDELETED(src)) + return if(!hitscanning && !forcemoved) pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move @@ -871,13 +871,14 @@ finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) cleanup_beam_segments() - qdel(trajectory) + if(trajectory) + QDEL_NULL(trajectory) return ..() /obj/projectile/proc/cleanup_beam_segments() QDEL_LIST_ASSOC(beam_segments) beam_segments = list() - QDEL_NULL(beam_index) //WS edit - Hitscan emitters + QDEL_NULL(beam_index) /obj/projectile/proc/finalize_hitscan_and_generate_tracers(impacting = TRUE) if(trajectory && beam_index) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 93e3de355636..00f323d995fa 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -423,6 +423,7 @@ /obj/projectile/magic/locker/Destroy() locker_suck = FALSE + RemoveElement(/datum/element/connect_loc, projectile_connections) //We do this manually so the forcemoves don't "hit" us. This behavior is kinda dumb, someone refactor this for(var/atom/movable/AM in contents) AM.forceMove(get_turf(src)) . = ..() diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 8001593d86a7..5c928e293e12 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -20,6 +20,10 @@ handedness = prob(50) icon_state = "cursehand[handedness]" +/obj/projectile/curse_hand/Destroy() + QDEL_NULL(arm) + return ..() + /obj/projectile/curse_hand/update_icon_state() icon_state = "[initial(icon_state)][handedness]" return ..() diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm index d3abf739d34d..2b56599f9812 100644 --- a/code/modules/projectiles/projectile/special/gravity.dm +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -15,7 +15,7 @@ . = ..() var/obj/item/ammo_casing/energy/gravity/repulse/C = loc if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) + power = min(C.gun?.power, 15) /obj/projectile/gravityrepulse/on_hit() . = ..() @@ -50,7 +50,7 @@ . = ..() var/obj/item/ammo_casing/energy/gravity/attract/C = loc if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) + power = min(C.gun?.power, 15) /obj/projectile/gravityattract/on_hit() . = ..() @@ -84,7 +84,7 @@ . = ..() var/obj/item/ammo_casing/energy/gravity/chaos/C = loc if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items - power = min(C.gun.power, 15) + power = min(C.gun?.power, 15) /obj/projectile/gravitychaos/on_hit() . = ..() diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index 918ce629ebcf..74fa2b2ad17a 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -28,7 +28,7 @@ hal_target.client.images += fake_icon /obj/projectile/hallucination/Destroy() - if(hal_target.client) + if(hal_target?.client) hal_target.client.images -= fake_icon QDEL_NULL(fake_icon) return ..() diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 2bc9713f1a03..f35436683377 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -5,7 +5,8 @@ damage = 0 nodamage = TRUE pass_flags = PASSGLASS | PASSTABLE | PASSGRILLE | PASSMOB - var/obj/item/gun/energy/wormhole_projector/gun + //Weakref to the thing that shot us + var/datum/weakref/gun color = "#33CCFF" tracer_type = /obj/effect/projectile/tracer/wormhole impact_type = /obj/effect/projectile/impact/wormhole @@ -23,7 +24,8 @@ /obj/projectile/beam/wormhole/on_hit(atom/target) - if(!gun) + var/obj/item/gun/energy/wormhole_projector/projector = gun.resolve() + if(!projector) qdel(src) return - gun.create_portal(src, get_turf(src)) + projector.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index 3ddadea35b04..4fc71a1eba0d 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -1,12 +1,13 @@ // Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful. -/datum/reagent/medicine/C2 +/datum/reagent/medicine/c2 + name = "Category two reagent" harmful = TRUE metabolization_rate = 0.2 /******BRUTE******/ /*Suffix: -bital*/ -/datum/reagent/medicine/C2/helbital //kinda a C2 only if you're not in hardcrit. +/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit. name = "Helbital" description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." color = "#9400D3" @@ -16,7 +17,7 @@ var/helbent = FALSE var/reaping = FALSE -/datum/reagent/medicine/C2/helbital/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M) . = TRUE var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss()) var/thou_shall_heal = 0 @@ -66,26 +67,26 @@ ..() return -/datum/reagent/medicine/C2/helbital/overdose_process(mob/living/carbon/M) +/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M) if(!helbent) M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) helbent = TRUE ..() return TRUE -/datum/reagent/medicine/C2/helbital/on_mob_delete(mob/living/L) +/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L) if(helbent) L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) ..() -/datum/reagent/medicine/C2/libital //messes with your liber +/datum/reagent/medicine/c2/libital //messes with your liber name = "Libital" description = "A bruise reliever. Does minor liver damage." color = "#ECEC8D" // rgb: 236 236 141 taste_description = "bitter with a hint of alcohol" reagent_state = SOLID -/datum/reagent/medicine/C2/libital/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3*REM) M.adjustBruteLoss(-3*REM) ..() @@ -93,14 +94,14 @@ /*WS Begin - Medicine Fixes -/datum/reagent/medicine/C2/probital +/datum/reagent/medicine/c2/probital name = "Probital" description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further." reagent_state = SOLID color = "#FFFF6B" overdose_threshold = 20 -/datum/reagent/medicine/C2/probital/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M) M.adjustBruteLoss(-2.25*REM, FALSE) var/ooo_youaregettingsleepy = 3.5 switch(round(M.getStaminaLoss())) @@ -114,7 +115,7 @@ ..() . = TRUE -/datum/reagent/medicine/C2/probital/overdose_process(mob/living/M) +/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M) M.adjustStaminaLoss(3*REM, 0) if(M.getStaminaLoss() >= 80) M.drowsyness++ @@ -125,11 +126,11 @@ ..() . = TRUE -/datum/reagent/medicine/C2/probital/on_transfer(atom/A, method=INGEST, trans_volume) +/datum/reagent/medicine/c2/probital/on_transfer(atom/A, method=INGEST, trans_volume) if(method != INGEST || !iscarbon(A)) return - A.reagents.remove_reagent(/datum/reagent/medicine/C2/probital, trans_volume * 0.05) + A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05) A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) ..() @@ -138,7 +139,7 @@ WS End */ /******BURN******/ /*Suffix: -uri*/ -/datum/reagent/medicine/C2/lenturi +/datum/reagent/medicine/c2/lenturi name = "Lenturi" description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system." reagent_state = LIQUID @@ -146,21 +147,21 @@ WS End */ var/resetting_probability = 0 var/spammer = 0 -/datum/reagent/medicine/C2/lenturi/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(-3 * REM) M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM) ..() return TRUE -/datum/reagent/medicine/C2/lenturi/on_mob_metabolize(mob/living/carbon/M) +/datum/reagent/medicine/c2/lenturi/on_mob_metabolize(mob/living/carbon/M) M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) return ..() -/datum/reagent/medicine/C2/lenturi/on_mob_end_metabolize(mob/living/carbon/M) +/datum/reagent/medicine/c2/lenturi/on_mob_end_metabolize(mob/living/carbon/M) M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) return ..() -/datum/reagent/medicine/C2/aiuri +/datum/reagent/medicine/c2/aiuri name = "Aiuri" description = "Used to treat burns. Does minor eye damage." reagent_state = LIQUID @@ -168,7 +169,7 @@ WS End */ var/resetting_probability = 0 var/message_cd = 0 -/datum/reagent/medicine/C2/aiuri/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M) M.adjustFireLoss(-2*REM) M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM) ..() @@ -176,7 +177,7 @@ WS End */ /*WS Begin - Fixes Medicines -/datum/reagent/medicine/C2/hercuri +/datum/reagent/medicine/c2/hercuri name = "Hercuri" description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia." reagent_state = LIQUID @@ -184,7 +185,7 @@ WS End */ overdose_threshold = 25 reagent_weight = 0.6 -/datum/reagent/medicine/C2/hercuri/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 50) M.adjustFireLoss(-2*REM, FALSE) else @@ -206,7 +207,7 @@ WS End */ ..() -/datum/reagent/medicine/C2/hercuri/overdose_process(mob/living/carbon/M) +/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M) M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly ..() @@ -216,14 +217,14 @@ WS End*/ /*Suffix: -mol*/ #define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox -/datum/reagent/medicine/C2/convermol +/datum/reagent/medicine/c2/convermol name = "Convermol" description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." reagent_state = LIQUID color = "#FF6464" overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long -/datum/reagent/medicine/C2/convermol/on_mob_life(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M) var/oxycalc = 2.5*REM*current_cycle if(!overdosed) oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. @@ -234,20 +235,20 @@ WS End*/ ..() return TRUE -/datum/reagent/medicine/C2/convermol/overdose_process(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M) metabolization_rate += 1 ..() return TRUE #undef CONVERMOL_RATIO -/datum/reagent/medicine/C2/tirimol +/datum/reagent/medicine/c2/tirimol name = "Tirimol" description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes." color = "#FF6464" var/drowsycd = 0 -/datum/reagent/medicine/C2/tirimol/on_mob_life(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M) M.adjustOxyLoss(-3) M.adjustStaminaLoss(2) if(drowsycd && (world.time > drowsycd)) @@ -258,7 +259,7 @@ WS End*/ ..() return TRUE -/datum/reagent/medicine/C2/tirimol/on_mob_end_metabolize(mob/living/L) +/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L) if(current_cycle > 20) L.Sleeping(10 SECONDS) ..() @@ -266,16 +267,16 @@ WS End*/ /******TOXIN******/ /*Suffix: -iver*/ -/datum/reagent/medicine/C2/seiver //a bit of a gray joke +/datum/reagent/medicine/c2/seiver //a bit of a gray joke name = "Seiver" description = "A medicine that shifts functionality based on temperature. Colder temperatures incurs radiation removal while hotter temperatures promote antitoxicity. Damages the heart." //CHEM HOLDER TEMPS, NOT AIR TEMPS var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads. -/datum/reagent/medicine/C2/seiver/on_mob_metabolize(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/M) . = ..() radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once. -/datum/reagent/medicine/C2/seiver/on_mob_life(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/M) var/chemtemp = min(M.reagents?.chem_temp, 1000) chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints @@ -304,11 +305,11 @@ WS End*/ ..() return TRUE -/datum/reagent/medicine/C2/multiver //enhanced with MULTIple medicines +/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines name = "Multiver" description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)." -/datum/reagent/medicine/C2/multiver/on_mob_life(mob/living/carbon/human/M) +/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M) var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 for(var/r in M.reagents.reagent_list) var/datum/reagent/the_reagent = r @@ -327,11 +328,11 @@ WS End*/ ..() return TRUE -#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/C2/syriniver) || istype(A,/datum/reagent/medicine/C2/musiver)) //musc is metab of syrin so let's make sure we're not purging either +#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either /*WS Begin - Medicine Fixes -/datum/reagent/medicine/C2/syriniver //Inject >> SYRINge +/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge name = "Syriniver" description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver." reagent_state = LIQUID @@ -340,7 +341,7 @@ WS End*/ overdose_threshold = 6 var/conversion_amount -/datum/reagent/medicine/C2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume) +/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume) if(method != INJECT || !iscarbon(A)) return var/mob/living/carbon/C = A @@ -350,11 +351,11 @@ WS End*/ if((L.organ_flags & ORGAN_FAILING) || !L) return conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize. - C.reagents.remove_reagent(/datum/reagent/medicine/C2/syriniver, conversion_amount) - C.reagents.add_reagent(/datum/reagent/medicine/C2/musiver, conversion_amount) + C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount) + C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount) ..() -/datum/reagent/medicine/C2/syriniver/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8) M.adjustToxLoss(-1*REM, 0) for(var/datum/reagent/R in M.reagents.reagent_list) @@ -365,14 +366,14 @@ WS End*/ ..() . = 1 -/datum/reagent/medicine/C2/syriniver/overdose_process(mob/living/carbon/M) +/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) M.adjust_disgust(3) - M.reagents.add_reagent(/datum/reagent/medicine/C2/musiver, 0.225 * REM) + M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM) ..() . = 1 -/datum/reagent/medicine/C2/musiver //MUScles +/datum/reagent/medicine/c2/musiver //MUScles name = "Musiver" description = "The active metabolite of syriniver. Causes muscle weakness on overdose" reagent_state = LIQUID @@ -381,7 +382,7 @@ WS End*/ overdose_threshold = 25 var/datum/brain_trauma/mild/muscle_weakness/U -/datum/reagent/medicine/C2/musiver/on_mob_life(mob/living/carbon/M) +/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1) M.adjustToxLoss(-1*REM, 0) for(var/datum/reagent/R in M.reagents.reagent_list) @@ -391,17 +392,17 @@ WS End*/ ..() . = 1 -/datum/reagent/medicine/C2/musiver/overdose_start(mob/living/carbon/M) +/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M) U = new() M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE) ..() -/datum/reagent/medicine/C2/musiver/on_mob_delete(mob/living/carbon/M) +/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M) if(U) QDEL_NULL(U) return ..() -/datum/reagent/medicine/C2/musiver/overdose_process(mob/living/carbon/M) +/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5) M.adjust_disgust(3) ..() @@ -413,7 +414,7 @@ WS End*/ /******COMBOS******/ /*Suffix: Combo of healing, prob gonna get wack REAL fast*/ -/datum/reagent/medicine/C2/instabitaluri +/datum/reagent/medicine/c2/instabitaluri name = "Synthflesh (Instabitaluri)" description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only." reagent_state = LIQUID @@ -431,7 +432,7 @@ WS End*/ if(show_message) to_chat(carbies, "You feel your burns and bruises healing! It stings like hell!") SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/C2/instabitaluri) + reac_volume >= 100)) + if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100)) carbies.cure_husk("burn") carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something ..() @@ -449,13 +450,13 @@ WS End*/ *causing you to loose your soft crit, hard crit and heart stabilization effects. *Overdosing on penthrite also causes a heart failure. */ -/datum/reagent/medicine/C2/penthrite +/datum/reagent/medicine/c2/penthrite name = "Penthrite" description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. It reacts violently with other emergency medication." color = "#F5F5F5" overdose_threshold = 50 -/datum/reagent/medicine/C2/penthrite/on_mob_add(mob/living/M) +/datum/reagent/medicine/c2/penthrite/on_mob_add(mob/living/M) . = ..() to_chat(M,"Your heart begins to beat with great force!") ADD_TRAIT(M, TRAIT_STABLEHEART, type) @@ -464,7 +465,7 @@ WS End*/ M.crit_threshold = M.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! -/datum/reagent/medicine/C2/penthrite/on_mob_life(mob/living/carbon/human/H) +/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H) H.adjustOrganLoss(ORGAN_SLOT_STOMACH,0.25) if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > H.crit_threshold) //we cannot save someone above our raised crit threshold. @@ -492,14 +493,14 @@ WS End*/ volume = 0 . = ..() -/datum/reagent/medicine/C2/penthrite/on_mob_end_metabolize(mob/living/M) +/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/M) M.crit_threshold = M.crit_threshold - HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping! REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) REMOVE_TRAIT(M, TRAIT_NOHARDCRIT,type) REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT,type) . = ..() -/datum/reagent/medicine/C2/penthrite/overdose_process(mob/living/carbon/human/H) +/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H) REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) H.adjustStaminaLoss(10) H.adjustOrganLoss(ORGAN_SLOT_HEART,10) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4c150a53f299..753d0f1408a6 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,5 +1,5 @@ /datum/reagent/blood - data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) + data = list("viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null,"quirks"=null) name = "Blood" color = COLOR_BLOOD metabolization_rate = 5 //fast rate so it disappears fast. @@ -118,6 +118,7 @@ src.data |= data.Copy() /datum/reagent/vaccine/fungal_tb + name = "Fungal TB Vaccine" /datum/reagent/vaccine/fungal_tb/New(data) . = ..() @@ -692,7 +693,7 @@ taste_description = "brai...nothing in particular" /datum/reagent/mutationtoxin/goofzombie - name = "Zombie Mutation Toxin" + name = "Krokodil Zombie Mutation Toxin" description = "An undead toxin... kinda..." color = "#5EFF3B" //RGB: 94, 255, 59 race = /datum/species/human/krokodil_addict //Not the infectious kind. The days of xenobio zombie outbreaks are long past. @@ -1097,7 +1098,7 @@ /datum/reagent/uranium/radium/dip_object(obj/item/I, mob/user, obj/item/reagent_containers/H) return FALSE -/datum/reagent/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) +/datum/reagent/uranium/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() if(chems.has_reagent(type, 1)) mytray.adjustHealth(-round(chems.get_reagent_amount(type) * 2.5)) @@ -2242,11 +2243,12 @@ return ..() /datum/reagent/pax/peaceborg - name = "synthpax" + name = "Synthpax" description = "A colorless liquid that suppresses violence in its subjects. Cheaper to synthesize than normal Pax, but wears off faster." metabolization_rate = 1.5 * REAGENTS_METABOLISM /datum/reagent/peaceborg + name = "Abstract Peaceborg Reagent" can_synth = FALSE /datum/reagent/peaceborg/confuse diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 210f980eb041..9cde25afcac0 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -377,7 +377,7 @@ ..() /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots - name = "Beer" + name = "Beer?" description = "A specially-engineered sedative disguised as beer. It induces instant sleep in its target." color = "#664300" // rgb: 102, 67, 0 metabolization_rate = 1.5 * REAGENTS_METABOLISM diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm index dbe3398e3f0c..c68438fa73ce 100644 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm @@ -3,19 +3,19 @@ /*****BRUTE*****/ /datum/chemical_reaction/helbital - results = list(/datum/reagent/medicine/C2/helbital = 3) + results = list(/datum/reagent/medicine/c2/helbital = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) mix_message = "The mixture turns into a thick, yellow powder." /datum/chemical_reaction/libital - results = list(/datum/reagent/medicine/C2/libital = 3) + results = list(/datum/reagent/medicine/c2/libital = 3) required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1) /*WS Begin - Fixes medicines /datum/chemical_reaction/probital - results = list(/datum/reagent/medicine/C2/probital = 4) + results = list(/datum/reagent/medicine/c2/probital = 4) required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) WS End */ @@ -25,19 +25,19 @@ WS End */ /*WS Begin - No CobbyChems /datum/chemical_reaction/lenturi - results = list(/datum/reagent/medicine/C2/lenturi = 5) + results = list(/datum/reagent/medicine/c2/lenturi = 5) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) */ /datum/chemical_reaction/aiuri - results = list(/datum/reagent/medicine/C2/aiuri = 4) + results = list(/datum/reagent/medicine/c2/aiuri = 4) required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) /*WS Begin - Fixes medicines /datum/chemical_reaction/hercuri - results = list(/datum/reagent/medicine/C2/hercuri = 5) + results = list(/datum/reagent/medicine/c2/hercuri = 5) required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) required_temp = 47 is_cold_recipe = TRUE @@ -49,7 +49,7 @@ WS End */ /*WS Begin - No CobbyChems /datum/chemical_reaction/convermol - results = list(/datum/reagent/medicine/C2/convermol = 3) + results = list(/datum/reagent/medicine/c2/convermol = 3) required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) required_temp = 370 mix_message = "The mixture rapidly turns into a dense pink liquid." @@ -57,30 +57,30 @@ WS End */ */ /datum/chemical_reaction/tirimol - results = list(/datum/reagent/medicine/C2/tirimol = 5) + results = list(/datum/reagent/medicine/c2/tirimol = 5) required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) required_catalysts = list(/datum/reagent/toxin/acid = 1) /*****TOX*****/ /datum/chemical_reaction/seiver - results = list(/datum/reagent/medicine/C2/seiver = 3) + results = list(/datum/reagent/medicine/c2/seiver = 3) required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1) /*WS Begin - No CobbyChems /datum/chemical_reaction/multiver - results = list(/datum/reagent/medicine/C2/multiver = 2) + results = list(/datum/reagent/medicine/c2/multiver = 2) required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1) mix_message = "The mixture yields a fine black powder." required_temp = 380 /datum/chemical_reaction/syriniver - results = list(/datum/reagent/medicine/C2/syriniver = 5) + results = list(/datum/reagent/medicine/c2/syriniver = 5) required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) */ /datum/chemical_reaction/penthrite - results = list(/datum/reagent/medicine/C2/penthrite = 3) + results = list(/datum/reagent/medicine/c2/penthrite = 3) required_reagents = list(/datum/reagent/pentaerythritol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/wittel = 1) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 5e689add2433..b2e275bc0631 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -126,8 +126,8 @@ /*WS Begin - No Cobbychmes /datum/chemical_reaction/instabitaluri - results = list(/datum/reagent/medicine/C2/instabitaluri = 3) - required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/C2/libital = 1) + results = list(/datum/reagent/medicine/c2/instabitaluri = 3) + required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1) WS End */ diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 5b64f57e1a37..82be8a075cc1 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -122,11 +122,11 @@ /datum/chemical_reaction/reagent_explosion/penthrite_explosion_epinephrine - required_reagents = list(/datum/reagent/medicine/C2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) + required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) strengthdiv = 5 /datum/chemical_reaction/reagent_explosion/penthrite_explosion_atropine - required_reagents = list(/datum/reagent/medicine/C2/penthrite = 1, /datum/reagent/medicine/atropine = 1) + required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/atropine = 1) strengthdiv = 5 modifier = 5 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 0d583cb5a16f..dca353500b42 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -195,12 +195,14 @@ /obj/item/reagent_containers/proc/bartender_check(atom/target) . = FALSE - if(target.CanPass(src, get_turf(src)) && thrownby && HAS_TRAIT(thrownby, TRAIT_BOOZE_SLIDER)) + var/mob/thrown_by = thrownby?.resolve() + if(target.CanPass(src, get_dir(target, src)) && thrown_by && HAS_TRAIT(thrown_by, TRAIT_BOOZE_SLIDER)) . = TRUE /obj/item/reagent_containers/proc/SplashReagents(atom/target, thrown = FALSE) if(!reagents || !reagents.total_volume || !spillable) return + var/mob/thrown_by = thrownby?.resolve() if(ismob(target) && target.reagents) if(thrown) @@ -213,8 +215,8 @@ for(var/datum/reagent/A in reagents.reagent_list) R += "[A.type] ([num2text(A.volume)])," - if(thrownby) - log_combat(thrownby, M, "splashed", R) + if(thrown_by) + log_combat(thrown_by, M, "splashed", R) reagents.expose(target, TOUCH) else if(bartender_check(target) && thrown) @@ -222,10 +224,10 @@ return else - if(isturf(target) && reagents.reagent_list.len && thrownby) - log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]") - log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].") - message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].") + if(isturf(target) && reagents.reagent_list.len && thrown_by) + log_combat(thrown_by, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]") + log_game("[key_name(thrown_by)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].") + message_admins("[ADMIN_LOOKUPFLW(thrown_by)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].") playsound(src, 'sound/items/glass_splash.ogg', 50, 1) visible_message("[src] spills its contents all over [target].") reagents.expose(target, TOUCH) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a4cd49a131fb..97e0b7c0946b 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -44,9 +44,9 @@ Borg Hypospray /obj/item/reagent_containers/borghypo/Destroy() STOP_PROCESSING(SSobj, src) + QDEL_LIST(reagent_list) return ..() - /obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg charge_tick++ if(charge_tick >= recharge_time) diff --git a/code/modules/reagents/reagent_containers/jug.dm b/code/modules/reagents/reagent_containers/jug.dm index ae80ab51578a..a863be707c48 100644 --- a/code/modules/reagents/reagent_containers/jug.dm +++ b/code/modules/reagents/reagent_containers/jug.dm @@ -103,7 +103,7 @@ /obj/item/reagent_containers/glass/chem_jug/radium name = "chemical jug (radium)" icon_state = "chem_jug_radium" - list_reagents = list(/datum/reagent/radium = 150) + list_reagents = list(/datum/reagent/uranium/radium = 150) /obj/item/reagent_containers/glass/chem_jug/aluminium name = "chemical jug (aluminium)" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index ba365d435952..50436b8ee9e6 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -270,11 +270,11 @@ /*WS Begin - No Cobbychem -/obj/item/reagent_containers/pill/C2/probital +/obj/item/reagent_containers/pill/c2/probital name = "Probital pill" desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'. Causes fatigue and diluted with granibitaluri." icon_state = "pill12" - list_reagents = list(/datum/reagent/medicine/C2/probital = 5, /datum/reagent/medicine/granibitaluri = 10) + list_reagents = list(/datum/reagent/medicine/c2/probital = 5, /datum/reagent/medicine/granibitaluri = 10) rename_with_volume = TRUE WS End */ diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 9d92cfa78f53..da4c5d0b68fa 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -395,6 +395,6 @@ name = "medical spray (hercuri)" desc = "A medical spray bottle.This one contains hercuri, a medicine used to negate the effects of dangerous high-temperature environments. Careful not to freeze the patient!" icon_state = "sprayer_large" - list_reagents = list(/datum/reagent/medicine/C2/hercuri = 100) + list_reagents = list(/datum/reagent/medicine/c2/hercuri = 100) WS End */ diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 7a4e79f9e40c..c11906bf9c0d 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) if(!QDELETED(A) && (A.loc == loc)) A.ConveyorMove(movedir) //Give this a chance to yield if the server is busy - stoplag() + CHECK_TICK conveying = FALSE // attack with item, place item on conveyor diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 6cc5fa117bb6..9f2861218418 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -140,7 +140,8 @@ else target.visible_message("[user] places [target] in [src].", "[user] places you in [src].") log_combat(user, target, "stuffed", addition="into [src]") - target.LAssailant = user + target.LAssailant = WEAKREF(user) + . = TRUE update_appearance() /obj/machinery/disposal/relaymove(mob/living/user, direction) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 04390b9563e6..ec4038ec8f2b 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -98,14 +98,14 @@ other types of metals and chemistry for reagents). illustration = "design" custom_materials = list(/datum/material/iron =300, /datum/material/glass =100) var/list/blueprints = list() + var/list/starting_blueprints = list() var/max_blueprints = 1 /obj/item/disk/design_disk/Initialize() . = ..() pixel_x = base_pixel_x + rand(-5, 5) pixel_y = base_pixel_y + rand(-5, 5) - for(var/i in 1 to max_blueprints) - blueprints += null + blueprints = new/list(max_blueprints) /obj/item/disk/design_disk/adv name = "Advanced Component Design Disk" @@ -149,21 +149,20 @@ other types of metals and chemistry for reagents). name = "design disk - disposable gun" desc = "A design disk containing designs for a cheap and disposable gun." illustration = "gun" + max_blueprints = 2 -/obj/item/disk/design_disk/disposable_gun/Initialize() +/obj/item/disk/design_disk/adv/disposable_gun/Initialize() . = ..() - var/datum/design/disposable_gun/G = new - var/datum/design/pizza_disposable_gun/P = new - blueprints[1] = G - blueprints[2] = P + blueprints[1] = new /datum/design/disposable_gun() + blueprints[2] = new /datum/design/pizza_disposable_gun() /obj/item/disk/design_disk/cmm_mechs name = "design disk - CMM mecha modifications" desc = "A design disk containing specifications for CMM-custom mecha conversions." color = "#57b8f0" - max_blueprints = 3 + max_blueprints = 2 /obj/item/disk/design_disk/cmm_mechs/Initialize() . = ..() - blueprints[1] = new /datum/design/cmm_ripley_upgrade - blueprints[2] = new /datum/design/cmm_durand_upgrade + blueprints[1] = new /datum/design/cmm_ripley_upgrade() + blueprints[2] = new /datum/design/cmm_durand_upgrade() diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm index 4063ae19fb6e..30be4869d1bc 100644 --- a/code/modules/research/nanites/nanite_chamber.dm +++ b/code/modules/research/nanites/nanite_chamber.dm @@ -12,7 +12,6 @@ idle_power_usage = 50 active_power_usage = 300 - var/obj/machinery/computer/nanite_chamber_control/console var/locked = FALSE var/breakout_time = 1200 var/scan_level diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm index f2b155c0e0cd..c18364de1a2d 100644 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ b/code/modules/research/nanites/nanite_chamber_computer.dm @@ -2,7 +2,6 @@ name = "nanite chamber control console" desc = "Controls a connected nanite chamber. Can inoculate nanites, load programs, and analyze existing nanite swarms." var/obj/machinery/nanite_chamber/chamber - var/obj/item/disk/nanite_program/disk icon_screen = "nanite_chamber_control" circuit = /obj/item/circuitboard/computer/nanite_chamber_control @@ -15,8 +14,7 @@ var/C = locate(/obj/machinery/nanite_chamber, get_step(src, direction)) if(C) var/obj/machinery/nanite_chamber/NC = C - chamber = NC - NC.console = src + set_connected_chamber(NC) /obj/machinery/computer/nanite_chamber_control/interact() if(!chamber) @@ -97,3 +95,14 @@ log_combat(usr, chamber.occupant, "injected", null, "with nanites via [src]") chamber.occupant.investigate_log("was injected with nanites by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) . = TRUE + +/obj/machinery/computer/nanite_chamber_control/proc/set_connected_chamber(new_chamber) + if(chamber) + UnregisterSignal(chamber, COMSIG_PARENT_QDELETING) + chamber = new_chamber + if(chamber) + RegisterSignal(chamber, COMSIG_PARENT_QDELETING, .proc/react_to_chamber_del) + +/obj/machinery/computer/nanite_chamber_control/proc/react_to_chamber_del(datum/source) + SIGNAL_HANDLER + set_connected_chamber(null) diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 06c7bf13d45f..9f9752fa5cb2 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -69,6 +69,9 @@ on_mob_remove() if(nanites) nanites.programs -= src + for(var/datum/nanite_rule/rule as anything in rules) + rule.remove() + rules.Cut() return ..() /datum/nanite_program/proc/copy() diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index 7e6237dc5744..73c0b2ea8006 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -324,7 +324,7 @@ /datum/nanite_program/dermal_button/on_mob_remove() . = ..() - qdel(button) + QDEL_NULL(button) /datum/nanite_program/dermal_button/proc/press() if(activated) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index be4a4d6714c7..4626e4154cc8 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -462,7 +462,7 @@ for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) if(!(owner in S.Friends)) to_chat(owner, "[linked_extract] pulses gently as it communicates with [S].") - S.Friends[owner] = 1 + S.set_friendship(owner, 1) return ..() /datum/status_effect/stabilized/orange diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index ee581e7ab39c..60a54c461bf1 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -34,7 +34,7 @@ Burning extracts: /obj/item/slimecross/burning/grey/do_effect(mob/user) var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") S.visible_message("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!") - S.Friends[user] = 20 //Gas, gas, gas + S.set_friendship(user, 20) //Gas, gas, gas S.bodytemperature = T0C + 400 //We gonna step on the gas. S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! ..() @@ -201,10 +201,10 @@ Burning extracts: for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user))) if(user in S.Friends) var/friendliness = S.Friends[user] - S.Friends = list() - S.Friends[user] = friendliness + S.clear_friends() + S.set_friendship(user, friendliness) else - S.Friends = list() + S.clear_friends() S.rabid = 1 S.visible_message("The [S] is driven into a dangerous frenzy!") ..() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index ea28f5196e59..d2b1d49f78fe 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -241,7 +241,7 @@ if(X.monkeys >= 1) var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner) if (!QDELETED(food)) - food.LAssailant = C + food.LAssailant = WEAKREF(C) X.monkeys-- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors to_chat(owner, "[X] now has [X.monkeys] monkeys stored.") @@ -443,7 +443,7 @@ if(X.monkeys >= 1) var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) if (!QDELETED(food)) - food.LAssailant = C + food.LAssailant = WEAKREF(C) X.monkeys-- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors to_chat(C, "[X] now has [X.monkeys] monkeys stored.") diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index 6dffbb81272b..1325e40310f9 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -242,7 +242,8 @@ /obj/structure/puzzle_element/Moved() . = ..() - source.validate() + if(source) + source.validate() //Admin abuse version so you can pick the icon before it sets up /obj/effect/sliding_puzzle/admin diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 1538f4d1145a..31a6ee6f0c0f 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -19,6 +19,7 @@ var/datum/team/ashwalkers/ashies var/last_act = 0 var/init_zlevel = 0 //This is my home, I refuse to settle anywhere else. + var/datum/linked_objective /obj/structure/lavaland/ash_walker/Initialize() .=..() @@ -26,9 +27,17 @@ ashies = new /datum/team/ashwalkers() var/datum/objective/protect_object/objective = new objective.set_target(src) + linked_objective = objective ashies.objectives += objective START_PROCESSING(SSprocessing, src) +/obj/structure/lavaland/ash_walker/Destroy() + ashies.objectives -= linked_objective + ashies = null + QDEL_NULL(linked_objective) + STOP_PROCESSING(SSprocessing, src) + return ..() + /obj/structure/lavaland/ash_walker/deconstruct(disassembled) new /obj/item/assembly/signaler/anomaly (get_step(loc, pick(GLOB.alldirs))) new /obj/effect/collapse(loc) diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index 7e133dbe5500..7b900dc579d7 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -61,9 +61,9 @@ /obj/structure/necropolis_gate/singularity_pull() return 0 -/obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/necropolis_gate/CanAllowThrough(atom/movable/mover, border_dir) . = ..() - if(!(get_dir(loc, target) == dir)) + if(border_dir != dir) return TRUE /obj/structure/necropolis_gate/proc/on_exit(datum/source, atom/movable/leaving, direction) diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index e1e2f97fc7cf..e388a577fe1d 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -85,7 +85,7 @@ icon = 'icons/mob/blob.dmi' color = rgb(145, 150, 0) -/obj/effect/gluttony/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff. +/obj/effect/gluttony/CanAllowThrough(atom/movable/mover, border_dir)//So bullets will fly over and stuff. . = ..() if(ishuman(mover)) var/mob/living/carbon/human/H = mover diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index 64b20d8a2eeb..ec0727a2cc24 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -97,9 +97,11 @@ for(var/turf/oldT as anything in old_turfs) oldT.blocks_air = TRUE oldT.set_sleeping(TRUE) + oldT.air_update_turf(TRUE) for(var/turf/newT as anything in new_turfs) newT.blocks_air = TRUE newT.set_sleeping(TRUE) + newT.air_update_turf(TRUE) /obj/docking_port/mobile/proc/throw_exception(exception/e) throw e diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 7b4c75fe0104..2ca64fcd35fc 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -20,8 +20,7 @@ All ShuttleMove procs go here if(!(. & MOVE_TURF)) return - for(var/i in contents) - var/atom/movable/thing = i + for(var/atom/movable/thing as anything in contents) if(ismob(thing)) if(isliving(thing)) var/mob/living/M = thing @@ -40,12 +39,13 @@ All ShuttleMove procs go here else //non-living mobs shouldn't be affected by shuttles, which is why this is an else - if(istype(thing, /obj/singularity) && !istype(thing, /obj/singularity/narsie)) //it's a singularity but not a god, ignore it. - continue - if(!thing.anchored) - qdel(thing) - else + if(!isobj(thing)) qdel(thing) + continue + var/obj/object = thing + if(object.resistance_flags & LANDING_PROOF) + continue + qdel(thing) // Called on the old turf to move the turf data /turf/proc/onShuttleMove(turf/newT, list/movement_force, move_dir, shuttle_layers) @@ -79,11 +79,19 @@ All ShuttleMove procs go here //Dealing with the turf we left behind oldT.TransferComponents(src) SEND_SIGNAL(oldT, COMSIG_TURF_AFTER_SHUTTLE_MOVE, src) //Mostly for decals + + if(rotation) + shuttleRotate(rotation) //see shuttle_rotate.dm + //find the boundary between the shuttle that left and what remains - var/area/ship/A = loc - var/obj/docking_port/mobile/top_shuttle = A?.mobile_port - var/shuttle_layers = -1*A.get_missing_shuttles(src) - for(var/index in 1 to all_towed_shuttles.len) + var/area/ship/ship_area = loc + if(!istype(ship_area)) + return TRUE + + //Only run this code if it's a ship area + var/obj/docking_port/mobile/top_shuttle = ship_area.mobile_port + var/shuttle_layers = -1 * ship_area.get_missing_shuttles(src) + for(var/index in 1 to length(all_towed_shuttles)) var/obj/docking_port/mobile/M = all_towed_shuttles[index] if(!M.underlying_turf_area[src]) continue @@ -103,9 +111,6 @@ All ShuttleMove procs go here if(BT_index != length(baseturfs)) oldT.ScrapeAway(baseturfs.len - BT_index, CHANGETURF_FORCEOP) - if(rotation) - shuttleRotate(rotation) //see shuttle_rotate.dm - return TRUE /turf/proc/lateShuttleMove(turf/oldT) @@ -282,22 +287,6 @@ All ShuttleMove procs go here // atmosinit() calls update_appearance(), so we don't need to call it update_appearance() -/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) - . = ..() - GLOB.navbeacons["[z]"] -= src - GLOB.deliverybeacons -= src - -/obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) - . = ..() - - if(codes["patrol"]) - if(!GLOB.navbeacons["[z]"]) - GLOB.navbeacons["[z]"] = list() - GLOB.navbeacons["[z]"] += src //Register with the patrol list! - if(codes["delivery"]) - GLOB.deliverybeacons += src - GLOB.deliverybeacontags += location - /************************************Item move procs************************************/ /obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) @@ -404,11 +393,3 @@ All ShuttleMove procs go here if((!(src in moving_dock.docking_points) || !towed_shuttles[docked]) && !moving_dock.can_move_docking_ports) return FALSE . = ..() - -/obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, list/obj/docking_port/mobile/towed_shuttles) - . = ..() - //timer so it only happens once - if(!monitor) - qdel(src) - return - addtimer(CALLBACK(monitor, /datum/proximity_monitor/proc/SetRange, monitor.current_range, TRUE), 0, TIMER_UNIQUE) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index f1816cb8b5ef..b89a07efdac5 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -9,7 +9,7 @@ icon = 'icons/obj/device.dmi' icon_state = "pinonfar" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | LANDING_PROOF | HYPERSPACE_PROOF anchored = TRUE ///Common standard is for this to point -away- from the dockingport door, ie towards the ship @@ -29,18 +29,11 @@ //The shuttle docked here/dock we're parked at. var/obj/docking_port/docked - //these objects are indestructible /obj/docking_port/Destroy(force) - // unless you assert that you know what you're doing. Horrible things - // may result. - if(force) - if(docked) - docked.docked = null - docked = null - ..() - . = QDEL_HINT_QUEUE - else - return QDEL_HINT_LETMELIVE + if(docked) + docked.docked = null + docked = null + return ..() /obj/docking_port/has_gravity(turf/T) return FALSE @@ -182,8 +175,12 @@ T.maptext = null if(_color) var/turf/T = locate(L[1], L[2], z) + if(!T) + return T.color = "#0f0" T = locate(L[3], L[4], z) + if(!T) + return T.color = "#00f" #endif @@ -232,9 +229,10 @@ #endif /obj/docking_port/stationary/Destroy(force) - if(force) - SSshuttle.stationary -= src - . = ..() + SSshuttle.stationary -= src + owner_ship?.towed_shuttles -= docked + owner_ship?.docking_points -= src + return ..() /obj/docking_port/stationary/proc/load_roundstart() if(roundstart_template) // passed a PATH @@ -259,18 +257,15 @@ transit_dock_counter++ name = "transit dock [transit_dock_counter]" -/obj/docking_port/stationary/transit/Destroy(force=FALSE) - if(force) - if(docked) - log_world("A transit dock was destroyed while something was docked to it.") - SSshuttle.transit -= src - if(owner) - if(owner.assigned_transit == src) - owner.assigned_transit = null - owner = null - if(!QDELETED(reserved_mapzone)) - qdel(reserved_mapzone) - reserved_mapzone = null +/obj/docking_port/stationary/transit/Destroy(force) + if(!QDELETED(docked)) + log_world("A transit dock was destroyed while something was docked to it.") + SSshuttle.transit -= src + if(owner?.assigned_transit == src) + owner.assigned_transit = null + owner = null + if(!QDELETED(reserved_mapzone)) + QDEL_NULL(reserved_mapzone) return ..() /obj/docking_port/mobile @@ -357,22 +352,44 @@ SSshuttle.mobile += src /obj/docking_port/mobile/Destroy(force) - if(force) - SSshuttle.mobile -= src - destination = null - previous = null - if(!QDELETED(current_ship)) - QDEL_NULL(current_ship) - qdel(assigned_transit, TRUE) //don't need it where we're goin'! - assigned_transit = null - for(var/obj/docking_port/stationary/docking_point as anything in docking_points) - qdel(docking_point, TRUE) - docking_points = null - shuttle_areas = null //TODO: This is nowhere near enough to clear references, lol. We need an /atom/proc/disconnect_from_shuttle() proc to clear references. - towed_shuttles = null - underlying_turf_area = null - remove_ripples() - . = ..() + if(!QDELETED(current_ship)) + message_admins("Shuttle [src] tried to delete at [ADMIN_VERBOSEJMP(src)], but failed!") + stack_trace("Ship attempted deletion while current ship still exists! Aborting!") + return QDEL_HINT_LETMELIVE + + if(SSticker.IsRoundInProgress()) + message_admins("Shuttle [src] deleted at [ADMIN_VERBOSEJMP(src)]") + log_game("Shuttle [src] deleted at [AREACOORD(src)]") + + spawn_points.Cut() + + SSshuttle.mobile -= src + + destination = null + previous = null + + qdel(assigned_transit, TRUE) //don't need it where we're goin'! + assigned_transit = null + for(var/port in docking_points) + qdel(port, TRUE) + //This is only null checked for the very snowflakey reason that it might be deleted before it's loaded properly. + //See the middle of /datum/controller/subsystem/shuttle/proc/load_template() for an example. + docking_points?.Cut() + + //VERY important proc. Should probably get folded into this one, but oh well. + //Requires the shuttle areas list and the towed_shuttles list, and will clear the latter. + jump_to_null_space() + + for(var/area/ship/shuttle_area in shuttle_areas) //TODO: make a disconnect_from_shuttle() proc + shuttle_area.mobile_port = null + shuttle_areas.Cut() + shuttle_areas = null + + remove_ripples() + + underlying_turf_area = null + + return ..() /obj/docking_port/mobile/Initialize(mapload) . = ..() @@ -564,7 +581,7 @@ play_engine_sound(src, launch_sound) -/obj/docking_port/mobile/proc/jumpToNullSpace() +/obj/docking_port/mobile/proc/jump_to_null_space() // Destroys the docking port and the shuttle contents. // Not in a fancy way, it just ceases. @@ -578,9 +595,8 @@ for(var/obj/docking_port/mobile/M in all_towed_shuttles) all_shuttle_areas += M.shuttle_areas - for(var/i in 1 to old_turfs.len) - var/turf/oldT = old_turfs[i] - if(!all_shuttle_areas[oldT?.loc]) + for(var/turf/oldT as anything in old_turfs) + if(!(oldT?.loc in all_shuttle_areas)) continue var/area/old_area = oldT.loc for(var/obj/docking_port/mobile/bottom_shuttle in all_towed_shuttles) @@ -598,24 +614,9 @@ oldT.ScrapeAway(baseturf_cache.len - k + 1) break - for(var/obj/docking_port/mobile/shuttle in all_towed_shuttles) - qdel(shuttle, force=TRUE) - -/obj/docking_port/mobile/proc/intoTheSunset() - // Loop over mobs - for(var/t in return_turfs()) - var/turf/T = t - for(var/mob/living/M in T.GetAllContents()) - // If they have a mind and they're not in the brig, they escaped - if(M.mind && !istype(t, /turf/open/floor/mineral/plastitanium/red/brig)) - M.mind.force_escaped = TRUE - // Ghostize them and put them in nullspace stasis (for stat & possession checks) - M.notransform = TRUE - M.ghostize(FALSE) - M.moveToNullspace() - - // Now that mobs are stowed, delete the shuttle - jumpToNullSpace() + for(var/obj/docking_port/mobile/shuttle in all_towed_shuttles - src) + qdel(shuttle, TRUE) + towed_shuttles.Cut() /obj/docking_port/mobile/proc/create_ripples(obj/docking_port/stationary/S1, animate_time) var/list/turfs = ripple_area(S1) @@ -862,6 +863,15 @@ else . = "unknown" +/obj/docking_port/mobile/proc/get_engines() + . = list() + for(var/datum/weakref/engine in engine_list) + var/obj/structure/shuttle/engine/real_engine = engine.resolve() + if(!real_engine) + engine_list -= engine + continue + . += real_engine + /obj/docking_port/mobile/proc/hyperspace_sound(phase, list/areas) var/selected_sound switch(phase) @@ -879,8 +889,10 @@ var/range = max(width, height) var/long_range = range * 2.5 var/atom/distant_source - if(engine_list[1]) - distant_source = engine_list[1] + var/list/engines = get_engines() + + if(engines[1]) + distant_source = engines[1] else for(var/A in areas) distant_source = locate(/obj/machinery/door) in A @@ -894,11 +906,11 @@ M.playsound_local(distant_source, "sound/runtime/hyperspace/[selected_sound]_distance.ogg", 100) else if(dist_far <= range) var/source - if(engine_list.len == 0) + if(engines.len == 0) source = distant_source else var/closest_dist = 10000 - for(var/obj/O in engine_list) + for(var/obj/O in engines) var/dist_near = get_dist(M, O) if(dist_near < closest_dist) source = O diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index aa2206efb4ba..16abb651b97c 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -230,7 +230,7 @@ var/static/list/check_times = list() var/list/payees = list() -/obj/machinery/scanner_gate/luxury_shuttle/CanAllowThrough(atom/movable/mover, turf/target) +/obj/machinery/scanner_gate/luxury_shuttle/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover in approved_passengers) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 4a791beb5ee7..f91eb07f52cb 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -20,6 +20,12 @@ if(has_action) action = new base_action(src) +/obj/effect/proc_holder/Destroy() + if(!QDELETED(action)) + qdel(action) + action = null + return ..() + /obj/effect/proc_holder/proc/on_gain(mob/living/user) return @@ -512,11 +518,22 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th //Checks for obstacles from A to B var/obj/dummy = new(A.loc) dummy.pass_flags |= PASSTABLE - for(var/turf/turf in getline(A,B)) - for(var/atom/movable/AM in turf) - if(!AM.CanPass(dummy,turf,1)) + var/turf/previous_step = get_turf(A) + var/first_step = TRUE + for(var/turf/next_step as anything in (getline(A, B) - previous_step)) + if(first_step) + for(var/obj/blocker in previous_step) + if(!blocker.density || !(blocker.flags_1 & ON_BORDER_1)) + continue + if(blocker.CanPass(dummy, get_dir(previous_step, next_step))) + continue + return FALSE // Could not leave the first turf. + first_step = FALSE + for(var/atom/movable/movable as anything in next_step) + if(!movable.CanPass(dummy, get_dir(next_step, previous_step))) qdel(dummy) - return 0 + return FALSE + previous_step = next_step qdel(dummy) return 1 diff --git a/code/modules/spells/spell_types/forcewall.dm b/code/modules/spells/spell_types/forcewall.dm index 64eca54e3d7a..62bd538120e1 100644 --- a/code/modules/spells/spell_types/forcewall.dm +++ b/code/modules/spells/spell_types/forcewall.dm @@ -30,11 +30,11 @@ . = ..() wizard = summoner -/obj/effect/forcefield/wizard/CanAllowThrough(atom/movable/mover, turf/target) +/obj/effect/forcefield/wizard/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(mover == wizard) return TRUE - if(ismob(mover)) + if(isliving(mover)) var/mob/M = mover if(M.anti_magic_check(chargecost = 0)) return TRUE diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index aa5eed12dcbd..db92e6530000 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -92,6 +92,9 @@ /obj/item/phylactery/Initialize(mapload, datum/mind/newmind) . = ..() + if(!mind) + stack_trace("A phylactery was created with no target mind") + return INITIALIZE_HINT_QDEL mind = newmind name = "phylactery of [mind.name]" diff --git a/code/modules/spells/spell_types/personality_commune.dm b/code/modules/spells/spell_types/personality_commune.dm index f358f2eb9e7f..1b6389bf3816 100644 --- a/code/modules/spells/spell_types/personality_commune.dm +++ b/code/modules/spells/spell_types/personality_commune.dm @@ -14,6 +14,10 @@ . = ..() trauma = T +/obj/effect/proc_holder/spell/targeted/personality_commune/Destroy() + trauma = null + return ..() + // Pillaged and adapted from telepathy code /obj/effect/proc_holder/spell/targeted/personality_commune/cast(list/targets, mob/user) if(!istype(trauma)) diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index c9101c396334..65eb0cebb2b3 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -120,7 +120,8 @@ src.source = source shape = loc if(!istype(shape)) - CRASH("shapeshift holder created outside mob/living") + stack_trace("shapeshift holder created outside mob/living") + return INITIALIZE_HINT_QDEL stored = caster if(stored.mind) stored.mind.transfer_to(shape) diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index c130dbb57f5b..69649d11aebb 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -9,8 +9,10 @@ /obj/effect/proc_holder/spell/targeted/touch/Destroy() remove_hand() - to_chat(usr, "The power of the spell dissipates from your hand.") - ..() + if(action?.owner) + var/mob/guy_who_needs_to_know = action.owner + to_chat(guy_who_needs_to_know, span_notice("The power of the spell dissipates from your hand.")) + return ..() /obj/effect/proc_holder/spell/targeted/touch/proc/remove_hand(recharge = FALSE) QDEL_NULL(attached_hand) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 73ecf0e52444..ce2ed5e98d40 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -62,6 +62,7 @@ /mob/living/proc/get_missing_limbs() + RETURN_TYPE(/list) return list() /mob/living/carbon/get_missing_limbs() diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 79b674438098..398d937cc586 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -509,12 +509,12 @@ static_icon = 'icons/mob/augmentation/augments_vox.dmi' bodytype = BODYTYPE_VOX | BODYTYPE_ROBOTIC -/obj/item/bodypart/l_leg/robot/vox +/obj/item/bodypart/leg/left/robot/vox name = "prosthetic vox left leg" static_icon = 'icons/mob/augmentation/augments_vox.dmi' bodytype = BODYTYPE_VOX | BODYTYPE_ROBOTIC -/obj/item/bodypart/r_leg/robot/vox +/obj/item/bodypart/leg/right/robot/vox name = "prosthetic vox right leg" static_icon = 'icons/mob/augmentation/augments_vox.dmi' bodytype = BODYTYPE_VOX | BODYTYPE_ROBOTIC diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 524077a19e6f..d9d3d6b0b717 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -5,22 +5,38 @@ icon_state = "implant-toolkit" w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/organ_action/toggle) - - var/list/items_list = list() - // Used to store a list of all items inside, for multi-item implants. - // I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. - - var/obj/item/holder = null - // You can use this var for item path, it would be converted into an item on New() + ///A ref for the arm we're taking up. Mostly for the unregister signal upon removal + var/obj/hand + //A list of typepaths to create and insert into ourself on init + var/list/items_to_create = list() + /// Used to store a list of all items inside, for multi-item implants. + var/list/items_list = list()// I would use contents, but they shuffle on every activation/deactivation leading to interface inconsistencies. + /// You can use this var for item path, it would be converted into an item on New(). + var/obj/item/active_item /obj/item/organ/cyberimp/arm/Initialize() . = ..() - if(ispath(holder)) - holder = new holder(src) + if(ispath(active_item)) + active_item = new active_item(src) + items_list += WEAKREF(active_item) + + for(var/typepath in items_to_create) + var/atom/new_item = new typepath(src) + items_list += WEAKREF(new_item) update_appearance() SetSlotFromZone() - items_list = contents.Copy() + +/obj/item/organ/cyberimp/arm/Destroy() + hand = null + active_item = null + for(var/datum/weakref/ref in items_list) + var/obj/item/to_del = ref.resolve() + if(!to_del) + continue + qdel(to_del) + items_list.Cut() + return ..() /obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() switch(zone) @@ -66,40 +82,40 @@ Retract() /obj/item/organ/cyberimp/arm/proc/Retract() - if(!holder || (holder in src)) + if(!active_item || (active_item in src)) return - owner.visible_message("[owner] retracts [holder] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "[holder] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + owner.visible_message("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", "You hear a short mechanical noise.") - if(istype(holder, /obj/item/assembly/flash/armimplant)) - var/obj/item/assembly/flash/F = holder + if(istype(active_item, /obj/item/assembly/flash/armimplant)) + var/obj/item/assembly/flash/F = active_item F.set_light(0) - owner.transferItemToLoc(holder, src, TRUE) - holder = null + owner.transferItemToLoc(active_item, src, TRUE) + active_item = null playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) /obj/item/organ/cyberimp/arm/proc/Extend(obj/item/item) if(!(item in src)) return - holder = item + active_item = item - ADD_TRAIT(holder, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) - holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - holder.slot_flags = null - holder.set_custom_materials(null) + ADD_TRAIT(active_item, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) + active_item.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + active_item.slot_flags = null + active_item.set_custom_materials(null) - if(istype(holder, /obj/item/assembly/flash/armimplant)) - var/obj/item/assembly/flash/F = holder + if(istype(active_item, /obj/item/assembly/flash/armimplant)) + var/obj/item/assembly/flash/F = active_item F.set_light(7) var/side = zone == BODY_ZONE_R_ARM? RIGHT_HANDS : LEFT_HANDS var/hand = owner.get_empty_held_index_for_side(side) if(hand) - owner.put_in_hand(holder, hand) + owner.put_in_hand(active_item, hand) else var/list/hand_items = owner.get_held_items_for_side(side, all = TRUE) var/success = FALSE @@ -110,32 +126,36 @@ failure_message += "Your [I] interferes with [src]!" continue to_chat(owner, "You drop [I] to activate [src]!") - success = owner.put_in_hand(holder, owner.get_empty_held_index_for_side(side)) + success = owner.put_in_hand(active_item, owner.get_empty_held_index_for_side(side)) break if(!success) for(var/i in failure_message) to_chat(owner, i) return - owner.visible_message("[owner] extends [holder] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", - "You extend [holder] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + owner.visible_message("[owner] extends [active_item] from [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", + "You extend [active_item] from your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm.", "You hear a short mechanical noise.") playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, TRUE) /obj/item/organ/cyberimp/arm/ui_action_click() - if((organ_flags & ORGAN_FAILING) || (!holder && !contents.len)) + if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) to_chat(owner, "The implant doesn't respond. It seems to be broken...") return - if(!holder || (holder in src)) - holder = null + if(!active_item || (active_item in src)) + active_item = null if(contents.len == 1) Extend(contents[1]) else var/list/choice_list = list() - for(var/obj/item/I in items_list) - choice_list[I] = image(I) + for(var/datum/weakref/augment_ref in items_list) + var/obj/item/augment_item = augment_ref.resolve() + if(!augment_item) + items_list -= augment_ref + continue + choice_list[augment_item] = image(augment_item) var/obj/item/choice = show_radial_menu(owner, owner, choice_list) - if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !holder && (choice in contents)) + if(owner && owner == usr && owner.stat != DEAD && (src in owner.internal_organs) && !active_item && (choice in contents)) // This monster sanity check is a nice example of how bad input is. Extend(choice) else @@ -161,7 +181,7 @@ name = "arm-mounted laser implant" desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_laser" - contents = newlist(/obj/item/gun/energy/laser/mounted) + items_to_create = list(/obj/item/gun/energy/laser/mounted) /obj/item/organ/cyberimp/arm/gun/laser/l zone = BODY_ZONE_L_ARM @@ -171,7 +191,7 @@ name = "arm-mounted taser implant" desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arm and remains inside when not in use." icon_state = "arm_taser" - contents = newlist(/obj/item/gun/energy/e_gun/advtaser/mounted) + items_to_create = list(/obj/item/gun/energy/e_gun/advtaser/mounted) /obj/item/organ/cyberimp/arm/gun/taser/l zone = BODY_ZONE_L_ARM @@ -179,64 +199,82 @@ /obj/item/organ/cyberimp/arm/toolset name = "integrated toolset implant" desc = "A stripped-down version of the engineering cyborg toolset, designed to be installed on subject's arm. Contain advanced versions of every tool." - contents = newlist(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg, + items_to_create = list(/obj/item/screwdriver/cyborg, /obj/item/wrench/cyborg, /obj/item/weldingtool/largetank/cyborg, /obj/item/crowbar/cyborg, /obj/item/wirecutters/cyborg, /obj/item/multitool/cyborg) /obj/item/organ/cyberimp/arm/toolset/l zone = BODY_ZONE_L_ARM /obj/item/organ/cyberimp/arm/toolset/emag_act(mob/user) - if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list)) - to_chat(user, "You unlock [src]'s integrated knife!") - items_list += new /obj/item/kitchen/knife/combat/cyborg(src) - return 1 - return 0 + for(var/datum/weakref/created_item in items_list) + var/obj/potential_knife = created_item.resolve() + if(istype(/obj/item/kitchen/knife/combat/cyborg, potential_knife)) + return FALSE + + to_chat(user, "You unlock [src]'s integrated knife!") + items_list += WEAKREF(new /obj/item/kitchen/knife/combat/cyborg(src)) + return TRUE /obj/item/organ/cyberimp/arm/esword name = "arm-mounted energy blade" desc = "An illegal and highly dangerous cybernetic implant that can project a deadly blade of concentrated energy." - contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight) + items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight) /obj/item/organ/cyberimp/arm/medibeam name = "integrated medical beamgun" desc = "A cybernetic implant that allows the user to project a healing beam from their hand." - contents = newlist(/obj/item/gun/medbeam) + items_to_create = list(/obj/item/gun/medbeam) /obj/item/organ/cyberimp/arm/flash name = "integrated high-intensity photon projector" //Why not desc = "An integrated projector mounted onto a user's arm that is able to be used as a powerful flash." - contents = newlist(/obj/item/assembly/flash/armimplant) + items_to_create = list(/obj/item/assembly/flash/armimplant) /obj/item/organ/cyberimp/arm/flash/Initialize() . = ..() - if(locate(/obj/item/assembly/flash/armimplant) in items_list) - var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list - F.I = src + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(/obj/item/assembly/flash/armimplant, potential_flash)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code + +/obj/item/organ/cyberimp/arm/flash/Extend() + . = ..() + active_item.set_light_range(7) + active_item.set_light_on(TRUE) + +/obj/item/organ/cyberimp/arm/flash/Retract() + active_item.set_light_on(FALSE) + return ..() /obj/item/organ/cyberimp/arm/baton name = "arm electrification implant" desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." - contents = newlist(/obj/item/borg/stun) + items_to_create = list(/obj/item/borg/stun) /obj/item/organ/cyberimp/arm/combat name = "combat cybernetics implant" desc = "A powerful cybernetic implant that contains combat modules built into the user's arm." - contents = newlist(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) + items_to_create = list(/obj/item/melee/transforming/energy/blade/hardlight, /obj/item/gun/medbeam, /obj/item/borg/stun, /obj/item/assembly/flash/armimplant) /obj/item/organ/cyberimp/arm/combat/Initialize() . = ..() - if(locate(/obj/item/assembly/flash/armimplant) in items_list) - var/obj/item/assembly/flash/armimplant/F = locate(/obj/item/assembly/flash/armimplant) in items_list - F.I = src + for(var/datum/weakref/created_item in items_list) + var/obj/potential_flash = created_item.resolve() + if(!istype(/obj/item/assembly/flash/armimplant, potential_flash)) + continue + var/obj/item/assembly/flash/armimplant/flash = potential_flash + flash.arm = WEAKREF(src) // Todo: wipe single letter vars out of assembly code /obj/item/organ/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." - contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment) + items_to_create = list(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment) /obj/item/organ/cyberimp/arm/power_cord name = "power cord implant" desc = "An internal power cord hooked up to a battery. Useful if you run on volts." - contents = newlist(/obj/item/apc_powercord) + items_to_create = list(/obj/item/apc_powercord) zone = "l_arm" diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui/tgui_alert.dm index 1a86cca705bd..9d2dd3b5a059 100644 --- a/code/modules/tgui/tgui_alert.dm +++ b/code/modules/tgui/tgui_alert.dm @@ -90,7 +90,7 @@ * the window was closed by the user. */ /datum/tgui_modal/proc/wait() - while (!choice && !closed) + while (!choice && !closed && !QDELETED(src)) stoplag(1) /datum/tgui_modal/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/unit_tests/README.md b/code/modules/unit_tests/README.md new file mode 100644 index 000000000000..5f9a62e124eb --- /dev/null +++ b/code/modules/unit_tests/README.md @@ -0,0 +1,76 @@ +# Unit Tests + +## What is unit testing? + +Unit tests are automated code to verify that parts of the game work exactly as they should. For example, [a test to make sure that the amputation surgery actually amputates the limb](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/surgeries.dm#L1-L13). These are ran every time a PR is made, and thus are very helpful for preventing bugs from cropping up in your code that would've otherwise gone unnoticed. For example, would you have thought to check [that beach boys would still work the same after editing pizza](https://github.com/tgstation/tgstation/pull/53641#issuecomment-691384934)? If you value your time, probably not. + +On their most basic level, when `UNIT_TESTS` is defined, all subtypes of `/datum/unit_test` will have their `Run` proc executed. From here, if `Fail` is called at any point, then the tests will report as failed. + +## How do I write one? +1. Find a relevant file. + +All unit test related code is in `code/modules/unit_tests`. If you are adding a new test for a surgery, for example, then you'd open `surgeries.dm`. If a relevant file does not exist, simply create one in this folder, then `#include` it in `_unit_tests.dm`. + +2. Create the unit test. + +To make a new unit test, you simply need to define a `/datum/unit_test`. + +For example, let's suppose that we are creating a test to make sure a proc `square` correctly raises inputs to the power of two. We'd start with first: + +``` +/datum/unit_test/square/Run() +``` + +This defines our new unit test, `/datum/unit_test/square`. Inside this function, we're then going to run through whatever we want to check. Tests provide a few assertion functions to make this easy. For now, we're going to use `TEST_ASSERT_EQUAL`. + +``` +/datum/unit_test/square/Run() + TEST_ASSERT_EQUAL(square(3), 9, "square(3) did not return 9") + TEST_ASSERT_EQUAL(square(4), 16, "square(4) did not return 16") +``` + +As you can hopefully tell, we're simply checking if the output of `square` matches the output we are expecting. If the test fails, it'll report the error message given as well as whatever the actual output was. + +3. Run the unit test + +Open `code/_compile_options.dm` and uncomment the following line. + +``` +//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between +``` + +Then, run tgstation.dmb in Dream Daemon. Don't bother trying to connect, you won't need to. You'll be able to see the outputs of all the tests. You'll get to see which tests failed and for what reason. If they all pass, you're set! + +## How to think about tests + +Unit tests exist to prevent bugs that would happen in a real game. Thus, they should attempt to emulate the game world wherever possible. For example, the [quick swap sanity test](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/quick_swap_sanity.dm) emulates a *real* scenario of the bug it fixed occurring by creating a character and giving it real items. The unrecommended alternative would be to create special test-only items. This isn't a hard rule, the [reagent method exposure tests](https://github.com/tgstation/tgstation/blob/e416283f162b86345a8623125ab866839b1ac40d/code/modules/unit_tests/reagent_mod_expose.dm) create a test-only reagent for example, but do keep it in mind. + +Unit tests should also be just that--testing *units* of code. For example, instead of having one massive test for reagents, there are instead several smaller tests for testing exposure, metabolization, etc. + +## The unit testing API + +You can find more information about all of these from their respective doc comments, but for a brief overview: + +`/datum/unit_test` - The base for all tests to be ran. Subtypes must override `Run()`. `New()` and `Destroy()` can be used for setup and teardown. To fail, use `TEST_FAIL(reason)`. + +`/datum/unit_test/proc/allocate(type, ...)` - Allocates an instance of the provided type with the given arguments. Is automatically destroyed when the test is over. Commonly seen in the form of `var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human)`. + +`TEST_FAIL(reason)` - Marks a failure at this location, but does not stop the test. + +`TEST_ASSERT(assertion, reason)` - Stops the unit test and fails if the assertion is not met. For example: `TEST_ASSERT(powered(), "Machine is not powered")`. + +`TEST_ASSERT_NOTNULL(a, message)` - Same as `TEST_ASSERT`, but checks if `!isnull(a)`. For example: `TEST_ASSERT_NOTNULL(myatom, "My atom was never set!")`. + +`TEST_ASSERT_NULL(a, message)` - Same as `TEST_ASSERT`, but checks if `isnull(a)`. If not, gives a helpful message showing what `a` was. For example: `TEST_ASSERT_NULL(delme, "Delme was never cleaned up!")`. + +`TEST_ASSERT_EQUAL(a, b, message)` - Same as `TEST_ASSERT`, but checks if `a == b`. If not, gives a helpful message showing what both `a` and `b` were. For example: `TEST_ASSERT_EQUAL(2 + 2, 4, "The universe is falling apart before our eyes!")`. + +`TEST_ASSERT_NOTEQUAL(a, b, message)` - Same as `TEST_ASSERT_EQUAL`, but reversed. + +`TEST_FOCUS(test_path)` - *Only* run the test provided within the parameters. Useful for reducing noise. For example, if we only want to run our example square test, we can add `TEST_FOCUS(/datum/unit_test/square)`. Should *never* be pushed in a pull request--you will be laughed at. + +## Final Notes + +- Writing tests before you attempt to fix the bug can actually speed up development a lot! It means you don't have to go in game and folllow the same exact steps manually every time. This process is known as "TDD" (test driven development). Write the test first, make sure it fails, *then* start work on the fix/feature, and you'll know you're done when your tests pass. If you do try this, do make sure to confirm in a non-testing environment just to double check. +- Make sure that your tests don't accidentally call RNG functions like `prob`. Since RNG is seeded during tests, you may not realize you have until someone else makes a PR and the tests fail! +- Do your best not to change the behavior of non-testing code during tests. While it may sometimes be necessary in the case of situations such as the above, it is still a slippery slope that can lead to the code you're testing being too different from the production environment to be useful. diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 1607229a790a..cc12fe0c638f 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -3,23 +3,65 @@ #ifdef UNIT_TESTS +/// For advanced cases, fail unconditionally but don't return (so a test can return multiple results) +#define TEST_FAIL(reason) (Fail(reason || "No reason", __FILE__, __LINE__)) + /// Asserts that a condition is true /// If the condition is not true, fails the test -#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]") } +#define TEST_ASSERT(assertion, reason) if (!(assertion)) { return Fail("Assertion failed: [reason || "No reason"]", __FILE__, __LINE__) } + +/// Asserts that a parameter is not null +#define TEST_ASSERT_NOTNULL(a, reason) if (isnull(a)) { return Fail("Expected non-null value: [reason || "No reason"]", __FILE__, __LINE__) } + +/// Asserts that a parameter is null +#define TEST_ASSERT_NULL(a, reason) if (!isnull(a)) { return Fail("Expected null value but received [a]: [reason || "No reason"]", __FILE__, __LINE__) } /// Asserts that the two parameters passed are equal, fails otherwise /// Optionally allows an additional message in the case of a failure -#define TEST_ASSERT_EQUAL(a, b, message) if ((a) != (b)) { return Fail("Expected [isnull(a) ? "null" : a] to be equal to [isnull(b) ? "null" : b].[message ? " [message]" : ""]") } +#define TEST_ASSERT_EQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs != rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \ + } \ +} while (FALSE) /// Asserts that the two parameters passed are not equal, fails otherwise /// Optionally allows an additional message in the case of a failure -#define TEST_ASSERT_NOTEQUAL(a, b, message) if ((a) == (b)) { return Fail("Expected [isnull(a) ? "null" : a] to not be equal to [isnull(b) ? "null" : b].[message ? " [message]" : ""]") } +#define TEST_ASSERT_NOTEQUAL(a, b, message) do { \ + var/lhs = ##a; \ + var/rhs = ##b; \ + if (lhs == rhs) { \ + return Fail("Expected [isnull(lhs) ? "null" : lhs] to not be equal to [isnull(rhs) ? "null" : rhs].[message ? " [message]" : ""]", __FILE__, __LINE__); \ + } \ +} while (FALSE) /// *Only* run the test provided within the parentheses /// This is useful for debugging when you want to reduce noise, but should never be pushed /// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)` #define TEST_FOCUS(test_path) ##test_path { focus = TRUE; } +/// Constants indicating unit test completion status +#define UNIT_TEST_PASSED 0 +#define UNIT_TEST_FAILED 1 +#define UNIT_TEST_SKIPPED 2 + +#define TEST_DEFAULT 1 +#define TEST_DEL_WORLD INFINITY + +/// Change color to red on ANSI terminal output, if enabled with -DANSICOLORS. +#ifdef ANSICOLORS +#define TEST_OUTPUT_RED(text) "\x1B\x5B1;31m[text]\x1B\x5B0m" +#else +#define TEST_OUTPUT_RED(text) (text) +#endif +/// Change color to green on ANSI terminal output, if enabled with -DANSICOLORS. +#ifdef ANSICOLORS +#define TEST_OUTPUT_GREEN(text) "\x1B\x5B1;32m[text]\x1B\x5B0m" +#else +#define TEST_OUTPUT_GREEN(text) (text) +#endif + #include "anchored_mobs.dm" #include "autowiki.dm" #include "bespoke_id.dm" @@ -27,35 +69,46 @@ #include "combat.dm" #include "component_tests.dm" #include "connect_loc.dm" +#include "create_and_destroy.dm" +#include "biome_lists.dm" #include "emoting.dm" #include "keybinding_init.dm" #include "machine_disassembly.dm" -#include "outfit_sanity.dm" #include "open_air.dm" +#include "outfit_sanity.dm" #include "overmap.dm" #include "pills.dm" +#include "planet_gen.dm" #include "plantgrowth_tests.dm" +#include "projectiles.dm" #include "quick_swap_sanity.dm" #include "rcd.dm" -#include "projectiles.dm" #include "reactions.dm" #include "reagent_id_typos.dm" #include "reagent_mod_expose.dm" #include "reagent_mod_procs.dm" +#include "reagent_names.dm" #include "reagent_recipe_collisions.dm" #include "resist.dm" +#include "ruin_placement.dm" #include "say.dm" #include "serving_tray.dm" #include "ship_outpost_placement.dm" #include "spawn_humans.dm" +#include "species_unique_id.dm" #include "species_whitelists.dm" +#include "stack_singular_name.dm" #include "subsystem_init.dm" +#include "subsystem_metric_sanity.dm" #include "supply_pack.dm" #include "teleporters.dm" -#include "subsystem_metric_sanity.dm" #include "timer_sanity.dm" #include "unit_test.dm" +#ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter +#include "find_reference_sanity.dm" +#endif + #undef TEST_ASSERT #undef TEST_ASSERT_EQUAL #undef TEST_ASSERT_NOTEQUAL diff --git a/code/modules/unit_tests/anchored_mobs.dm b/code/modules/unit_tests/anchored_mobs.dm index 103b97e7a993..88487ea2b8d7 100644 --- a/code/modules/unit_tests/anchored_mobs.dm +++ b/code/modules/unit_tests/anchored_mobs.dm @@ -4,6 +4,4 @@ var/mob/M = i if(initial(M.anchored)) L += "[i]" - if(!L.len) - return //passed! - Fail("The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") + TEST_ASSERT(!L.len, "The following mobs are defined as anchored. This is incompatible with the new move force/resist system and needs to be revised.: [L.Join(" ")]") diff --git a/code/modules/unit_tests/bespoke_id.dm b/code/modules/unit_tests/bespoke_id.dm index 06676c626c7e..e1356650ded2 100644 --- a/code/modules/unit_tests/bespoke_id.dm +++ b/code/modules/unit_tests/bespoke_id.dm @@ -5,4 +5,4 @@ for(var/i in subtypesof(/datum/element)) var/datum/element/faketype = i if((initial(faketype.element_flags) & ELEMENT_BESPOKE) && initial(faketype.id_arg_index) == base_index) - Fail("A bespoke element was not configured with a proper id_arg_index: [faketype]") + TEST_FAIL("A bespoke element was not configured with a proper id_arg_index: [faketype]") diff --git a/code/modules/unit_tests/biome_lists.dm b/code/modules/unit_tests/biome_lists.dm new file mode 100644 index 000000000000..7c7500155235 --- /dev/null +++ b/code/modules/unit_tests/biome_lists.dm @@ -0,0 +1,18 @@ +/datum/unit_test/biome_lists/Run() + for(var/biome_type as anything in SSmapping.biomes) + var/datum/biome/biome = SSmapping.biomes[biome_type] + + validate_chance(biome.mob_spawn_list, "mob spawn", biome_type) + validate_chance(biome.flora_spawn_list, "flora spawn", biome_type) + validate_chance(biome.feature_spawn_list, "feature spawn", biome_type) + +/datum/unit_test/biome_lists/proc/validate_chance(list/to_check, name, biome) + if(to_check && !islist(to_check)) + TEST_FAIL("Biome [biome] has invalid [name] list") + for(var/type in to_check) + var/value = to_check[type] + if(!value) + TEST_FAIL("Biome [biome] has no [name] weight for [type]") + return + if(!isnum(value) || value < 1 || value != round(value)) + TEST_FAIL("Biome [biome] has invalid [name] chance for [type] ([value])") diff --git a/code/modules/unit_tests/component_tests.dm b/code/modules/unit_tests/component_tests.dm index 0099d7508c5d..f609e73c4b72 100644 --- a/code/modules/unit_tests/component_tests.dm +++ b/code/modules/unit_tests/component_tests.dm @@ -8,5 +8,5 @@ var/dupe_type = initial(comp.dupe_type) if(dupe_type && !ispath(dupe_type)) bad_dts += t - if(length(bad_dms) || length(bad_dts)) - Fail("Components with invalid dupe modes: ([bad_dms.Join(",")]) ||| Components with invalid dupe types: ([bad_dts.Join(",")])") + TEST_ASSERT(!length(bad_dms) && !length(bad_dts), + "Components with invalid dupe modes: ([bad_dms.Join(",")]) ||| Components with invalid dupe types: ([bad_dts.Join(",")])") diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm new file mode 100644 index 000000000000..017356d9152a --- /dev/null +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -0,0 +1,219 @@ +///Delete one of every type, sleep a while, then check to see if anything has gone fucky +/datum/unit_test/create_and_destroy + //You absolutely must run last + priority = TEST_DEL_WORLD + +/datum/unit_test/create_and_destroy/Run() + //We'll spawn everything here + var/turf/spawn_at = run_loc_bottom_left + var/list/ignore = list( + //Should never exist + /turf, + //No-op + /turf/template_noop, + //Never meant to be created, errors out the ass for mobcode reasons + /mob/living/carbon, + //And another + /obj/item/slimecross/recurring, + //This should be obvious + /obj/machinery/doomsday_device, + //Template type + /obj/effect/mob_spawn, + //Say it with me now, type template + /obj/effect/mapping_helpers/component_injector, + //template type + /obj/effect/mapping_helpers/trait_injector, + //Singleton + /mob/dview, + //Template + /obj/effect/mapping_helpers/custom_icon, + //Needs an implant inside + /obj/item/implantcase, + //Needs a ship + /obj/item/key/ship, + //Template + /obj/machinery/power/shuttle/engine/liquid, + //needs a template + /obj/effect/landmark/subship, + //needs a friend :( + /obj/effect/mob_spawn/human/demonic_friend, + //needs a derg + /obj/structure/carp_rift, + //doesn't have icons + /obj/item/bodypart, + /obj/item/bodypart/chest, + /obj/item/bodypart/head, + /obj/item/bodypart/l_arm, + /obj/item/bodypart/r_arm, + /obj/item/bodypart/leg, + //fucking explodes when created + /obj/item/grown/bananapeel/bombanana, + ) + //This turf existing is an error in and of itself + ignore += typesof(/turf/baseturf_skipover) + ignore += typesof(/turf/baseturf_bottom) + //Don't spam out baseturfs + ignore += typesof(/obj/effect/baseturf_helper) + //Needs a contractee + ignore += typesof(/obj/item/paper/contract) + //This demands a borg, so we'll let if off easy + ignore += typesof(/obj/item/modular_computer/tablet/integrated) + //This one demands a computer, ditto + ignore += typesof(/obj/item/modular_computer/processor) + //Very finiky, blacklisting to make things easier + ignore += typesof(/obj/item/poster/wanted) + //We can't pass a mind into this + ignore += typesof(/obj/item/phylactery) + //This expects a seed, we can't pass it + ignore += typesof(/obj/item/reagent_containers/food/snacks/grown) + //Nothing to hallucinate if there's nothing to hallicinate + ignore += typesof(/obj/effect/hallucination) + //We don't have a pod + ignore += typesof(/obj/effect/pod_landingzone_effect) + ignore += typesof(/obj/effect/pod_landingzone) + //These want fried food to take on the shape of, we can't pass that in + ignore += typesof(/obj/item/reagent_containers/food/snacks/deepfryholder) + //Can't pass in a thing to glow + ignore += typesof(/obj/effect/abstract/eye_lighting) + //It wants a lot more context then we have + ignore += typesof(/obj/effect/buildmode_line) + //We don't have a disease to pass in + ignore += typesof(/obj/effect/mapping_helpers/component_injector/infective) + //There's no shapeshift to hold + ignore += typesof(/obj/shapeshift_holder) + //No tauma to pass in + ignore += typesof(/mob/camera/imaginary_friend) + //No pod to gondola + ignore += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) + //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky + ignore += typesof(/obj/effect/anomaly/grav/high) + //See above + ignore += typesof(/obj/effect/timestop) + //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not + ignore += typesof(/obj/effect/sliding_puzzle) + //Stacks baseturfs, can't be tested here + ignore += typesof(/obj/effect/temp_visual/lava_warning) + //Stacks baseturfs, can't be tested here + ignore += typesof(/obj/effect/ctf) + //Our system doesn't support it without warning spam from unregister calls on things that never registered + ignore += typesof(/obj/docking_port) + //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK + ignore += typesof(/obj/structure/alien/resin/flower_bud_enemy) + //Expects a mob to holderize, we have nothing to give + ignore += typesof(/obj/item/clothing/head/mob_holder) + //Needs ships + ignore += typesof(/obj/overmap) + //Needs a holopad + ignore += typesof(/mob/living/simple_animal/hologram) + //Needs an elevator + ignore += typesof(/obj/machinery/status_display/elevator) + ignore += typesof(/obj/machinery/elevator_floor_button) + + var/list/cached_contents = spawn_at.contents.Copy() + var/original_turf_type = spawn_at.type + var/original_baseturfs = islist(spawn_at.baseturfs) ? spawn_at.baseturfs.Copy() : spawn_at.baseturfs + var/original_baseturf_count = length(original_baseturfs) + + for(var/type_path in typesof(/atom/movable, /turf) - ignore) //No areas please + if(ispath(type_path, /turf)) + spawn_at.ChangeTurf(type_path) + //We change it back to prevent baseturfs stacking and hitting the limit + spawn_at.ChangeTurf(original_turf_type, original_baseturfs) + if(original_baseturf_count != length(spawn_at.baseturfs)) + TEST_FAIL("[type_path] changed the amount of baseturfs from [original_baseturf_count] to [length(spawn_at.baseturfs)]; [english_list(original_baseturfs)] to [islist(spawn_at.baseturfs) ? english_list(spawn_at.baseturfs) : spawn_at.baseturfs]") + //Warn if it changes again + original_baseturfs = islist(spawn_at.baseturfs) ? spawn_at.baseturfs.Copy() : spawn_at.baseturfs + original_baseturf_count = length(original_baseturfs) + else + var/atom/creation = new type_path(spawn_at) + if(QDELETED(creation)) + continue + //Go all in + qdel(creation, force = TRUE) + //This will hold a ref to the last thing we process unless we set it to null + //Yes byond is fucking sinful + creation = null + + //There's a lot of stuff that either spawns stuff in on create, or removes stuff on destroy. Let's cut it all out so things are easier to deal with + var/list/to_del = spawn_at.contents - cached_contents + if(length(to_del)) + for(var/atom/to_kill in to_del) + qdel(to_kill) + + //Hell code, we're bound to have ended the round somehow so let's stop if from ending while we work + SSticker.delay_end = TRUE + + // Drastically lower the amount of time it takes to GC, since we don't have clients that can hold it up. + SSgarbage.collection_timeout[GC_QUEUE_CHECK] = 10 SECONDS + //Prevent the garbage subsystem from harddeling anything, if only to save time + SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 10000 HOURS + //Clear it, just in case + cached_contents.Cut() + + var/list/queues_we_care_about = list() + // All up to harddel + for(var/i in 1 to GC_QUEUE_HARDDELETE - 1) + queues_we_care_about += i + + //Now that we've qdel'd everything, let's sleep until the gc has processed all the shit we care about + // + 2 seconds to ensure that everything gets in the queue. + var/time_needed = 2 SECONDS + for(var/index in queues_we_care_about) + time_needed += SSgarbage.collection_timeout[index] + + var/start_time = world.time + var/garbage_queue_processed = FALSE + + sleep(time_needed) + while(!garbage_queue_processed) + var/oldest_packet_creation = INFINITY + for(var/index in queues_we_care_about) + var/list/queue_to_check = SSgarbage.queues[index] + if(!length(queue_to_check)) + continue + + var/list/oldest_packet = queue_to_check[1] + //Pull out the time we inserted at + var/qdeld_at = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED] + + oldest_packet_creation = min(qdeld_at, oldest_packet_creation) + + //If we've found a packet that got del'd later then we finished, then all our shit has been processed + if(oldest_packet_creation > start_time) + garbage_queue_processed = TRUE + break + + if(world.time > start_time + time_needed + 30 MINUTES) //If this gets us gitbanned I'm going to laugh so hard + TEST_FAIL("Something has gone horribly wrong, the garbage queue has been processing for well over 30 minutes. What the hell did you do") + break + + //Immediately fire the gc right after + SSgarbage.next_fire = 1 + //Unless you've seriously fucked up, queue processing shouldn't take "that" long. Let her run for a bit, see if anything's changed + sleep(20 SECONDS) + + //Alright, time to see if anything messed up + var/list/cache_for_sonic_speed = SSgarbage.items + for(var/path in cache_for_sonic_speed) + var/datum/qdel_item/item = cache_for_sonic_speed[path] + if(item.failures) + TEST_FAIL("[item.name] hard deleted [item.failures] times out of a total del count of [item.qdels]") + if(item.no_respect_force) + TEST_FAIL("[item.name] failed to respect force deletion [item.no_respect_force] times out of a total del count of [item.qdels]") + if(item.no_hint) + TEST_FAIL("[item.name] failed to return a qdel hint [item.no_hint] times out of a total del count of [item.qdels]") + + cache_for_sonic_speed = SSatoms.BadInitializeCalls + for(var/path in cache_for_sonic_speed) + var/fails = cache_for_sonic_speed[path] + if(fails & BAD_INIT_NO_HINT) + TEST_FAIL("[path] didn't return an Initialize hint") + if(fails & BAD_INIT_QDEL_BEFORE) + TEST_FAIL("[path] qdel'd in New()") + if(fails & BAD_INIT_SLEPT) + TEST_FAIL("[path] slept during Initialize()") + + SSticker.delay_end = FALSE + //This shouldn't be needed, but let's be polite + SSgarbage.collection_timeout[GC_QUEUE_CHECK] = GC_CHECK_QUEUE + SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = GC_DEL_QUEUE diff --git a/code/modules/unit_tests/find_reference_sanity.dm b/code/modules/unit_tests/find_reference_sanity.dm new file mode 100644 index 000000000000..67b6072d3b96 --- /dev/null +++ b/code/modules/unit_tests/find_reference_sanity.dm @@ -0,0 +1,132 @@ +///Used to test the completeness of the reference finder proc. +/datum/unit_test/find_reference_sanity + +/atom/movable/ref_holder + var/static/atom/movable/ref_test/static_test + var/atom/movable/ref_test/test + var/list/test_list = list() + var/list/test_assoc_list = list() + +/atom/movable/ref_holder/Destroy() + test = null + static_test = null + test_list.Cut() + test_assoc_list.Cut() + return ..() + +/atom/movable/ref_test + var/atom/movable/ref_test/self_ref + +/atom/movable/ref_test/Destroy(force) + self_ref = null + return ..() + +/datum/unit_test/find_reference_sanity/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Sanity check + victim.DoSearchVar(testbed, "Sanity Check", search_time = 1) //We increment search time to get around an optimization + TEST_ASSERT(!victim.found_refs.len, "The ref-tracking tool found a ref where none existed") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_baseline/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Set up for the first round of tests + testbed.test = victim + testbed.test_list += victim + testbed.test_assoc_list["baseline"] = victim + + victim.DoSearchVar(testbed, "First Run", search_time = 2) + + TEST_ASSERT(victim.found_refs["test"], "The ref-tracking tool failed to find a regular value") + TEST_ASSERT(victim.found_refs[testbed.test_list], "The ref-tracking tool failed to find a list entry") + TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list value") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_exotic/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Second round, bit harder this time + testbed.overlays += victim + testbed.vis_contents += victim + testbed.test_assoc_list[victim] = TRUE + + victim.DoSearchVar(testbed, "Second Run", search_time = 3) + + //This is another sanity check + TEST_ASSERT(!victim.found_refs[testbed.overlays], "The ref-tracking tool found an overlays entry? That shouldn't be possible") + TEST_ASSERT(victim.found_refs[testbed.vis_contents], "The ref-tracking tool failed to find a vis_contents entry") + TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list key") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_esoteric/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Let's get a bit esoteric + victim.self_ref = victim + var/list/to_find = list(victim) + testbed.test_list += list(to_find) + var/list/to_find_assoc = list(victim) + testbed.test_assoc_list["Nesting"] = to_find_assoc + + victim.DoSearchVar(victim, "Third Run Self", search_time = 4) + victim.DoSearchVar(testbed, "Third Run Testbed", search_time = 4) + TEST_ASSERT(victim.found_refs["self_ref"], "The ref-tracking tool failed to find a self reference") + TEST_ASSERT(victim.found_refs[to_find], "The ref-tracking tool failed to find a nested list entry") + TEST_ASSERT(victim.found_refs[to_find_assoc], "The ref-tracking tool failed to find a nested assoc list entry") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_null_key_entry/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Calm before the storm + testbed.test_assoc_list = list(null = victim) + + victim.DoSearchVar(testbed, "Fourth Run", search_time = 5) + TEST_ASSERT(testbed.test_assoc_list, "The ref-tracking tool failed to find a null key'd assoc list entry") + +/datum/unit_test/find_reference_assoc_investigation/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Let's do some more complex assoc list investigation + var/list/to_find_in_key = list(victim) + testbed.test_assoc_list[to_find_in_key] = list("memes") + var/list/to_find_null_assoc_nested = list(victim) + testbed.test_assoc_list[null] = to_find_null_assoc_nested + + victim.DoSearchVar(testbed, "Fifth Run", search_time = 6) + TEST_ASSERT(victim.found_refs[to_find_in_key], "The ref-tracking tool failed to find a nested assoc list key") + TEST_ASSERT(victim.found_refs[to_find_null_assoc_nested], "The ref-tracking tool failed to find a null key'd nested assoc list entry") + SSgarbage.should_save_refs = FALSE + +/datum/unit_test/find_reference_static_investigation/Run() + var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) + var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) + SSgarbage.should_save_refs = TRUE + + //Lets check static vars now, since those can be a real headache + testbed.static_test = victim + + //Yes we do actually need to do this. The searcher refuses to read weird lists + //And global.vars is a really weird list + var/global_vars = list() + for(var/key in global.vars) + global_vars[key] = global.vars[key] + + victim.DoSearchVar(global_vars, "Sixth Run", search_time = 7) + + TEST_ASSERT(victim.found_refs[global_vars], "The ref-tracking tool failed to find a natively global variable") + SSgarbage.should_save_refs = FALSE diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm index 2bd2fdee1e2e..c9d17f688afd 100644 --- a/code/modules/unit_tests/keybinding_init.dm +++ b/code/modules/unit_tests/keybinding_init.dm @@ -3,4 +3,4 @@ var/datum/keybinding/KB = i if(initial(KB.keybind_signal) || !initial(KB.name)) continue - Fail("[KB.name] does not have a keybind signal defined.") + TEST_FAIL("[KB.name] does not have a keybind signal defined.") diff --git a/code/modules/unit_tests/open_air.dm b/code/modules/unit_tests/open_air.dm index d2ead5c53ed4..969e1f7561cc 100644 --- a/code/modules/unit_tests/open_air.dm +++ b/code/modules/unit_tests/open_air.dm @@ -9,19 +9,19 @@ SSair.fire() sleep(1) if(center_turf.air.get_moles(GAS_PLASMA) > 28) - Fail("Gas isn't moving at all, or isn't moving enough (somehow) (plasma started at 32, is now [center_turf.air.get_moles(GAS_PLASMA)]") + TEST_FAIL("Gas isn't moving at all, or isn't moving enough (somehow) (plasma started at 32, is now [center_turf.air.get_moles(GAS_PLASMA)]") center_turf.air.set_moles(GAS_PLASMA, 100) center_turf.air.set_moles(GAS_O2, 100/1.4) center_turf.air.set_temperature(5000) center_turf.air.vv_react(center_turf) if(center_turf.air.get_moles(GAS_PLASMA) >= 100) - Fail("Gas isn't reacting properly (plasma: [center_turf.air.get_moles(GAS_PLASMA)], temp: [center_turf.air.return_temperature()]") + TEST_FAIL("Gas isn't reacting properly (plasma: [center_turf.air.get_moles(GAS_PLASMA)], temp: [center_turf.air.return_temperature()]") var/obj/effect/hotspot = locate(/obj/effect/hotspot) in center_turf if(!istype(hotspot)) - Fail("Hotspots aren't showing up on reaction") + TEST_FAIL("Hotspots aren't showing up on reaction") /datum/unit_test/open_air/Destroy() var/datum/virtual_level/vlevel = mapzone.virtual_levels[1] for(var/turf/T in vlevel.get_block()) T.Initalize_Atmos(0) - ..() + return ..() diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index ef41539c9019..fee653cd626f 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -1,8 +1,9 @@ #define CHECK_OUTFIT_SLOT(outfit_key, slot_name) if (outfit.##outfit_key) { \ H.equip_to_slot_or_del(new outfit.##outfit_key(H), ##slot_name, TRUE); \ /* We don't check the result of equip_to_slot_or_del because it returns false for random jumpsuits, as they delete themselves on init */ \ - if (!H.get_item_by_slot(##slot_name)) { \ - Fail("[outfit.name]'s [#outfit_key] is invalid!"); \ + var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \ + if (!outfit_item) { \ + TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \ } \ } @@ -56,6 +57,6 @@ var/number = backpack_contents[path] || 1 for (var/_ in 1 to number) if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE)) - Fail("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.") + TEST_FAIL("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.") #undef CHECK_OUTFIT_SLOT diff --git a/code/modules/unit_tests/planet_gen.dm b/code/modules/unit_tests/planet_gen.dm new file mode 100644 index 000000000000..fdcfda1faeaa --- /dev/null +++ b/code/modules/unit_tests/planet_gen.dm @@ -0,0 +1,19 @@ +/datum/unit_test/planet_gen/Run() + var/datum/map_zone/mapzone = SSmapping.create_map_zone("Planet Generation Testing Zone") + for(var/planet_name as anything in SSmapping.planet_types) + var/datum/planet_type/planet_type = SSmapping.planet_types[planet_name] + var/datum/map_generator/mapgen = new planet_type.mapgen + var/datum/virtual_level/vlevel = SSmapping.create_virtual_level( + planet_name, + list(ZTRAIT_MINING = TRUE, ZTRAIT_BASETURF = planet_type.default_baseturf), + mapzone, + QUADRANT_MAP_SIZE, + QUADRANT_MAP_SIZE, + ALLOCATION_QUADRANT, + QUADRANT_MAP_SIZE + ) + mapgen.generate_turfs(vlevel.get_unreserved_block()) + mapgen.populate_turfs(vlevel.get_unreserved_block()) + vlevel.clear_reservation() + qdel(vlevel) + qdel(mapzone) diff --git a/code/modules/unit_tests/plantgrowth_tests.dm b/code/modules/unit_tests/plantgrowth_tests.dm index 15c56a12ec1d..daff6cccb8c2 100644 --- a/code/modules/unit_tests/plantgrowth_tests.dm +++ b/code/modules/unit_tests/plantgrowth_tests.dm @@ -16,11 +16,11 @@ for(var/i in 1 to seed.growthstages) if("[seed.icon_grow][i]" in states) continue - Fail("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!") + TEST_FAIL("[seed.name] ([seed.type]) lacks the [seed.icon_grow][i] icon!") if(!(seed.icon_dead in states)) - Fail("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!") + TEST_FAIL("[seed.name] ([seed.type]) lacks the [seed.icon_dead] icon!") if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product if(!(seed.icon_harvest in states)) - Fail("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!") + TEST_FAIL("[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!") diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index 06a8fb0780a9..4950be10c1a6 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -2,4 +2,26 @@ for(var/path in typesof(/obj/projectile)) var/obj/projectile/projectile = path if(initial(projectile.movement_type) & PHASING) - Fail("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") + TEST_FAIL("[path] has default movement type PHASING. Piercing projectiles should be done using the projectile piercing system, not movement_types!") + +/datum/unit_test/gun_go_bang/Run() + // test is for a ballistic gun that starts loaded + chambered + var/obj/item/gun/test_gun = allocate(/obj/item/gun/ballistic/automatic/pistol) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/gunner = allocate(/mob/living/carbon/human) + ADD_TRAIT(victim, TRAIT_PIERCEIMMUNE, INNATE_TRAIT) // So the human isn't randomly affected by shrapnel + + var/obj/item/ammo_casing/loaded_casing = test_gun.chambered + TEST_ASSERT(loaded_casing, "Gun started without round chambered, should be loaded") + var/obj/projectile/loaded_bullet = loaded_casing.BB + TEST_ASSERT(loaded_bullet, "Ammo casing has no loaded bullet") + + gunner.put_in_hands(test_gun, forced=TRUE) + var/expected_damage = loaded_bullet.damage + loaded_bullet.def_zone = BODY_ZONE_CHEST + var/did_we_shoot = test_gun.afterattack(victim, gunner) + TEST_ASSERT(did_we_shoot, "Gun does not appeared to have successfully fired.") + TEST_ASSERT_EQUAL(victim.getBruteLoss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.getBruteLoss()].") + + var/obj/item/bodypart/expected_part = victim.get_bodypart(BODY_ZONE_CHEST) + TEST_ASSERT_EQUAL(expected_part.brute_dam, expected_damage, "Intended bodypart took incorrect amount of damage, either it hit another bodypart or armor was incorrectly applied. Expected [expected_damage], got [expected_part.brute_dam].") diff --git a/code/modules/unit_tests/rcd.dm b/code/modules/unit_tests/rcd.dm index 989ac8c3b9c5..b65d02312a78 100644 --- a/code/modules/unit_tests/rcd.dm +++ b/code/modules/unit_tests/rcd.dm @@ -19,8 +19,7 @@ var/list/adjacent_turfs = get_adjacent_open_turfs(engineer) - if(!length(adjacent_turfs)) - Fail("RCD Test failed - Lack of adjacent open turfs. This may be an issue with the unit test.") + TEST_ASSERT(length(adjacent_turfs), "RCD Test failed - Lack of adjacent open turfs. This may be an issue with the unit test.") var/turf/adjacent_turf = adjacent_turfs[1] diff --git a/code/modules/unit_tests/reactions.dm b/code/modules/unit_tests/reactions.dm index 66d9b490991c..7a48aeb6dd7a 100644 --- a/code/modules/unit_tests/reactions.dm +++ b/code/modules/unit_tests/reactions.dm @@ -3,4 +3,4 @@ var/test_info = G.test() if(!test_info["success"]) var/message = test_info["message"] - Fail("Gas reaction [G.name] is failing its unit test with the following message: [message]") + TEST_FAIL("Gas reaction [G.name] is failing its unit test with the following message: [message]") diff --git a/code/modules/unit_tests/reagent_id_typos.dm b/code/modules/unit_tests/reagent_id_typos.dm index d6548852fa52..f85834999962 100644 --- a/code/modules/unit_tests/reagent_id_typos.dm +++ b/code/modules/unit_tests/reagent_id_typos.dm @@ -11,4 +11,4 @@ var/datum/chemical_reaction/R = V for(var/id in (R.required_reagents + R.required_catalysts)) if(!GLOB.chemical_reagents_list[id]) - Fail("Unknown chemical id \"[id]\" in recipe [R.type]") + TEST_FAIL("Unknown chemical id \"[id]\" in recipe [R.type]") diff --git a/code/modules/unit_tests/reagent_names.dm b/code/modules/unit_tests/reagent_names.dm new file mode 100644 index 000000000000..b7a690e93485 --- /dev/null +++ b/code/modules/unit_tests/reagent_names.dm @@ -0,0 +1,15 @@ +/// Test that all reagent names are different in order to prevent #65231 +/datum/unit_test/reagent_names + +/datum/unit_test/reagent_names/Run() + var/used_names = list() + + for (var/datum/reagent/reagent as anything in subtypesof(/datum/reagent)) + var/name = initial(reagent.name) + if (!name) + continue + + if (name in used_names) + TEST_FAIL("[used_names[name]] shares a name with [reagent] ([name])") + else + used_names[name] = reagent diff --git a/code/modules/unit_tests/reagent_recipe_collisions.dm b/code/modules/unit_tests/reagent_recipe_collisions.dm index 20e875422f29..b75a17a7e73c 100644 --- a/code/modules/unit_tests/reagent_recipe_collisions.dm +++ b/code/modules/unit_tests/reagent_recipe_collisions.dm @@ -12,4 +12,4 @@ var/datum/chemical_reaction/r1 = reactions[i] var/datum/chemical_reaction/r2 = reactions[i2] if(chem_recipes_do_conflict(r1, r2)) - Fail("Chemical recipe conflict between [r1.type] and [r2.type]") + TEST_FAIL("Chemical recipe conflict between [r1.type] and [r2.type]") diff --git a/code/modules/unit_tests/ruin_placement.dm b/code/modules/unit_tests/ruin_placement.dm new file mode 100644 index 000000000000..1df3560ed710 --- /dev/null +++ b/code/modules/unit_tests/ruin_placement.dm @@ -0,0 +1,53 @@ +/datum/unit_test/ruin_placement/Run() + var/datum/map_zone/mapzone = SSmapping.create_map_zone("Ruin Testing Zone") + for(var/planet_name as anything in SSmapping.planet_types) + var/datum/planet_type/planet_type = SSmapping.planet_types[planet_name] + for(var/ruin_name as anything in SSmapping.ruin_types_list[planet_type.ruin_type]) + var/datum/map_template/ruin/ruin = SSmapping.ruin_types_list[planet_type.ruin_type][ruin_name] + var/datum/virtual_level/vlevel = SSmapping.create_virtual_level( + ruin.name, + list(ZTRAIT_MINING = TRUE, ZTRAIT_BASETURF = planet_type.default_baseturf), + mapzone, + ruin.width, + ruin.height + ) + + ruin.load(vlevel.get_unreserved_bottom_left_turf()) + + var/list/errors = atmosscan(TRUE, TRUE) + //errors += powerdebug(TRUE) + + for(var/error in errors) + Fail("Mapping error in [ruin_name]: [error]", ruin.mappath, 1) + + vlevel.clear_reservation() + qdel(vlevel) + + qdel(mapzone) + +/* Slow, and usually unecessary +/datum/unit_test/direct_tmpl_placement/Run() + SSair.is_test_loading = TRUE + var/datum/map_zone/mapzone = SSmapping.create_map_zone("Template Testing Zone") + for(var/ship_name as anything in SSmapping.map_templates) + var/datum/map_template/template = SSmapping.map_templates[ship_name] + var/datum/virtual_level/vlevel = SSmapping.create_virtual_level( + template.name, + list(), + mapzone, + template.width, + template.height + ) + + template.load(vlevel.get_unreserved_bottom_left_turf()) + + var/list/errors = atmosscan(TRUE) + //errors += powerdebug(TRUE) + + for(var/error in errors) + Fail("Mapping error in [ship_name]: [error]", template.mappath, 1) + + vlevel.clear_reservation() + qdel(vlevel) + SSair.is_test_loading = FALSE +*/ diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index db686aa7db8f..d3fa6e6cdfc7 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -19,5 +19,5 @@ TEST_ASSERT_EQUAL(mods[mod_key], expected_mods[mod_key], "The value for [mod_key] was not what we expected. Message: [message]") expected_mods -= mod_key - if (expected_mods.len) - Fail("Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") + TEST_ASSERT(!expected_mods.len, + "Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") diff --git a/code/modules/unit_tests/ship_outpost_placement.dm b/code/modules/unit_tests/ship_outpost_placement.dm index 6042f42d5fd6..e1e27097ee6f 100644 --- a/code/modules/unit_tests/ship_outpost_placement.dm +++ b/code/modules/unit_tests/ship_outpost_placement.dm @@ -1,19 +1,11 @@ /datum/unit_test/ship_outpost_placement/Run() - SSair.is_test_loading = TRUE for(var/mapname as anything in SSmapping.ship_purchase_list) var/datum/map_template/shuttle/map = SSmapping.ship_purchase_list[mapname] try // they'll spawn in empty space, and won't be docked new /datum/overmap/ship/controlled(list("x" = 1, "y" = 1), map) catch(var/exception/e) - Fail("Runtime error loading ship type ([map.name]): [e] on [e.file]:[e.line]\n[e.desc]") - SSair.is_test_loading = FALSE - - var/list/errors = atmosscan(TRUE) - errors += powerdebug(TRUE) - - for(var/error in errors) - Fail("[error]") + TEST_FAIL("Runtime error loading ship type ([map.name]): [e] on [e.file]:[e.line]\n[e.desc]") for(var/outpost_type in subtypesof(/datum/overmap/outpost)) var/datum/overmap/outpost/test_outpost = new outpost_type() @@ -28,8 +20,17 @@ found_dock = TRUE break if(!found_dock) - Fail("[cur_ship.source_template.name] was unable to dock with [test_outpost.type]!") + TEST_FAIL("[cur_ship.source_template.name] was unable to dock with [test_outpost.type]!") // keeps ships ready for the next test, and stops us from loading 50 duplicate hangars if(cur_ship.docked_to) cur_ship.Undock(TRUE) + + var/list/errors = atmosscan(TRUE) + errors += powerdebug(TRUE) + + for(var/error in errors) + TEST_FAIL("Mapping error: [error]") + + for(var/datum/overmap/ship/controlled/deleting_ship as anything in SSovermap.controlled_ships) + qdel(deleting_ship) diff --git a/code/modules/unit_tests/species_unique_id.dm b/code/modules/unit_tests/species_unique_id.dm new file mode 100644 index 000000000000..d9fc2f288c91 --- /dev/null +++ b/code/modules/unit_tests/species_unique_id.dm @@ -0,0 +1,14 @@ +/** + * Every species should use a species ID unique to it and it alone. This test runs through every subtype of /datum/species, and checks for a species ID. + * Every ID is written to a list, gathered_species_ids, and if a previously written ID is written again, this test will fail. + */ +/datum/unit_test/species_unique_id + +/datum/unit_test/species_unique_id/Run() + var/list/gathered_species_ids = list() + for(var/datum/species/species as anything in subtypesof(/datum/species)) + var/species_id = initial(species.id) + if(gathered_species_ids[species_id]) + TEST_FAIL("Duplicate species ID! [species_id] is not unique to a single species.") + else + gathered_species_ids[species_id] = TRUE diff --git a/code/modules/unit_tests/species_whitelists.dm b/code/modules/unit_tests/species_whitelists.dm index 145f3a259fc2..ec05d0cf9f8f 100644 --- a/code/modules/unit_tests/species_whitelists.dm +++ b/code/modules/unit_tests/species_whitelists.dm @@ -2,4 +2,4 @@ for(var/typepath in subtypesof(/datum/species)) var/datum/species/S = typepath if(initial(S.changesource_flags) == NONE) - Fail("A species type was detected with no changesource flags: [S]") + TEST_FAIL("A species type was detected with no changesource flags: [S]") diff --git a/code/modules/unit_tests/stack_singular_name.dm b/code/modules/unit_tests/stack_singular_name.dm new file mode 100644 index 000000000000..739efb54d6a4 --- /dev/null +++ b/code/modules/unit_tests/stack_singular_name.dm @@ -0,0 +1,18 @@ +/** + * Goes through every subtype of /obj/item/stack to check for a singular name, var/singular_name. + * Everything within the blacklist does not need to be tested because it exists to be overriden. + * This test will fail if a subtype of /obj/item/stack is missing a singular name. + */ +/datum/unit_test/stack_singular_name + +/datum/unit_test/stack_singular_name/Run() + var/list/blacklist = list( // all of these are generally parents that exist to be overriden; ex. /obj/item/stack/license_plates exists to branch into /filled and /empty + /obj/item/stack/sheet, + /obj/item/stack/sheet/mineral, + /obj/item/stack/license_plates, + /obj/item/stack/sheet/animalhide, + ) + + for(var/obj/item/stack/stack_check as anything in subtypesof(/obj/item/stack) - blacklist) + if(!initial(stack_check.singular_name)) + TEST_FAIL("[stack_check] is missing a singular name!") diff --git a/code/modules/unit_tests/subsystem_init.dm b/code/modules/unit_tests/subsystem_init.dm index 7d5473bc1bb7..c377302ba6a1 100644 --- a/code/modules/unit_tests/subsystem_init.dm +++ b/code/modules/unit_tests/subsystem_init.dm @@ -4,4 +4,4 @@ if(ss.flags & SS_NO_INIT) continue if(!ss.initialized) - Fail("[ss]([ss.type]) is a subsystem meant to initialize but doesn't get set as initialized.") + TEST_FAIL("[ss]([ss.type]) is a subsystem meant to initialize but doesn't get set as initialized.") diff --git a/code/modules/unit_tests/subsystem_metric_sanity.dm b/code/modules/unit_tests/subsystem_metric_sanity.dm index 44e375b7535b..c062e60ae4ab 100644 --- a/code/modules/unit_tests/subsystem_metric_sanity.dm +++ b/code/modules/unit_tests/subsystem_metric_sanity.dm @@ -2,21 +2,21 @@ /datum/unit_test/subsystem_metric_sanity/Run() for(var/datum/controller/subsystem/SS in Master.subsystems) if(SS.ss_id == initial(SS.ss_id)) // initial() works here because ss_id is set at runtime during /New() - Fail("[SS.type] has no SS ID, somehow!") + TEST_FAIL("[SS.type] has no SS ID, somehow!") continue var/list/data = SS.get_metrics() if(length(data) != 3) - Fail("SS[SS.ss_id] has invalid metrics data!") + TEST_FAIL("SS[SS.ss_id] has invalid metrics data!") continue if(isnull(data["cost"])) - Fail("SS[SS.ss_id] has invalid metrics data! No 'cost' found in [json_encode(data)]") + TEST_FAIL("SS[SS.ss_id] has invalid metrics data! No 'cost' found in [json_encode(data)]") continue if(isnull(data["tick_usage"])) - Fail("SS[SS.ss_id] has invalid metrics data! No 'tick_usage' found in [json_encode(data)]") + TEST_FAIL("SS[SS.ss_id] has invalid metrics data! No 'tick_usage' found in [json_encode(data)]") continue if(isnull(data["custom"])) - Fail("SS[SS.ss_id] has invalid metrics data! No 'custom' found in [json_encode(data)]") + TEST_FAIL("SS[SS.ss_id] has invalid metrics data! No 'custom' found in [json_encode(data)]") continue if(!islist(data["custom"])) - Fail("SS[SS.ss_id] has invalid metrics data! 'custom' is not a list in [json_encode(data)]") + TEST_FAIL("SS[SS.ss_id] has invalid metrics data! 'custom' is not a list in [json_encode(data)]") continue diff --git a/code/modules/unit_tests/supply_pack.dm b/code/modules/unit_tests/supply_pack.dm index 37ba56b7865b..ca4c1154ca6a 100644 --- a/code/modules/unit_tests/supply_pack.dm +++ b/code/modules/unit_tests/supply_pack.dm @@ -9,4 +9,4 @@ value += rep.total_value[thing] if(value >= pack.cost) - Fail("[pack] ([pack_type]) was resold for [value], [value - pack.cost] greater than the buy price of [pack.cost]!") + TEST_FAIL("[pack] ([pack_type]) was resold for [value], [value - pack.cost] greater than the buy price of [pack.cost]!") diff --git a/code/modules/unit_tests/timer_sanity.dm b/code/modules/unit_tests/timer_sanity.dm index d92323a5253f..dbdf3f6d8e8d 100644 --- a/code/modules/unit_tests/timer_sanity.dm +++ b/code/modules/unit_tests/timer_sanity.dm @@ -1,3 +1,3 @@ /datum/unit_test/timer_sanity/Run() - if(SStimer.bucket_count < 0) - Fail("SStimer is going into negative bucket count from something") + TEST_ASSERT(SStimer.bucket_count >= 0, + "SStimer is going into negative bucket count from something") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 4a1e5f37906e..7240adb33855 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -3,7 +3,7 @@ Usage: Override /Run() to run your test code -Call Fail() to fail the test (You should specify a reason) +Call TEST_FAIL() to fail the test (You should specify a reason) You may use /New() and /Destroy() for setup/teardown respectively @@ -28,6 +28,8 @@ GLOBAL_VAR(test_log) /// The type of turf to allocate for the testing zone var/test_turf_type = /turf/open/floor/plasteel + ///The priority of the test, the larger it is the later it fires + var/priority = TEST_DEFAULT //internal shit var/focus = FALSE var/succeeded = TRUE @@ -36,6 +38,9 @@ GLOBAL_VAR(test_log) var/static/datum/map_zone/mapzone +/proc/cmp_unit_test_priority(datum/unit_test/a, datum/unit_test/b) + return initial(a.priority) - initial(b.priority) + /datum/unit_test/New() if (isnull(mapzone)) var/height = 7 @@ -58,15 +63,15 @@ GLOBAL_VAR(test_log) return ..() /datum/unit_test/proc/Run() - Fail("Run() called parent or not implemented") + TEST_FAIL("Run() called parent or not implemented") -/datum/unit_test/proc/Fail(reason = "No reason") +/datum/unit_test/proc/Fail(reason = "No reason", file = "OUTDATED_TEST", line = 1) succeeded = FALSE if(!istext(reason)) reason = "FORMATTED: [reason != null ? reason : "NULL"]" - LAZYADD(fail_reasons, reason) + LAZYADD(fail_reasons, list(list(reason, file, line))) /// Allocates an instance of the provided type, and places it somewhere in an available loc /// Instances allocated through this proc will be destroyed when the test is over @@ -80,37 +85,62 @@ GLOBAL_VAR(test_log) allocated += instance return instance +/proc/RunUnitTest(test_path, list/test_results) + var/datum/unit_test/test = new test_path + + GLOB.current_test = test + var/duration = REALTIMEOFDAY + + test.Run() + + duration = REALTIMEOFDAY - duration + GLOB.current_test = null + GLOB.failed_any_test |= !test.succeeded + + var/list/log_entry = list( + "[test.succeeded ? TEST_OUTPUT_GREEN("PASS") : TEST_OUTPUT_RED("FAIL")]: [test_path] [duration / 10]s", + ) + var/list/fail_reasons = test.fail_reasons + + for(var/reasonID in 1 to LAZYLEN(fail_reasons)) + var/text = fail_reasons[reasonID][1] + var/file = fail_reasons[reasonID][2] + var/line = fail_reasons[reasonID][3] + + /// Github action annotation. + log_world("::error file=[file],line=[line],title=[test_path]::[text]") + + // Normal log message + log_entry += "\tREASON #[reasonID]: [text] at [file]:[line]" + + var/message = log_entry.Join("\n") + log_test(message) + + test_results[test_path] = list("status" = test.succeeded ? UNIT_TEST_PASSED : UNIT_TEST_FAILED, "message" = message, "name" = test_path) + + qdel(test) + /proc/RunUnitTests() CHECK_TICK - var/tests_to_run = subtypesof(/datum/unit_test) + var/list/tests_to_run = subtypesof(/datum/unit_test) + var/list/focused_tests = list() for (var/_test_to_run in tests_to_run) var/datum/unit_test/test_to_run = _test_to_run if (initial(test_to_run.focus)) - tests_to_run = list(test_to_run) - break - - for(var/I in tests_to_run) - var/datum/unit_test/test = new I - - GLOB.current_test = test - var/duration = REALTIMEOFDAY - - test.Run() - - duration = REALTIMEOFDAY - duration - GLOB.current_test = null - GLOB.failed_any_test |= !test.succeeded + focused_tests += _test_to_run - var/list/log_entry = list("[test.succeeded ? "PASS" : "FAIL"]: [I] [duration / 10]s") - var/list/fail_reasons = test.fail_reasons + if(length(focused_tests)) + tests_to_run = focused_tests - qdel(test) + tests_to_run = sortTim(tests_to_run, /proc/cmp_unit_test_priority) - for(var/J in 1 to LAZYLEN(fail_reasons)) - log_entry += "\tREASON #[J]: [fail_reasons[J]]" - log_test(log_entry.Join("\n")) + var/list/test_results = list() - CHECK_TICK + for(var/unit_path in tests_to_run) + CHECK_TICK //We check tick first because the unit test we run last may be so expensive that checking tick will lock up this loop forever + RunUnitTest(unit_path, test_results) SSticker.force_ending = TRUE + //We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game + SSticker.declare_completion() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index a0d3c6d13c7d..a785ba5985d7 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -44,25 +44,29 @@ /obj/vehicle/ridden/atv/turret/Moved() . = ..() - if(turret) - turret.forceMove(get_turf(src)) - switch(dir) - if(NORTH) - turret.pixel_x = base_pixel_x - turret.pixel_y = base_pixel_y + 4 - turret.layer = ABOVE_MOB_LAYER - if(EAST) - turret.pixel_x = base_pixel_x - 12 - turret.pixel_y = base_pixel_y + 4 - turret.layer = OBJ_LAYER - if(SOUTH) - turret.pixel_x = base_pixel_x - turret.pixel_y = base_pixel_y + 4 - turret.layer = OBJ_LAYER - if(WEST) - turret.pixel_x = base_pixel_x + 12 - turret.pixel_y = base_pixel_y + 4 - turret.layer = OBJ_LAYER + if(!turret) + return + var/turf/our_turf = get_turf(src) + if(!our_turf) + return + turret.forceMove(our_turf) + switch(dir) + if(NORTH) + turret.pixel_x = base_pixel_x + turret.pixel_y = base_pixel_y + 4 + turret.layer = ABOVE_MOB_LAYER + if(EAST) + turret.pixel_x = base_pixel_x - 12 + turret.pixel_y = base_pixel_y + 4 + turret.layer = OBJ_LAYER + if(SOUTH) + turret.pixel_x = base_pixel_x + turret.pixel_y = base_pixel_y + 4 + turret.layer = OBJ_LAYER + if(WEST) + turret.pixel_x = base_pixel_x + 12 + turret.pixel_y = base_pixel_y + 4 + turret.layer = OBJ_LAYER /obj/vehicle/ridden/atv/attackby(obj/item/W as obj, mob/user as mob, params) if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 1941d81accbe..caf9b6afa757 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -65,7 +65,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C var/vend_ready = TRUE ///Next world time to send a purchase message var/purchase_message_cooldown - ///Last mob to shop with us + ///The ref of the last mob to shop with us var/last_shopper var/tilted = FALSE var/tiltable = TRUE @@ -804,10 +804,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C D.adjust_money(price_to_use) SSblackbox.record_feedback("amount", "vending_spent", price_to_use) log_econ("[price_to_use] credits were inserted into [src] by [D.account_holder] to buy [R].") - if(last_shopper != usr || purchase_message_cooldown < world.time) + if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) say("Thank you for shopping with [src]!") purchase_message_cooldown = world.time + 5 SECONDS - last_shopper = usr + last_shopper = REF(usr) use_power(5) if(icon_vend) //Show the vending animation if needed flick(icon_vend,src) @@ -1040,10 +1040,10 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C S.forceMove(drop_location()) loaded_items-- use_power(5) - if(last_shopper != usr || purchase_message_cooldown < world.time) + if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) say("Thank you for buying local and purchasing [S]!") purchase_message_cooldown = world.time + 5 SECONDS - last_shopper = usr + last_shopper = REF(usr) vend_ready = TRUE updateUsrDialog() return diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 640308d0bf1c..30f94b56c1ca 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -30,7 +30,7 @@ /obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0) . = ..() STOP_PROCESSING(SSobj, src) - if(iszombie(M) && old_species && !special) + if(iszombie(M) && old_species && !QDELETED(M) && !special) M.set_species(old_species) if(timer_id) deltimer(timer_id) diff --git a/html/changelogs/AutoChangeLog-pr-63276.yml b/html/changelogs/AutoChangeLog-pr-63276.yml new file mode 100644 index 000000000000..d2d64697126a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-63276.yml @@ -0,0 +1,4 @@ +author: "Pickle-Coding" +delete-after: True +changes: + - bugfix: "Allows the supermatter crystal to produce gases while powered, even in absolutely empty turfs, excluding space turfs." diff --git a/shiptest.dme b/shiptest.dme index 23cb707af265..b56709e8b98b 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -31,6 +31,7 @@ #include "code\__DEFINES\aquarium.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\atoms.dm" #include "code\__DEFINES\bitfields.dm" #include "code\__DEFINES\blackmarket.dm" #include "code\__DEFINES\bodyparts.dm" @@ -365,7 +366,6 @@ #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.dm" #include "code\controllers\subsystem\processing\instruments.dm" #include "code\controllers\subsystem\processing\nanites.dm" @@ -451,7 +451,9 @@ #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\connect_containers.dm" #include "code\datums\components\connect_loc_behalf.dm" +#include "code\datums\components\connect_range.dm" #include "code\datums\components\construction.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\deadchat_control.dm" @@ -704,6 +706,11 @@ #include "code\datums\mutations\speech.dm" #include "code\datums\mutations\telekinesis.dm" #include "code\datums\mutations\touch.dm" +#include "code\datums\proximity_monitor\field.dm" +#include "code\datums\proximity_monitor\proximity_monitor.dm" +#include "code\datums\proximity_monitor\fields\gravity.dm" +#include "code\datums\proximity_monitor\fields\peaceborg_dampener.dm" +#include "code\datums\proximity_monitor\fields\timestop.dm" #include "code\datums\ruins\beachplanet.dm" #include "code\datums\ruins\icemoon.dm" #include "code\datums\ruins\jungle.dm" @@ -1014,7 +1021,6 @@ #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\particle_emitter.dm" #include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\proximity.dm" #include "code\game\objects\effects\radiation.dm" #include "code\game\objects\effects\spiderperson_web.dm" #include "code\game\objects\effects\spiders.dm" @@ -2073,11 +2079,6 @@ #include "code\modules\events\wizard\rpgloot.dm" #include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\summons.dm" -#include "code\modules\fields\fields.dm" -#include "code\modules\fields\gravity.dm" -#include "code\modules\fields\peaceborg_dampener.dm" -#include "code\modules\fields\timestop.dm" -#include "code\modules\fields\turf_objects.dm" #include "code\modules\fishing\bait.dm" #include "code\modules\fishing\fish_catalog.dm" #include "code\modules\fishing\fishing_equipment.dm" diff --git a/tgui/packages/tgui/interfaces/OperatingComputer.js b/tgui/packages/tgui/interfaces/OperatingComputer.js index 87d1979aa813..a2291676c2e5 100644 --- a/tgui/packages/tgui/interfaces/OperatingComputer.js +++ b/tgui/packages/tgui/interfaces/OperatingComputer.js @@ -55,6 +55,9 @@ const PatientStateView = (props, context) => { if (!table) { return No Table Detected; } + if (!patient) { + return No Patient Detected; + } return ( <>
diff --git a/tools/build/build.js b/tools/build/build.js index f63411918e31..01491d4964e1 100755 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -55,9 +55,8 @@ export const NoWarningParameter = new Juke.Parameter({ export const DmMapsIncludeTarget = new Juke.Target({ executes: async () => { const folders = [ - ...Juke.glob("_maps/map_files/**/modular_pieces/*.dmm"), + ...Juke.glob("_maps/outpost/**/*.dmm"), ...Juke.glob("_maps/RandomRuins/**/*.dmm"), - ...Juke.glob("_maps/RandomZLevels/**/*.dmm"), ...Juke.glob("_maps/shuttles/**/*.dmm"), ...Juke.glob("_maps/templates/**/*.dmm"), ]; @@ -81,7 +80,7 @@ export const DmTarget = new Juke.Target({ get(DefineParameter).includes("ALL_MAPS") && DmMapsIncludeTarget, ], inputs: [ - "_maps/map_files/generic/**", + "_maps/map_files/**", "code/**", "html/**", "icons/**", diff --git a/tools/merge-upstream-pull-request.sh b/tools/merge-upstream-pull-request.sh index 5ec04fce74ea..9f809c47217d 100644 --- a/tools/merge-upstream-pull-request.sh +++ b/tools/merge-upstream-pull-request.sh @@ -82,11 +82,11 @@ if echo "$CHERRY_PICK_OUTPUT" | grep -i 'error: mainline was specified but commi echo "Commit was a squash, retrying" if containsElement "$MERGE_SHA" "${COMMITS[@]}"; then for commit in $COMMITS; do - echo "Cherry-picking: $commit" - git -c core.editor=true cherry-pick "$commit" - # Add all files onto this branch - git add -A . - git -c core.editor=true cherry-pick --continue + echo "Cherry-picking: $commit" + git -c core.editor=true cherry-pick "$commit" + # Add all files onto this branch + git add -A . + git -c core.editor=true cherry-pick --continue done else echo "Cherry-picking: $MERGE_SHA" diff --git a/tools/tgs_scripts/PreCompile.sh b/tools/tgs_scripts/PreCompile.sh index 2cc52be12741..6e34ab65af6a 100755 --- a/tools/tgs_scripts/PreCompile.sh +++ b/tools/tgs_scripts/PreCompile.sh @@ -60,5 +60,4 @@ cd .. # compile tgui echo "Compiling tgui..." cd "$1" -chmod +x tools/bootstrap/node # Workaround for https://github.com/tgstation/tgstation-server/issues/1167 env TG_BOOTSTRAP_CACHE="$original_dir" TG_BOOTSTRAP_NODE_LINUX=1 CBT_BUILD_MODE="TGS" tools/bootstrap/node tools/build/build.js From b5ef2d1db8534923a3a7ed70526e84e3215d040a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 16 Sep 2023 00:43:55 +0000 Subject: [PATCH 44/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-63276.yml | 4 ---- html/changelogs/archive/2023-09.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-63276.yml diff --git a/html/changelogs/AutoChangeLog-pr-63276.yml b/html/changelogs/AutoChangeLog-pr-63276.yml deleted file mode 100644 index d2d64697126a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-63276.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pickle-Coding" -delete-after: True -changes: - - bugfix: "Allows the supermatter crystal to produce gases while powered, even in absolutely empty turfs, excluding space turfs." diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index 8d294b1c8790..3cd99190c981 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -88,3 +88,7 @@ MarkSuckerberg: - rscdel: Gang and revs gamemode (the gear remains) - admin: Removes SSjob, occupations are now stored in a global list +2023-09-16: + Pickle-Coding: + - bugfix: Allows the supermatter crystal to produce gases while powered, even in + absolutely empty turfs, excluding space turfs. From 2fc01ad8be958492a38b3200023b8aa0c4bad9f5 Mon Sep 17 00:00:00 2001 From: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Sat, 16 Sep 2023 21:08:09 -0500 Subject: [PATCH 45/57] Skrem's Quick Ballistic Glanceover (#2354) ## About The Pull Request If maintainers want me to shorten the changelog, I can, I tend to start there so I know what to talk about up here. What started as a PR meant to buff up rubber rounds ended up turning into a general passover I gave to much of the syntax and presentation of ballistics. PR doesn't actually change that much function-wise, but it changes a lot of lines due to a lot of changed pathing to better establish consistency within ballistic code as well as overviewing a lot of descriptions, names, and inherit moments. Functionally, less-lethals and sniper rounds have been changed the most by this PR. To a lesser extent, .38 special and shotgun rounds have been tweaked. Finally, the PR stamps out a missing sprite bug with the WT-550 magazines, buffs up the surplus rifle (yeah, that old thing), tinkers with some projectile speeds, makes match rounds slightly better, and goes over A LOT of descriptions. I apologize for the massive wall of text that's to follow. Will take a look at energy weapons when I feel like it (might kill disablers, I don't like mapping though). ## Why It's Good For The Game ### Slug and Pellet Changes The pellet changes are actually just systemizing what was supposed to be intentional design according to code comments, it just hadn't reached every single pellet-based shotgun projectile. The improvised shell buff is to make it not a potential complete whiff because RNG mechanics are generally bad and not fun to play with. ### Less-Lethal Changes Several implementations of less-lethal (rubber) ammunition on shiptest are strictly worse than their standard alternatives. While this isn't a PvP server, it feels very not-fun meta-wise to POTENTIALLY arm for SOME insubordination and still fire what may as well be a round that bleeds someone out (as they'll cause bleeding anyway). Increasing the stamina damage on each of these makes it so they actually have a vague trade-off (maybe stamina damage can do something like slow simplemobs in the future, I don't know, I'd love to do it but simplemob code makes me screech). To make them not directly better in PvP and not the staple of taking down the Super Scary Syndicate Shocktrooper Guy, they've had their negative AP doubled. Not as good against combatants, but still perfectly adept, if not better at general riot control against civilians. Makes sense and puts them in their niche a little better. ### .38 Changes The .38 special round relatively has more "power" and "velocity" compared to the 9mm round, though it does not quite reach the levels that .45 automatic or 10mm does in the IRL server. Furthermore, .38 special was specifically designed not to over-penetrate targets so as to minimize the chance of collateral damage in police work. These are the ultimate justifications behind giving it the worst AP out of all the pistol calibers (-30, instead of -20) while still raising its damage to 25. This should make the Winchester a better staple for taking out weaker enemies such as legions or unarmored hermits, but it'll perform worse against goliaths, frontiersmen, and the like. All-in-all, a more "early-game" caliber, if you will, which is kinda what it's always been. ### Projectile Speed and Match Changes Match rounds don't really exist as far as I've seen. That being said, they're meant to be of higher quality, so their getting slightly higher AP and speed makes sense, even if they're mostly just a meme round. The speed increase of DMR/sniper rounds is primarily meant to differentiate them better from AR rounds beyond having 20 more AP. Assault rifles so far have pretty much dominated with better magazine size, fire rate, and the exact same force as the DMR calibers, just doing less damage against armored targets (doesn't matter too much when you can just vomit rounds). I'd like to buff up the DMR damage even more (sniper is fine), but I'd rather get some feedback on changing them to 35 baseline before doing so. The speed decrease on shotguns is meant to cement them as CQC weapons. Slugs are heavy. Shotguns are meant for close range. It's not much, but it's thematically a good way to keep them in their lane, not that they're even that problematic, hence only the slight change. ### Sniper Rifle Knockdown Change Having a big-ass bullet that does 70 damage with 50 AP hit you is already a middle finger. Making it potentially knock off an arm or a leg is another middle finger. Being hardstunned for ten seconds after is the icing on the cake. Changed it to a knockdown because we hate ranged tasers. ### Surplus Rifle Fire Rate Buff This thing is a joke. I haven't even seen it on the server, but I'd rather make it vaguely competitive considering 10mm isn't super deadly and only otherwise exists on the stechkin or the one Inteq SMG that you never see (Colossus-only). It's still clunky and terrible, but it should be less comedic and more of a potential option if you have NOTHING else (will never happen). ### Boarder Magazine Change Top-loading magazine fits into a standard assault rifle? No. Doesn't make sense. Someone should probably just kill this gun, it's stupid and looks stupid last I checked. ### WT-550 Magazine Fix Don't think I've seen anyone use this weapon, I've only printed out their magazines to dump AP rounds into my NT-SVG carbine. Noticed they were invisible then. Someone increased their capacity to 30 without a care for how its update_icon works. Not cool. Anyway, fixes are good. Moving on. ### Syntax, Description, Spelling, and Overall Presentation Changes Something very important when maintaining code is generally keeping consistency in how things are not only presented, but how they're stored as well. While I'd love to do EVEN more in the method of refactoring to better align how so much of gun code works, this was something I wanted to keep as a one-day project, so I mostly tinkered with pathing, inherits, and groupings. In the avenue of spelling and description changes, that's just 1) Cleaning up errors that PR authors and maintainers missed and 2) Making things more concise and just... better. Some of the SolGov descriptions were a real headache to look at, and not because of the frequent spelling and syntax errors. Whoever misspelled and caused an entire series of items to be /obj/item/gun/ballistic/automatic/assualt may wish to avoid any crows for the next three months. Perfectly willing to adjust or reel back some of my descriptions if someone can offer something better than what I've written out if there's some soul they REALLY want to keep. ## Changelog :cl: tweak: The NT 'Boarder' ARG now loads standard P-16 magazines, rather than the M-90gl toploaders. balance: .38 special does 25 damage up from 20. AP has been reduced to -30 from -20. balance: Standardizes pellet projectiles to lose 10% damage of both types per tile across the board. Improvised pellets no longer have a hardcapped 1-8 tile range. balance: Less-lethal rounds now do 50% more stamina than the force of their lethal counterparts, with 25% the normal force and double the negative AP. If the round had positive or zero AP, it was subtracted by 20. balance: Shotgun slugs do 40 damage, down from 60, but have zero AP, rather than -10. FRAG-12 and meteor slugs have had their damage adjusted to reflect their relative force. balance: Surplus rifle fire_delay has been cut to 1 second from 3. balance: .50 BMG knocks down instead of hardstunning. balance: Any DMR, match, or sniper round now travels slightly faster than other bullets. Shotgun slugs and pellets now travel slightly slower than other bullets. balance: Match rounds have had their AP slightly increased. fix: Fixed WT-550 magazines not displaying properly. spellcheck: Went over (almost) every single ballistic description, including the guns themselves, magazines, ballistic casings, and speed loaders/stripper clips to not only have better consistency and readability, but also be more clear on the general effectiveness of each caliber. spellcheck: Assualt is gone. code: Repaths/renames most ballistic ammo pathing to maintain consistency or take advantage of inherits, when possible. /:cl: --- .../BeachRuins/beach_treasure_cove.dmm | 2 +- .../icemoon_surface_corporate_rejects.dmm | 2 +- _maps/deprecated/Ships/minutemen_carina.dmm | 12 +- _maps/map_files/generic/CentCom.dmm | 2 +- .../shuttles/shiptest/independent_beluga.dmm | 2 +- .../shiptest/independent_halftrack.dmm | 40 ++--- .../shiptest/independent_litieguai.dmm | 6 +- .../shuttles/shiptest/independent_rigger.dmm | 4 +- .../shiptest/independent_tranquility.dmm | 8 +- _maps/shuttles/shiptest/inteq_hound.dmm | 2 +- .../shuttles/shiptest/minutemen_asclepius.dmm | 4 +- _maps/shuttles/shiptest/minutemen_corvus.dmm | 10 +- _maps/shuttles/shiptest/minutemen_vela.dmm | 14 +- code/modules/cargo/packs/ammo.dm | 4 +- code/modules/cargo/packs/gun.dm | 8 +- code/modules/clothing/suits/armor.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/warden.dm | 2 +- .../simple_animal/hostile/frontiersman.dm | 8 +- .../projectiles/ammunition/ballistic/lmg.dm | 22 +-- .../ammunition/ballistic/pistol.dm | 44 ++--- .../ammunition/ballistic/revolver.dm | 20 +-- .../projectiles/ammunition/ballistic/rifle.dm | 30 ++-- .../ammunition/ballistic/shotgun.dm | 28 ++-- .../projectiles/ammunition/ballistic/smg.dm | 30 ++-- .../ammunition/ballistic/sniper.dm | 14 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 156 ++++++++++-------- .../boxes_magazines/external/gauss.dm | 7 +- .../boxes_magazines/external/grenade.dm | 1 + .../boxes_magazines/external/lmg.dm | 15 +- .../boxes_magazines/external/pistol.dm | 71 ++++---- .../boxes_magazines/external/rechargable.dm | 2 +- .../boxes_magazines/external/rifle.dm | 53 +++--- .../boxes_magazines/external/smg.dm | 66 ++++---- .../boxes_magazines/external/sniper.dm | 13 +- .../boxes_magazines/internal/revolver.dm | 2 +- .../boxes_magazines/internal/rifle.dm | 4 +- .../projectiles/guns/ballistic/assault.dm | 53 +++--- .../projectiles/guns/ballistic/automatic.dm | 14 +- .../projectiles/guns/ballistic/gauss.dm | 26 +-- .../modules/projectiles/guns/ballistic/hmg.dm | 10 +- .../projectiles/guns/ballistic/launchers.dm | 8 +- .../projectiles/guns/ballistic/pistol.dm | 33 ++-- .../projectiles/guns/ballistic/revolver.dm | 14 +- .../projectiles/guns/ballistic/rifle.dm | 12 +- .../projectiles/guns/ballistic/shotgun.dm | 8 +- .../modules/projectiles/guns/ballistic/smg.dm | 11 +- .../projectiles/projectile/bullets/gauss.dm | 9 +- .../projectiles/projectile/bullets/lmg.dm | 13 +- .../projectiles/projectile/bullets/pistol.dm | 47 +++--- .../projectile/bullets/revolver.dm | 32 ++-- .../projectiles/projectile/bullets/rifle.dm | 20 ++- .../projectiles/projectile/bullets/shotgun.dm | 76 ++++----- .../projectiles/projectile/bullets/smg.dm | 21 ++- .../projectiles/projectile/bullets/sniper.dm | 17 +- .../research/designs/weapon_designs.dm | 4 +- .../spells/spell_types/rightandwrong.dm | 2 +- code/modules/uplink/uplink_items.dm | 8 +- code/modules/vending/liberation.dm | 2 +- code/modules/vending/security.dm | 2 +- icons/obj/ammo.dmi | Bin 29066 -> 29066 bytes 61 files changed, 587 insertions(+), 567 deletions(-) diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm index 08967d4aa4d5..ca4dc1c33263 100644 --- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm @@ -393,7 +393,7 @@ pixel_x = 9; pixel_y = -1 }, -/obj/item/gun/ballistic/automatic/assualt/p16/minutemen{ +/obj/item/gun/ballistic/automatic/assault/p16/minutemen{ pixel_y = 7; pixel_x = -9 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm index 677647192c0d..5b85b39404d3 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm @@ -1703,7 +1703,7 @@ "Md" = ( /obj/structure/rack, /obj/item/ammo_box/magazine/smgm9mm/ap, -/obj/item/ammo_box/magazine/smgm9mm/fire, +/obj/item/ammo_box/magazine/smgm9mm/inc, /obj/machinery/light/small/directional/east, /turf/open/floor/vault, /area/ruin/unpowered/corprejectvault) diff --git a/_maps/deprecated/Ships/minutemen_carina.dmm b/_maps/deprecated/Ships/minutemen_carina.dmm index 00b2bbfc33ba..986dc5a907b2 100644 --- a/_maps/deprecated/Ships/minutemen_carina.dmm +++ b/_maps/deprecated/Ships/minutemen_carina.dmm @@ -2065,12 +2065,12 @@ pixel_x = -1; pixel_y = 14 }, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/corner/opaque/red{ dir = 1 diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 86538c6fc45d..e2b1ff97158c 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -8951,7 +8951,7 @@ "hra" = ( /obj/structure/table/reinforced, /obj/item/storage/lockbox/loyalty, -/obj/item/gun/ballistic/automatic/assualt/ar, +/obj/item/gun/ballistic/automatic/assault/ar, /obj/machinery/light/directional/north, /obj/effect/turf_decal/industrial/warning, /turf/open/floor/plasteel, diff --git a/_maps/shuttles/shiptest/independent_beluga.dmm b/_maps/shuttles/shiptest/independent_beluga.dmm index 471140ec16fa..16a771d5be54 100644 --- a/_maps/shuttles/shiptest/independent_beluga.dmm +++ b/_maps/shuttles/shiptest/independent_beluga.dmm @@ -1169,7 +1169,7 @@ req_access_txt = "1" }, /obj/machinery/light/directional/north, -/obj/item/ammo_box/magazine/co9mm/rubbershot{ +/obj/item/ammo_box/magazine/co9mm/rubber{ pixel_x = 9; pixel_y = 4 }, diff --git a/_maps/shuttles/shiptest/independent_halftrack.dmm b/_maps/shuttles/shiptest/independent_halftrack.dmm index 01dce81860b9..f82d26ffd66d 100644 --- a/_maps/shuttles/shiptest/independent_halftrack.dmm +++ b/_maps/shuttles/shiptest/independent_halftrack.dmm @@ -371,28 +371,28 @@ /obj/item/gun/ballistic/automatic/smg/vector{ spawnwithmagazine = 0 }, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, +/obj/item/ammo_box/magazine/smgm9mm/rubber, +/obj/item/ammo_box/magazine/smgm9mm/rubber, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/structure/closet/secure_closet/wall{ @@ -432,11 +432,11 @@ /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, -/obj/item/ammo_box/magazine/co9mm/rubbershot, -/obj/item/ammo_box/magazine/co9mm/rubbershot, -/obj/item/ammo_box/magazine/co9mm/rubbershot, -/obj/item/ammo_box/magazine/co9mm/rubbershot, -/obj/item/ammo_box/magazine/co9mm/rubbershot, +/obj/item/ammo_box/magazine/co9mm/rubber, +/obj/item/ammo_box/magazine/co9mm/rubber, +/obj/item/ammo_box/magazine/co9mm/rubber, +/obj/item/ammo_box/magazine/co9mm/rubber, +/obj/item/ammo_box/magazine/co9mm/rubber, /obj/effect/turf_decal/box/red, /turf/open/floor/plasteel/dark, /area/ship/security) @@ -1022,20 +1022,20 @@ /obj/item/gun/ballistic/automatic/smg/vector{ spawnwithmagazine = 0 }, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, +/obj/item/ammo_box/magazine/smgm9mm/rubber, +/obj/item/ammo_box/magazine/smgm9mm/rubber, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ @@ -1051,7 +1051,7 @@ req_access_txt = "5" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/machinery/light/directional/north, @@ -1502,8 +1502,8 @@ /obj/structure/closet/secure_closet/security, /obj/item/gun/ballistic/automatic/pistol/deagle, /obj/item/gun/ballistic/automatic/pistol/deagle, -/obj/item/gun/ballistic/automatic/assualt/ak47, -/obj/item/gun/ballistic/automatic/assualt/ak47, +/obj/item/gun/ballistic/automatic/assault/ak47, +/obj/item/gun/ballistic/automatic/assault/ak47, /obj/item/ammo_box/magazine/ak47, /obj/item/ammo_box/magazine/ak47, /obj/item/ammo_box/magazine/ak47, diff --git a/_maps/shuttles/shiptest/independent_litieguai.dmm b/_maps/shuttles/shiptest/independent_litieguai.dmm index 65710c834f80..16fb276dc808 100644 --- a/_maps/shuttles/shiptest/independent_litieguai.dmm +++ b/_maps/shuttles/shiptest/independent_litieguai.dmm @@ -2248,17 +2248,17 @@ /area/ship/crew) "UX" = ( /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/gun/ballistic/automatic/pistol/commander/no_mag, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot; + ammo_type = /obj/item/ammo_casing/c9mm/rubber; name = "Commander magazine (Rubbershot 9mm)" }, /obj/item/ammo_box/magazine/co9mm{ diff --git a/_maps/shuttles/shiptest/independent_rigger.dmm b/_maps/shuttles/shiptest/independent_rigger.dmm index fb969897dce3..bcf0af7954a0 100644 --- a/_maps/shuttles/shiptest/independent_rigger.dmm +++ b/_maps/shuttles/shiptest/independent_rigger.dmm @@ -4144,8 +4144,8 @@ req_access_txt = "1" }, /obj/item/ammo_box/c38_box, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, /obj/item/ammo_box/magazine/m45, /turf/open/floor/plasteel/dark, /area/ship/security) diff --git a/_maps/shuttles/shiptest/independent_tranquility.dmm b/_maps/shuttles/shiptest/independent_tranquility.dmm index a43c627176e4..e612c7fe57e9 100644 --- a/_maps/shuttles/shiptest/independent_tranquility.dmm +++ b/_maps/shuttles/shiptest/independent_tranquility.dmm @@ -5481,7 +5481,7 @@ /area/ship/engineering/engine) "Rk" = ( /obj/structure/table, -/obj/item/ammo_box/magazine/m45/rubbershot{ +/obj/item/ammo_box/magazine/m45/rubber{ pixel_x = 7; pixel_y = -2 }, @@ -5644,15 +5644,15 @@ /area/ship/hallway/starboard) "Sg" = ( /obj/structure/table, -/obj/item/ammo_casing/c45/rubbershot{ +/obj/item/ammo_casing/c45/rubber{ pixel_x = 6; pixel_y = 7 }, -/obj/item/ammo_casing/c45/rubbershot{ +/obj/item/ammo_casing/c45/rubber{ pixel_x = 4; pixel_y = 5 }, -/obj/item/ammo_casing/c45/rubbershot{ +/obj/item/ammo_casing/c45/rubber{ pixel_x = 8; pixel_y = 3 }, diff --git a/_maps/shuttles/shiptest/inteq_hound.dmm b/_maps/shuttles/shiptest/inteq_hound.dmm index e937caddf2bd..2fc73b689d88 100644 --- a/_maps/shuttles/shiptest/inteq_hound.dmm +++ b/_maps/shuttles/shiptest/inteq_hound.dmm @@ -586,7 +586,7 @@ /obj/item/ammo_box/magazine/ak47{ pixel_x = 7 }, -/obj/item/gun/ballistic/automatic/assualt/ak47/inteq{ +/obj/item/gun/ballistic/automatic/assault/ak47/inteq{ pixel_x = -5 }, /obj/structure/closet/secure_closet/wall{ diff --git a/_maps/shuttles/shiptest/minutemen_asclepius.dmm b/_maps/shuttles/shiptest/minutemen_asclepius.dmm index ed665fcd4fad..b2b8bf8786f2 100644 --- a/_maps/shuttles/shiptest/minutemen_asclepius.dmm +++ b/_maps/shuttles/shiptest/minutemen_asclepius.dmm @@ -4069,8 +4069,8 @@ /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch, /obj/item/storage/belt/security, /obj/item/gun/ballistic/automatic/pistol/m1911, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot{ +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber{ pixel_x = 3 }, /obj/structure/railing{ diff --git a/_maps/shuttles/shiptest/minutemen_corvus.dmm b/_maps/shuttles/shiptest/minutemen_corvus.dmm index 907c9dc222e3..a8ede4ce713f 100644 --- a/_maps/shuttles/shiptest/minutemen_corvus.dmm +++ b/_maps/shuttles/shiptest/minutemen_corvus.dmm @@ -2327,18 +2327,18 @@ /obj/item/ammo_box/magazine/m45{ pixel_x = 5 }, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, /obj/effect/turf_decal/corner/opaque/red/border{ dir = 1 }, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, /obj/item/ammo_box/magazine/smgm9mm{ pixel_x = 2; pixel_y = 1 }, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot{ +/obj/item/ammo_box/magazine/smgm9mm/rubber{ pixel_x = -5; pixel_y = -2 }, diff --git a/_maps/shuttles/shiptest/minutemen_vela.dmm b/_maps/shuttles/shiptest/minutemen_vela.dmm index 1bbb3680a44b..033d34381725 100644 --- a/_maps/shuttles/shiptest/minutemen_vela.dmm +++ b/_maps/shuttles/shiptest/minutemen_vela.dmm @@ -28,9 +28,9 @@ /obj/item/ammo_box/magazine/m45, /obj/item/ammo_box/magazine/m45, /obj/item/ammo_box/magazine/m45, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, -/obj/item/ammo_box/magazine/smgm9mm/rubbershot, +/obj/item/ammo_box/magazine/smgm9mm/rubber, +/obj/item/ammo_box/magazine/smgm9mm/rubber, +/obj/item/ammo_box/magazine/smgm9mm/rubber, /obj/item/ammo_box/c9mm/rubbershot, /obj/structure/cable{ icon_state = "0-6" @@ -3056,8 +3056,8 @@ /obj/item/clothing/head/helmet/bulletproof/minutemen, /obj/item/storage/belt/security/full, /obj/item/restraints/handcuffs, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, /obj/effect/turf_decal/industrial/hatch/yellow, /obj/structure/extinguisher_cabinet/directional/east, /obj/item/clothing/suit/armor/vest/marine, @@ -6266,8 +6266,8 @@ /obj/item/clothing/head/helmet/bulletproof/minutemen, /obj/item/storage/belt/security/full, /obj/item/restraints/handcuffs, -/obj/item/ammo_box/magazine/m45/rubbershot, -/obj/item/ammo_box/magazine/m45/rubbershot, +/obj/item/ammo_box/magazine/m45/rubber, +/obj/item/ammo_box/magazine/m45/rubber, /obj/effect/turf_decal/industrial/hatch/yellow, /obj/structure/sign/poster/official/focus{ pixel_y = 32 diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm index 56ff80d77018..9bb96a14be5c 100644 --- a/code/modules/cargo/packs/ammo.dm +++ b/code/modules/cargo/packs/ammo.dm @@ -122,8 +122,8 @@ name = "WT-550 Auto Rifle Exotic Ammo Crate" desc = "Contains one magazine of armor-piercing and one magazine of incendiary ammunition for the WT-550 Auto Rifle. Sadly, our manufacturer discontinued the uranium-tipped bullets." cost = 2500 - contains = list(/obj/item/ammo_box/magazine/wt550m9/wtap, - /obj/item/ammo_box/magazine/wt550m9/wtic) + contains = list(/obj/item/ammo_box/magazine/wt550m9/ap, + /obj/item/ammo_box/magazine/wt550m9/inc) /* Rifle ammo diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 249535824738..b91fe38e0390 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -130,16 +130,16 @@ name = "P16 Assault Rifle Crate" desc = "Contains two high-powered, automatic rifles chambered in 5.56mm." cost = 8000 - contains = list(/obj/item/gun/ballistic/automatic/assualt/p16, - /obj/item/gun/ballistic/automatic/assualt/p16) + contains = list(/obj/item/gun/ballistic/automatic/assault/p16, + /obj/item/gun/ballistic/automatic/assault/p16) crate_name = "auto rifle crate" /datum/supply_pack/gun/ak name = "SVG-67 Rifle Crate" desc = "Contains two high-powered, automatic rifles chambered in 7.62x39mm." cost = 6000 - contains = list(/obj/item/gun/ballistic/automatic/assualt/ak47, - /obj/item/gun/ballistic/automatic/assualt/ak47) + contains = list(/obj/item/gun/ballistic/automatic/assault/ak47, + /obj/item/gun/ballistic/automatic/assault/ak47) crate_name = "auto rifle crate" /* diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 23b489b6a3c3..fbe1eceb1f65 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -427,7 +427,7 @@ /obj/item/clothing/suit/armor/vest/bulletproof/solgov/Initialize() . = ..() - allowed |= list(/obj/item/gun/ballistic/automatic/assualt/swiss_cheese, /obj/item/tank) + allowed |= list(/obj/item/gun/ballistic/automatic/assault/swiss_cheese, /obj/item/tank) /obj/item/clothing/suit/armor/vest/hop name = "head of personnel's parade jacket" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index d847e015cde6..8207bdb85bbe 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S /datum/outfit/job/security/minutemen/armed name = "Minuteman (Colonial Minutemen) (Armed)" - suit_store = /obj/item/gun/ballistic/automatic/assualt/p16/minutemen + suit_store = /obj/item/gun/ballistic/automatic/assault/p16/minutemen belt = /obj/item/storage/belt/military/minutemen/loaded /datum/outfit/job/security/minutemen/mechpilot diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 08aeaab16e8d..a59b68a49892 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -77,7 +77,7 @@ /datum/outfit/job/warden/minutemen/armed name = "Field Commander (Colonial Minutemen) (Armed)" - suit_store = /obj/item/gun/ballistic/automatic/assualt/p16/minutemen + suit_store = /obj/item/gun/ballistic/automatic/assault/p16/minutemen belt = /obj/item/storage/belt/military/minutemen/loaded backpack_contents = list(/obj/item/melee/classic_baton=1, /obj/item/gun/ballistic/automatic/pistol/commander=1, /obj/item/restraints/handcuffs=1, /obj/item/gun/energy/e_gun/advtaser=1) diff --git a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/frontiersman.dm index af3e742a08d7..c8e6a1c8d2b4 100644 --- a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm +++ b/code/modules/mob/living/simple_animal/hostile/frontiersman.dm @@ -39,7 +39,7 @@ retreat_distance = 5 minimum_distance = 5 projectilesound = 'sound/weapons/gun/revolver/shot.ogg' - casingtype = /obj/item/ammo_casing/n762 + casingtype = /obj/item/ammo_casing/n762_38 /mob/living/simple_animal/hostile/frontier/ranged/mosin @@ -47,7 +47,7 @@ icon_living = "frontiersmanrangedrifle" loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, /obj/item/gun/ballistic/rifle/boltaction) - casingtype = /obj/item/ammo_casing/a762 + casingtype = /obj/item/ammo_casing/a762_54 projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' /mob/living/simple_animal/hostile/frontier/ranged/trooper @@ -68,7 +68,7 @@ rapid_fire_delay = 3 casingtype = /obj/item/ammo_casing/a762_39 loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, - /obj/item/gun/ballistic/automatic/assualt/ak47) + /obj/item/gun/ballistic/automatic/assault/ak47) /mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle icon_state = "frontiersmanrangedmosin" @@ -76,7 +76,7 @@ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, /obj/item/gun/ballistic/rifle/boltaction) - casingtype = /obj/item/ammo_casing/a762 + casingtype = /obj/item/ammo_casing/a762_54 projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' /mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index 5c722e9e1455..90030e7b0944 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -1,4 +1,4 @@ -// 7.12x82mm (SAW) +// 7.12x82mm (L6 SAW) /obj/item/ammo_casing/mm712x82 name = "7.12x82mm bullet casing" @@ -9,24 +9,24 @@ /obj/item/ammo_casing/mm712x82/ap name = "7.12x82mm armor-piercing bullet casing" - desc = "A 7.12x82mm bullet casing with a tungsten core to enhance armor penetration." - projectile_type = /obj/projectile/bullet/mm712x82_ap + desc = "A 7.12x82mm armor-piercing bullet casing." + projectile_type = /obj/projectile/bullet/mm712x82/ap bullet_skin = "ap" -/obj/item/ammo_casing/mm712x82/hollow - name = "7.12x82mm hollow-point bullet casing" - desc = "A 7.12x82mm bullet casing designed to fragment on impact, improving damage against soft targets." - projectile_type = /obj/projectile/bullet/mm712x82_hp +/obj/item/ammo_casing/mm712x82/hp + name = "7.12x82mm hollow point bullet casing" + desc = "A 7.12x82mm hollow point bullet casing." + projectile_type = /obj/projectile/bullet/mm712x82/hp bullet_skin = "hollow" -/obj/item/ammo_casing/mm712x82/incen +/obj/item/ammo_casing/mm712x82/inc name = "7.12x82mm incendiary bullet casing" - desc = "A 7.12x82mm bullet casing with an incendiary payload." + desc = "A 7.12x82mm incendiary bullet casing." projectile_type = /obj/projectile/bullet/incendiary/mm712x82 bullet_skin = "incen" /obj/item/ammo_casing/mm712x82/match name = "7.12x82mm match bullet casing" - desc = "A 7.12x82mm bullet casing of exceptionally high grade. A skilled marksman could pull off deadly richochet shots with this." - projectile_type = /obj/projectile/bullet/mm712x82_match + desc = "A 7.12x82mm match bullet casing." + projectile_type = /obj/projectile/bullet/mm712x82/match bullet_skin = "rubber" diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm index 99340d2ebdc1..15abfdb02e10 100644 --- a/code/modules/projectiles/ammunition/ballistic/pistol.dm +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -11,31 +11,31 @@ name = "10mm surplus bullet casing" desc = "A 10mm surplus bullet casing." bullet_skin = "surplus" - projectile_type = /obj/projectile/bullet/c10mm_surplus + projectile_type = /obj/projectile/bullet/c10mm/surplus /obj/item/ammo_casing/c10mm/ap name = "10mm armor-piercing bullet casing" desc = "A 10mm armor-piercing bullet casing." bullet_skin = "ap" - projectile_type = /obj/projectile/bullet/c10mm_ap + projectile_type = /obj/projectile/bullet/c10mm/ap /obj/item/ammo_casing/c10mm/hp name = "10mm hollow point bullet casing" desc = "A 10mm hollow point bullet casing." - projectile_type = /obj/projectile/bullet/c10mm_hp + projectile_type = /obj/projectile/bullet/c10mm/hp bullet_skin = "hollow" -/obj/item/ammo_casing/c10mm/fire +/obj/item/ammo_casing/c10mm/inc name = "10mm incendiary bullet casing" desc = "A 10mm incendiary bullet casing." bullet_skin = "incen" projectile_type = /obj/projectile/bullet/incendiary/c10mm -/obj/item/ammo_casing/c10mm/rubbershot +/obj/item/ammo_casing/c10mm/rubber name = "10mm rubber bullet casing" desc = "A 10mm rubber bullet casing." bullet_skin = "rubber" - projectile_type = /obj/projectile/bullet/c10mm/rubbershot + projectile_type = /obj/projectile/bullet/c10mm/rubber // 9mm (Commander + SABR) @@ -50,19 +50,19 @@ name = "9mm surplus bullet casing" desc = "A 9mm surplus bullet casing." bullet_skin = "surplus" - projectile_type = /obj/projectile/bullet/c9mm_surplus + projectile_type = /obj/projectile/bullet/c9mm/surplus /obj/item/ammo_casing/c9mm/ap name = "9mm armor-piercing bullet casing" desc = "A 9mm armor-piercing bullet casing." bullet_skin = "ap" - projectile_type =/obj/projectile/bullet/c9mm_ap + projectile_type =/obj/projectile/bullet/c9mm/ap /obj/item/ammo_casing/c9mm/hp name = "9mm hollow point bullet casing" desc = "A 9mm hollow point bullet casing." bullet_skin = "hollow" - projectile_type = /obj/projectile/bullet/c9mm_hp + projectile_type = /obj/projectile/bullet/c9mm/hp /obj/item/ammo_casing/c9mm/inc name = "9mm incendiary bullet casing" @@ -70,11 +70,11 @@ bullet_skin = "incen" projectile_type = /obj/projectile/bullet/incendiary/c9mm -/obj/item/ammo_casing/c9mm/rubbershot - name = "9mm rubbershot bullet casing" - desc = "A 9mm rubbershot bullet casing." +/obj/item/ammo_casing/c9mm/rubber + name = "9mm rubber bullet casing" + desc = "A 9mm rubber bullet casing." bullet_skin = "rubber" - projectile_type = /obj/projectile/bullet/c9mm/rubbershot + projectile_type = /obj/projectile/bullet/c9mm/rubber // .45 (M1911 + C20r) @@ -89,33 +89,33 @@ name = ".45 surplus bullet casing" desc = "A .45 surplus bullet casing." bullet_skin = "surplus" - projectile_type = /obj/projectile/bullet/c45_surplus + projectile_type = /obj/projectile/bullet/c45/surplus /obj/item/ammo_casing/c45/ap name = ".45 armor-piercing bullet casing" desc = "A .45 armor-piercing bullet casing." bullet_skin = "ap" - projectile_type =/obj/projectile/bullet/c45_ap + projectile_type =/obj/projectile/bullet/c45/ap /obj/item/ammo_casing/c45/hp name = ".45 hollow point bullet casing" desc = "A .45 hollow point bullet casing." bullet_skin = "hollow" - projectile_type = /obj/projectile/bullet/c45_hp + projectile_type = /obj/projectile/bullet/c45/hp -/obj/item/ammo_casing/c45/fire +/obj/item/ammo_casing/c45/inc name = ".45 incendiary bullet casing" desc = "A .45 incendiary bullet casing." bullet_skin = "incen" projectile_type = /obj/projectile/bullet/incendiary/c45 -/obj/item/ammo_casing/c45/rubbershot - name = ".45 rubbershot bullet casing" - desc = "A .45 rubbershot bullet casing." +/obj/item/ammo_casing/c45/rubber + name = ".45 rubber bullet casing" + desc = "A .45 rubber bullet casing." bullet_skin = "rubber" - projectile_type = /obj/projectile/bullet/c45/rubbershot + projectile_type = /obj/projectile/bullet/c45/rubber -// .50AE (Desert Eagle) +// .50 AE (Desert Eagle) /obj/item/ammo_casing/a50AE name = ".50 AE bullet casing" diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index bec8e1e3a502..47ad1b7aba84 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -1,4 +1,4 @@ -// .357 (Syndie Revolver) +// .357 (Syndicate Revolver) /obj/item/ammo_casing/a357 name = ".357 bullet casing" @@ -8,7 +8,7 @@ /obj/item/ammo_casing/a357/match name = ".357 match bullet casing" - desc = "A .357 bullet casing, manufactured to exceedingly high standards." + desc = "A .357 match bullet casing." caliber = ".357" projectile_type = /obj/projectile/bullet/a357/match @@ -27,7 +27,7 @@ /obj/item/ammo_casing/a4570/match name = ".45-70 match bullet casing" - desc = "A .45-70 bullet casing, manufactured to exceedingly high standards." + desc = "A .45-70 match bullet casing." bullet_skin = "rubber" projectile_type = /obj/projectile/bullet/a4570/match @@ -39,23 +39,23 @@ /obj/item/ammo_casing/a4570/explosive name = ".45-70 explosive bullet casing" - desc = "A .45-70 bullet casing, loaded with a tiny explosive charge." + desc = "A .45-70 explosive bullet casing." projectile_type = /obj/projectile/bullet/a4570/explosive // 7.62x38mmR (Nagant Revolver) -/obj/item/ammo_casing/n762 +/obj/item/ammo_casing/n762_38 name = "7.62x38mmR bullet casing" desc = "A 7.62x38mmR bullet casing." caliber = "7.62x38mmR" projectile_type = /obj/projectile/bullet/n762 -// .38 (Detective's Gun) +// .38 Special (Colt Detective Special & Winchester) /obj/item/ammo_casing/c38 - name = ".38 bullet casing" - desc = "A .38 bullet casing." + name = ".38 special bullet casing" + desc = "A .38 special bullet casing." caliber = ".38" projectile_type = /obj/projectile/bullet/c38 @@ -67,13 +67,13 @@ /obj/item/ammo_casing/c38/match name = ".38 match bullet casing" - desc = "A .38 bullet casing, manufactured to exceedingly high standards." + desc = "A .38 match bullet casing." bullet_skin = "rubber" projectile_type = /obj/projectile/bullet/c38/match /obj/item/ammo_casing/c38/match/bouncy name = ".38 rubber bullet casing" - desc = "A .38 rubber bullet casing, manufactured to exceedingly high standards." + desc = "A .38 rubber bullet casing." bullet_skin = "rubber" projectile_type = /obj/projectile/bullet/c38/match/bouncy diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index b91c901dd47b..ff6c42284055 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -1,17 +1,17 @@ -// 7.62 (Nagant Rifle) +// 7.62x54mmR (Illestren Hunting Rifle) -/obj/item/ammo_casing/a762 +/obj/item/ammo_casing/a762_54 name = "7.62x54mmR bullet casing" desc = "A 7.62x54mmR bullet casing." icon_state = "rifle-brass" caliber = "7.62x54mmR" - projectile_type = /obj/projectile/bullet/a762 + projectile_type = /obj/projectile/bullet/a762_54 // 8x58mm Caseless (SSG-669C) /obj/item/ammo_casing/caseless/a858 name = "8x58mm caseless round" - desc = "a 8x58mm caseless round." + desc = "A 8x58mm caseless round." icon_state = "caseless" caliber = "a858" projectile_type = /obj/projectile/bullet/a858 @@ -25,14 +25,16 @@ caliber = "a300" projectile_type = /obj/projectile/bullet/a300 -// 5.56mm (M-90gl Carbine & P-16) +// 5.56x39mm (M-90gl Carbine & P-16) -/obj/item/ammo_casing/a556 - name = "5.56mm bullet casing" - desc = "A 5.56mm bullet casing." +/obj/item/ammo_casing/a556_39 + name = "5.56x39mm bullet casing" + desc = "A 5.56x39mm bullet casing." icon_state = "rifle-brass" caliber = "5.56x45mm" - projectile_type = /obj/projectile/bullet/a556 + projectile_type = /obj/projectile/bullet/a556_45 + +// 5.45x39mm (AKS-74U) /obj/item/ammo_casing/a545_39 name = "5.45x39mm bullet casing" @@ -45,12 +47,14 @@ /obj/item/ammo_casing/a545_39/recycled name = "recycled 5.45x39mm bullet casing" - desc = "A recycled 5.45x39mm bullet casing. Likely has been spent and reloaded dozens of times." + desc = "A recycled 5.45x39mm bullet casing." bullet_skin = "surplus" caliber = "5.45x39mm" variance = 3.5 projectile_type = /obj/projectile/bullet/a545_39 +// 7.62x39mm (SVG-67 & SkM-24) + /obj/item/ammo_casing/a762_39 name = "7.62x39mm bullet casing" desc = "A 7.62x39mm bullet casing." @@ -59,6 +63,8 @@ variance = 2 projectile_type = /obj/projectile/bullet/a762_39 +// .300 Blackout (Polymer Survivor Rifle) + /obj/item/ammo_casing/aac_300blk name = ".300 BLK bullet casing" desc = "A .300 Blackout bullet casing." @@ -68,10 +74,12 @@ /obj/item/ammo_casing/aac_300blk/recycled name = "recycled .300 BLK bullet casing" - desc = "A .300 Blackout bullet casing. It looks like it has been re-necked and reloaded several times." + desc = "A recycled .300 Blackout bullet casing." caliber = ".300 BLK" projectile_type = /obj/projectile/bullet/aac_300blk +//.308 Winchester (M514 EBR & CM-GAL-S) + /obj/item/ammo_casing/win308 name = ".308 Winchester bullet casing" desc = "A .308 Winchester bullet casing." diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index bae27ebeace2..9f74727086e5 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -2,12 +2,12 @@ /obj/item/ammo_casing/shotgun name = "shotgun slug" - desc = "A 12 gauge lead slug." + desc = "A 12-gauge lead slug." icon = 'icons/obj/ammo_shotshells.dmi' icon_state = "slug" caliber = "12ga" custom_materials = list(/datum/material/iron=4000) - projectile_type = /obj/projectile/bullet/shotgun_slug + projectile_type = /obj/projectile/bullet/slug /obj/item/ammo_casing/shotgun/update_icon_state() icon_state = "[initial(icon_state)][BB ? "" : "-spent"]" @@ -15,9 +15,9 @@ /obj/item/ammo_casing/shotgun/buckshot name = "buckshot shell" - desc = "A 12 gauge buckshot shell." + desc = "A 12-gauge buckshot shell." icon_state = "buckshot" - projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot + projectile_type = /obj/projectile/bullet/pellet/buckshot pellets = 8 variance = 25 @@ -26,13 +26,13 @@ desc = "A weak beanbag slug for riot control." icon_state = "beanbag" custom_materials = list(/datum/material/iron=250) - projectile_type = /obj/projectile/bullet/shotgun_beanbag + projectile_type = /obj/projectile/bullet/slug/beanbag /obj/item/ammo_casing/shotgun/rubbershot name = "rubber shot" desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." icon_state = "rubber" - projectile_type = /obj/projectile/bullet/pellet/shotgun_rubbershot + projectile_type = /obj/projectile/bullet/pellet/rubbershot pellets = 8 variance = 25 custom_materials = list(/datum/material/iron=4000) @@ -47,16 +47,16 @@ name = "improvised shell" desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." icon_state = "improvised" - projectile_type = /obj/projectile/bullet/pellet/shotgun_improvised + projectile_type = /obj/projectile/bullet/pellet/improvised custom_materials = list(/datum/material/iron=250) pellets = 10 variance = 25 /obj/item/ammo_casing/shotgun/incapacitate name = "custom incapacitating shot" - desc = "A shotgun casing filled with... something. used to incapacitate targets." + desc = "A shotgun casing filled with... something. Used to incapacitate targets." icon_state = "bounty" - projectile_type = /obj/projectile/bullet/pellet/shotgun_incapacitate + projectile_type = /obj/projectile/bullet/pellet/rubbershot/incapacitate pellets = 12//double the pellets, but half the stun power of each, which makes this best for just dumping right in someone's face. variance = 25 custom_materials = list(/datum/material/iron=4000) @@ -65,12 +65,12 @@ name = "taser slug" desc = "A stunning taser slug." icon_state = "taser" - projectile_type = /obj/projectile/bullet/shotgun_stunslug + projectile_type = /obj/projectile/bullet/slug/stun custom_materials = list(/datum/material/iron=250) /obj/item/ammo_casing/shotgun/dart name = "shotgun dart" - desc = "A dart for use in shotguns. Can be injected with up to 30 units of any chemical." + desc = "A dart for use in shotguns. Can be injected with up to thirty units of any chemical." icon_state = "dart" projectile_type = /obj/projectile/bullet/dart var/reagent_amount = 30 @@ -115,13 +115,13 @@ name = "meteorslug shell" desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired." icon_state = "meteor" - projectile_type = /obj/projectile/bullet/shotgun_meteorslug + projectile_type = /obj/projectile/bullet/slug/meteor /obj/item/ammo_casing/shotgun/frag12 name = "FRAG-12 slug" desc = "A high explosive breaching round for a 12 gauge shotgun." icon_state = "frag12" - projectile_type = /obj/projectile/bullet/shotgun_frag12 + projectile_type = /obj/projectile/bullet/slug/frag12 /obj/item/ammo_casing/shotgun/ion name = "ion shell" @@ -152,7 +152,7 @@ name = "two-bore shell" desc = "A massive fucking two-bore shell." caliber = "twobore" - projectile_type = /obj/projectile/bullet/pellet/shotgun_buckshot/twobore + projectile_type = /obj/projectile/bullet/pellet/buckshot/twobore pellets = 6 variance = 20 transform = matrix(2, 0, 0, 0, 2, 0) diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index d58a1464f529..37218201902e 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -1,4 +1,4 @@ -// 4.6x30mm (Autorifles) +// 4.6x30mm (WT-550 Automatic Rifle & NT-SVG) /obj/item/ammo_casing/c46x30mm name = "4.6x30mm bullet casing" @@ -11,7 +11,7 @@ name = "4.6x30mm armor-piercing bullet casing" desc = "A 4.6x30mm armor-piercing bullet casing." bullet_skin = "ap" - projectile_type = /obj/projectile/bullet/c46x30mm_ap + projectile_type = /obj/projectile/bullet/c46x30mm/ap /obj/item/ammo_casing/c46x30mm/inc name = "4.6x30mm incendiary bullet casing" @@ -19,6 +19,8 @@ bullet_skin = "incen" projectile_type = /obj/projectile/bullet/incendiary/c46x30mm +// 4.73x33mm caseless (Solar) + /obj/item/ammo_casing/caseless/c47x33mm name = "4.73x33mm caseless round" desc = "A 4.73x33mm caseless round." @@ -26,9 +28,11 @@ caliber = "4.73x33mm caseless" projectile_type = /obj/projectile/bullet/c47x33mm +// 5.56mm HITP caseless (Pistole C) + /obj/item/ammo_casing/caseless/c556mm - name = "5.56mm caseless round" - desc = "A 5.56mm caseless round." + name = "5.56mm HITP caseless round" + desc = "A 5.56mm HITP caseless round." icon_state = "caseless" caliber = "5.56mm caseless" projectile_type = /obj/projectile/bullet/c556mm @@ -36,19 +40,19 @@ /obj/item/ammo_casing/caseless/c556mm/surplus name = "5.56mm HITP caseless surplus round" desc = "A 5.56mm HITP caseless surplus round." - projectile_type = /obj/projectile/bullet/c556mm_surplus + projectile_type = /obj/projectile/bullet/c556mm/surplus /obj/item/ammo_casing/caseless/c556mm/ap - name = "5.56mm HITP caseless armor piercing round" - desc = "A 5.56mm HITP caseless armor piercing round." - projectile_type = /obj/projectile/bullet/c556mm_ap + name = "5.56mm HITP caseless armor-piercing round" + desc = "A 5.56mm HITP caseless armor-piercing round." + projectile_type = /obj/projectile/bullet/c556mm/ap /obj/item/ammo_casing/caseless/c556mm/hp - name = "5.56mm HITP caseless hollow-point round" - desc = "A 5.56mm HITP caseless hollow-point round." - projectile_type = /obj/projectile/bullet/c556mm_hp + name = "5.56mm HITP caseless hollow point round" + desc = "A 5.56mm HITP caseless hollow point round." + projectile_type = /obj/projectile/bullet/c556mm/hp /obj/item/ammo_casing/caseless/c556mm/rubbershot - name = "5.56mm HITP rubber round" + name = "5.56mm HITP caseless rubber round" desc = "A 5.56mm HITP caseless rubber round." - projectile_type = /obj/projectile/bullet/c556mm/rubbershot + projectile_type = /obj/projectile/bullet/c556mm/rubber diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm index 4762e05a5cac..af7369204e6d 100644 --- a/code/modules/projectiles/ammunition/ballistic/sniper.dm +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -1,21 +1,21 @@ -// .50 (Sniper) +// .50 BMG (Sniper) /obj/item/ammo_casing/p50 - name = ".50 bullet casing" - desc = "A .50 bullet casing." + name = ".50 BMG bullet casing" + desc = "A .50 BMG bullet casing." icon_state = "big-steel" caliber = ".50 BMG" projectile_type = /obj/projectile/bullet/p50 /obj/item/ammo_casing/p50/soporific - name = ".50 soporific bullet casing" - desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." + name = ".50 BMG soporific bullet casing" + desc = "A .50 BMG soporific bullet casing." bullet_skin = "rubber" projectile_type = /obj/projectile/bullet/p50/soporific harmful = FALSE /obj/item/ammo_casing/p50/penetrator - name = ".50 penetrator round bullet casing" - desc = "A .50 caliber penetrator round casing." + name = ".50 BMG penetrator bullet casing" + desc = "A .50 BMG penetrator bullet casing." bullet_skin = "ap" projectile_type = /obj/projectile/bullet/p50/penetrator diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 253e9262e595..0336744ec748 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -1,6 +1,8 @@ +// .357 Speed Loaders (Syndicate Revolver) + /obj/item/ammo_box/a357 name = "speed loader (.357)" - desc = "Designed to quickly reload revolvers." + desc = "A 7-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor." icon_state = "357" ammo_type = /obj/item/ammo_casing/a357 max_ammo = 7 @@ -11,17 +13,19 @@ /obj/item/ammo_box/a357/match name = "speed loader (.357 match)" - desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + desc = "A 7-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." ammo_type = /obj/item/ammo_casing/a357/match /obj/item/ammo_box/a357/hp name = "speed loader (.357 hollow point)" - desc = "Designed to quickly reload revolvers. Loaded with expanding rounds that cause massive tissue damage at the cost of armor penetration." + desc = "A 7-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones." ammo_type = /obj/item/ammo_casing/a357/hp +// .45-70 Ammo Holders (Hunting Revolver) + /obj/item/ammo_box/a4570 name = "ammo holder (.45-70)" - desc = "Designed to help reload large revolvers." + desc = "A 6-round ammo holder for .45-70 revolvers. These rounds do significant damage with average performance against armor." icon_state = "4570" ammo_type = /obj/item/ammo_casing/a4570 max_ammo = 6 @@ -32,33 +36,37 @@ /obj/item/ammo_box/a4570/match name = "ammo holder (.45-70 match)" - desc = "Designed to help reload large revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + desc = "A 6-round ammo holder for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." ammo_type = /obj/item/ammo_casing/a4570/match /obj/item/ammo_box/a4570/hp name = "ammo holder (.45-70 hollow point)" - desc = "Designed to help reload large revolvers. Loaded with expanding rounds that cause massive tissue damage at the cost of armor penetration." + desc = "A 6-round ammo holder for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones." ammo_type = /obj/item/ammo_casing/a357/hp /obj/item/ammo_box/a4570/explosive name = "ammo holder (.45-70 explosive)" - desc = "Designed to help reload large revolvers. These rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs." + desc = "A 6-round ammo holder for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs." ammo_type = /obj/item/ammo_casing/a4570/explosive +// 7.62x38mmR Ammo Holders (Nagant Revolver) + /obj/item/ammo_box/n762_clip name = "ammo holder (7.62x38mmR)" - desc = "Designed to help reload Nagant revolvers." + desc = "A 7-round ammo holder for the Nagant revolver. These rounds do good damage, but struggle against armor." icon_state = "n762" - ammo_type = /obj/item/ammo_casing/n762 + ammo_type = /obj/item/ammo_casing/n762_38 max_ammo = 7 multiple_sprites = AMMO_BOX_PER_BULLET item_flags = NO_MAT_REDEMPTION w_class = WEIGHT_CLASS_TINY instant_load = TRUE +// .38 special Speed Loaders (Colt Detective Special) + /obj/item/ammo_box/c38 - name = "speed loader (.38)" - desc = "Designed to quickly reload revolvers." + name = "speed loader (.38 special)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do moderate damage, but plink against armor." icon_state = "38" ammo_type = /obj/item/ammo_casing/c38 max_ammo = 6 @@ -69,63 +77,111 @@ /obj/item/ammo_box/c38/trac name = "speed loader (.38 TRAC)" - desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit." ammo_type = /obj/item/ammo_casing/c38/trac /obj/item/ammo_box/c38/match name = "speed loader (.38 match)" - desc = "Designed to quickly reload revolvers. These rounds are manufactured within extremely tight tolerances, making them easy to show off trickshots with." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." ammo_type = /obj/item/ammo_casing/c38/match /obj/item/ammo_box/c38/match/bouncy name = "speed loader (.38 rubber)" - desc = "Designed to quickly reload revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." ammo_type = /obj/item/ammo_casing/c38/match/bouncy /obj/item/ammo_box/c38/dumdum name = "speed loader (.38 dum-dum)" - desc = "Designed to quickly reload revolvers. Dum-dum bullets shatter on impact and shred the target's innards, likely getting caught inside." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage." ammo_type = /obj/item/ammo_casing/c38/dumdum /obj/item/ammo_box/c38/hotshot name = "speed loader (.38 hot shot)" - desc = "Designed to quickly reload revolvers. Hot shot bullets contain an incendiary payload." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hot shot bullets contain an incendiary payload that set targets alight." ammo_type = /obj/item/ammo_casing/c38/hotshot /obj/item/ammo_box/c38/iceblox name = "speed loader (.38 iceblox)" - desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets." ammo_type = /obj/item/ammo_casing/c38/iceblox +// 7.62x54mmR Stripper Clip (Illestren Hunting Rifle) + +/obj/item/ammo_box/a762 + name = "stripper clip (7.62x54mmR)" + desc = "A 5-round stripper clip for the Illestren Hunting Rifle. These rounds do good damage with significant armor penetration." + icon_state = "762" + ammo_type = /obj/item/ammo_casing/a762_54 + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +// 8x58mm Stripper Clip (SSG-669C) + +/obj/item/ammo_box/a858 + name = "stripper clip (8x58mm)" + desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration." + icon_state = "762" + ammo_type = /obj/item/ammo_casing/caseless/a858 + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + +// .300 Blackout Stripper Clip (Polymer Survivor Rifle) + +/obj/item/ammo_box/aac_300blk_stripper + name = "stripper clip (.300 BLK)" + desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration." + icon_state = "762" + ammo_type = /obj/item/ammo_casing/aac_300blk + caliber = ".300 BLK" + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +// Ferromagnetic Pellet Speed Loader (Claris) + +/obj/item/ammo_box/amagpellet_claris + name = "\improper Claris speed loader (ferromagnetic pellet)" + desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration." + icon_state = "claris-sl" + ammo_type = /obj/item/ammo_casing/caseless/gauss + max_ammo = 22 + multiple_sprites = AMMO_BOX_FULL_EMPTY + item_flags = NO_MAT_REDEMPTION + +// Ammo Boxes + /obj/item/ammo_box/c38_box name = "ammo box (.38)" - desc = "A box of standard .38 ammo." + desc = "A box of standard .38 special ammo." icon_state = "38box" ammo_type = /obj/item/ammo_casing/c38 max_ammo = 50 /obj/item/ammo_box/a12g - name = "ammo box (12ga buckshot)" - desc = "A box of 12 gauge buckshot shells, devastating at close range." + name = "ammo box (12g buckshot)" + desc = "A box of 12-gauge buckshot shells, devastating at close range." icon_state = "12gbox-buckshot" ammo_type = /obj/item/ammo_casing/shotgun/buckshot max_ammo = 25 /obj/item/ammo_box/a12g/slug - name = "ammo box (12ga slug)" - desc = "A box of 12 gauge slugs, for improved accuracy and penetration." + name = "ammo box (12g slug)" + desc = "A box of 12-gauge slugs, for improved accuracy and penetration." icon_state = "12gbox-slug" ammo_type = /obj/item/ammo_casing/shotgun /obj/item/ammo_box/a12g/beanbag - name = "ammo box (12ga beanbag)" - desc = "A box of 12 gauge beanbag shells, for incapacitating targets." + name = "ammo box (12g beanbag)" + desc = "A box of 12-gauge beanbag shells, for incapacitating targets." icon_state = "12gbox-beanbag" ammo_type = /obj/item/ammo_casing/shotgun/beanbag /obj/item/ammo_box/a12g/rubbershot - name = "ammo box (12ga rubbershot)" - desc = "A box of 12 gauge rubbershot shells, designed for riot control." + name = "ammo box (12g rubbershot)" + desc = "A box of 12-gauge rubbershot shells, designed for riot control." icon_state = "12gbox-rubbershot" ammo_type = /obj/item/ammo_casing/shotgun/rubbershot @@ -146,7 +202,7 @@ name = "ammo box (9mm rubbershot)" desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage." icon_state = "9mmbox-rubbershot" - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot + ammo_type = /obj/item/ammo_casing/c9mm/rubber /obj/item/ammo_box/c9mm/ap name = "ammo box (9mm armor-piercing)" @@ -183,7 +239,7 @@ name = "ammo box (10mm rubbershot)" desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage." icon_state = "10mmbox-rubbershot" - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot + ammo_type = /obj/item/ammo_casing/c9mm/rubber /obj/item/ammo_box/c10mm/ap name = "ammo box (10mm armor-piercing)" @@ -201,7 +257,7 @@ name = "ammo box (10mm incendiary)" desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage." icon_state = "10mmbox-incendiary" - ammo_type = /obj/item/ammo_casing/c10mm/fire + ammo_type = /obj/item/ammo_casing/c10mm/inc /obj/item/ammo_box/c45 name = "ammo box (.45)" @@ -220,7 +276,7 @@ name = "ammo box (.45 rubbershot)" desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage." icon_state = "45box-rubbershot" - ammo_type = /obj/item/ammo_casing/c45/rubbershot + ammo_type = /obj/item/ammo_casing/c45/rubber /obj/item/ammo_box/c45/ap name = "ammo box (.45 armor-piercing)" @@ -238,7 +294,7 @@ name = "ammo box (.45 incendiary)" desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage." icon_state = "45box-incendiary" - ammo_type = /obj/item/ammo_casing/c45/fire + ammo_type = /obj/item/ammo_casing/c45/inc /obj/item/ammo_box/c556mmHITP name = "ammo box (5.56mm HITP caseless)" @@ -279,29 +335,11 @@ multiple_sprites = AMMO_BOX_PER_BULLET w_class = WEIGHT_CLASS_NORMAL -/obj/item/ammo_box/a762 - name = "stripper clip (7.62x54mmR)" - desc = "A stripper clip of rimmed rifle cartridges." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/a858 - name = "stripper clip (8x58mm)" - desc = "A rifle-cartrige stripper clip for the SSG-669C." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/caseless/a858 - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - /obj/item/ammo_box/n762 name = "ammo box (7.62x38mmR)" icon_state = "n762box" desc = "A box of unusual revolver ammunition with the bullet seated below the mouth of the cartridge." - ammo_type = /obj/item/ammo_casing/n762 + ammo_type = /obj/item/ammo_casing/n762_38 max_ammo = 28 /obj/item/ammo_box/a762_39 @@ -328,21 +366,3 @@ icon_state = "foambox_riot" ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot custom_materials = list(/datum/material/iron = 50000) - -/obj/item/ammo_box/magazine/zip_ammo_9mm - name = "budget pistol magazine(9mm)" - desc = "A cheaply-made, poorly-designed pistol magazine that can only hold 4 rounds." - icon_state = "ZipAmmo9mm" - ammo_type = /obj/item/ammo_casing/c9mm/surplus - caliber = "9mm" - max_ammo = 4 - custom_materials = list(/datum/material/iron = 20000) - -/obj/item/ammo_box/amagpellet_claris - name = "claris speed loader (ferromagnetic pellet)" - desc = "Designed to quickly reload the claris." - icon_state = "claris-sl" - ammo_type = /obj/item/ammo_casing/caseless/gauss - max_ammo = 22 - multiple_sprites = AMMO_BOX_FULL_EMPTY - item_flags = NO_MAT_REDEMPTION diff --git a/code/modules/projectiles/boxes_magazines/external/gauss.dm b/code/modules/projectiles/boxes_magazines/external/gauss.dm index 1d5800e75bbd..ca497d6560cb 100644 --- a/code/modules/projectiles/boxes_magazines/external/gauss.dm +++ b/code/modules/projectiles/boxes_magazines/external/gauss.dm @@ -1,5 +1,6 @@ /obj/item/ammo_box/magazine/gauss name = "gauss magazine (ferromagnetic pellets)" + desc = "A 24-round magazine for the prototype gauss rifle. Ferromagnetic pellets do okay damage with significant armor penetration." icon_state = "mediummagmag" ammo_type = /obj/item/ammo_casing/caseless/gauss caliber = "pellet" @@ -7,7 +8,8 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/modelh - name = "model-h magazine (ferromagnetic slugs)" + name = "Model H magazine (ferromagnetic slugs)" + desc = "A 10-round magazine for the Model H pistol. Ferromagnetic slugs are slow, but do incredible damage with significant armor penetration." icon_state = "smallmagmag" ammo_type = /obj/item/ammo_casing/caseless/gauss/slug caliber = "slug" @@ -15,7 +17,8 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/gar - name = "gar tube magazine (ferromagnetic lances)" + name = "GAR tube magazine (ferromagnetic lances)" + desc = "A 32-round magazined for the GAR assault rifle. Ferromagnetic lances do good damage with significant armor penetration." icon_state = "gar-mag" ammo_type = /obj/item/ammo_casing/caseless/gauss/lance caliber = "lance" diff --git a/code/modules/projectiles/boxes_magazines/external/grenade.dm b/code/modules/projectiles/boxes_magazines/external/grenade.dm index 315ed8a259a5..8c3ee5743b58 100644 --- a/code/modules/projectiles/boxes_magazines/external/grenade.dm +++ b/code/modules/projectiles/boxes_magazines/external/grenade.dm @@ -1,5 +1,6 @@ /obj/item/ammo_box/magazine/m75 name = "specialized magazine (.75)" + desc = "An 8-round specialized magazine for the gyrojet pistol. .75 rounds explode on impact." icon_state = "75" ammo_type = /obj/item/ammo_casing/caseless/a75 caliber = "75" diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm index f49c58aeb8e9..192a9f723857 100644 --- a/code/modules/projectiles/boxes_magazines/external/lmg.dm +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -1,5 +1,6 @@ /obj/item/ammo_box/magazine/mm712x82 name = "box magazine (7.12x82mm)" + desc = "A 50-round box magazine for the L6 SAW machine gun. These rounds do moderate damage with significant armor penetration." icon_state = "a762-50" base_icon_state = "a762" ammo_type = /obj/item/ammo_casing/mm712x82 @@ -9,18 +10,22 @@ /obj/item/ammo_box/magazine/mm712x82/hollow name = "box magazine (7.12x82mm HP)" - ammo_type = /obj/item/ammo_casing/mm712x82/hollow + desc = "A 50-round box magazine for the L6 SAW machine gun. These hollow point rounds do incredible damage against soft targets, but struggle against armored ones." + ammo_type = /obj/item/ammo_casing/mm712x82/hp /obj/item/ammo_box/magazine/mm712x82/ap name = "box magazine (7.12x82mm AP)" + desc = "A 50-round box magazine for the L6 SAW machine gun. These armor-piercing rounds are nearly perfect at piercing protective equipment." ammo_type = /obj/item/ammo_casing/mm712x82/ap -/obj/item/ammo_box/magazine/mm712x82/incen - name = "box magazine (7.12x82mm Incendiary)" - ammo_type = /obj/item/ammo_casing/mm712x82/incen +/obj/item/ammo_box/magazine/mm712x82/inc + name = "box magazine (7.12x82mm incendiary)" + desc = "A 50-round box magazine for the L6 SAW machine gun. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze." + ammo_type = /obj/item/ammo_casing/mm712x82/inc /obj/item/ammo_box/magazine/mm712x82/match - name = "box magazine (7.12x82mm Match)" + name = "box magazine (7.12x82mm match)" + desc = "A 50-round box magazine for the L6 SAW machine gun. These match rounds travel quicker with incredible armor penetration. Can also ricochet off targets." ammo_type = /obj/item/ammo_casing/mm712x82/match /obj/item/ammo_box/magazine/mm712x82/update_icon_state() diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index 44dc2b3d24d7..ca4702b641d7 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -1,64 +1,64 @@ /obj/item/ammo_box/magazine/m10mm name = "pistol magazine (10mm)" - desc = "A single-stack handgun magazine designed to chamber 10mm." + desc = "An 8-round single-stack magazine for the stechkin pistol. These rounds do moderate damage, but struggle against armor." icon_state = "9x19p" ammo_type = /obj/item/ammo_casing/c10mm caliber = "10mm" max_ammo = 8 multiple_sprites = AMMO_BOX_FULL_EMPTY -/obj/item/ammo_box/magazine/m10mm/fire +/obj/item/ammo_box/magazine/m10mm/inc name = "pistol magazine (10mm incendiary)" + desc = "An 8-round single-stack magazine for the stechkin pistol. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze." icon_state = "9x19pI" - desc = "A single-stack handgun magazine designed to chamber 10mm. Loaded with rounds which ignite the target." - ammo_type = /obj/item/ammo_casing/c10mm/fire + ammo_type = /obj/item/ammo_casing/c10mm/inc /obj/item/ammo_box/magazine/m10mm/hp name = "pistol magazine (10mm HP)" + desc = "An 8-round single-stack magazine for the stechkin pistol. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones." icon_state = "9x19pH" - desc= "A single-stack handgun magazine designed to chamber 10mm. Loaded with rounds which deal more damage, but are completely ineffective against armor." ammo_type = /obj/item/ammo_casing/c10mm/hp /obj/item/ammo_box/magazine/m10mm/ap name = "pistol magazine (10mm AP)" + desc = "An 8-round single-stack magazine for the stechkin pistol. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power." icon_state = "9x19pA" - desc= "A single-stack handgun magazine designed to chamber 10mm. Loaded with rounds which penetrate armour, but are less effective against normal targets." ammo_type = /obj/item/ammo_casing/c10mm/ap -/obj/item/ammo_box/magazine/m10mm/rubbershot - name = "pistol magazine (10mm rubbershot)" +/obj/item/ammo_box/magazine/m10mm/rubber + name = "pistol magazine (10mm rubber)" + desc = "An 8-round handgun magazine for the stechkin pistol. These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor." icon_state = "9x19pR" - desc = "A single-stack handgun magazine designed to chamber 10mm. Loaded with less-lethal rubber rounds which disable targets without causing serious damage." - ammo_type = /obj/item/ammo_casing/c10mm/rubbershot + ammo_type = /obj/item/ammo_casing/c10mm/rubber /obj/item/ammo_box/magazine/m45 name = "pistol magazine (.45)" - desc = "A single stack M1911 reproduction magazine, faithfully designed to chamber .45." + desc = "An 8-round single-stack magazine for the M1911 pistol. These rounds do moderate damage, but struggle against armor." icon_state = "45-8" base_icon_state = "45" ammo_type = /obj/item/ammo_casing/c45 caliber = ".45" max_ammo = 8 -/obj/item/ammo_box/magazine/m45/fire +/obj/item/ammo_box/magazine/m45/inc name = "pistol magazine (.45 incendiary)" - desc = "A single stack M1911 reproduction magazine, faithfully designed to chamber .45. Loaded with rounds which ignite the target." - ammo_type = /obj/item/ammo_casing/c45/fire + desc = "An 8-round single-stack magazine for the M1911 pistol. These incendiary rounds deal mediocre damage, but leave flaming trails which set targets ablaze." + ammo_type = /obj/item/ammo_casing/c45/inc /obj/item/ammo_box/magazine/m45/hp name = "pistol magazine (.45 HP)" - desc= "A single stack M1911 reproduction magazine, faithfully designed to chamber .45. Loaded with rounds which deal more damage, but are completely ineffective against armor." + desc= "An 8-round single-stack magazine for the M1911 pistol. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones." ammo_type = /obj/item/ammo_casing/c45/hp /obj/item/ammo_box/magazine/m45/ap name = "pistol magazine (.45 AP)" - desc= "A single stack M1911 reproduction magazine, faithfully designed to chamber .45. Loaded with rounds which penetrate armour, but are less effective against normal targets." + desc= "An 8-round single-stack magazine for the M1911 pistol. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power." ammo_type = /obj/item/ammo_casing/c45/ap -/obj/item/ammo_box/magazine/m45/rubbershot - name = "pistol magazine (.45 rubbershot)" - desc = "A single stack M1911 reproduction magazine, faithfully designed to chamber .45. Loaded with less-lethal rubber rounds which disable targets without causing serious damage." - ammo_type = /obj/item/ammo_casing/c45/rubbershot +/obj/item/ammo_box/magazine/m45/rubber + name = "pistol magazine (.45 rubber)" + desc = "An 8-round single-stack magazine for the M1911 pistol. These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor." + ammo_type = /obj/item/ammo_casing/c45/rubber /obj/item/ammo_box/magazine/m45/update_icon_state() . = ..() @@ -66,32 +66,32 @@ /obj/item/ammo_box/magazine/co9mm name = "pistol magazine (9mm)" - desc = "A double-stack pistol magazine designed to chamber 9mm." + desc = "A 10-round double-stack magazine for standard-issue 9mm pistols. These rounds do okay damage, but struggle against armor." icon_state = "co9mm-8" base_icon_state = "co9mm" ammo_type = /obj/item/ammo_casing/c9mm caliber = "9mm" max_ammo = 10 -/obj/item/ammo_box/magazine/co9mm/fire +/obj/item/ammo_box/magazine/co9mm/inc name = "pistol magazine (9mm incendiary)" - desc = "A double-stack pistol magazine designed to chamber 9mm. Loaded with rounds which ignite the target." + desc = "A 10-round double-stack magazine for standard-issue 9mm pistols. These incendiary rounds deal pitiful damage, but leave flaming trails which set targets ablaze." ammo_type = /obj/item/ammo_casing/c9mm/inc /obj/item/ammo_box/magazine/co9mm/hp name = "pistol magazine (9mm HP)" - desc= "A double-stack pistol magazine designed to chamber 9mm. Loaded with rounds which deal more damage, but are completely ineffective against armor." + desc= "A 10-round double-stack magazine for standard-issue 9mm pistols. These hollow point rounds do significant damage against soft targets, but are nearly ineffective against armored ones." ammo_type = /obj/item/ammo_casing/c9mm/hp /obj/item/ammo_box/magazine/co9mm/ap name = "pistol magazine (9mm AP)" - desc= "A double-stack pistol magazine designed to chamber 9mm. Loaded with rounds which penetrate armour, but are less effective against normal targets." + desc= "A 10-round double-stack magazine for standard-issue 9mm pistols. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power." ammo_type = /obj/item/ammo_casing/c9mm/ap -/obj/item/ammo_box/magazine/co9mm/rubbershot - name = "pistol magazine (9mm rubbershot)" - desc = "A double-stack pistol magazine designed to chamber 9mm. Loaded with less-lethal rubber rounds which disable targets without causing serious damage." - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot +/obj/item/ammo_box/magazine/co9mm/rubber + name = "pistol magazine (9mm rubber)" + desc = "A 10-round double-stack magazine for standard-issue 9mm pistols. These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor." + ammo_type = /obj/item/ammo_casing/c9mm/rubber /obj/item/ammo_box/magazine/co9mm/update_icon_state() . = ..() @@ -99,7 +99,7 @@ /obj/item/ammo_box/magazine/pistolm9mm name = "large pistol magazine (9mm)" - desc = "An extended double stack pistol magazine, designed to chamber 9mm." + desc = "A long, 15-round double-stack magazine designed for the stechkin APS pistol. These rounds do okay damage, but struggle against armor." icon_state = "9x19p-8" base_icon_state = "9x19p" ammo_type = /obj/item/ammo_casing/c9mm @@ -112,7 +112,7 @@ /obj/item/ammo_box/magazine/m50 name = "handgun magazine (.50 AE)" - desc = "An oversized handgun magazine designed to chamber .50 AE." + desc = "An oversized, 7-round handgun magazine for the Desert Eagle handgun. These rounds do significant damage with average performance against armor." icon_state = "50ae" ammo_type = /obj/item/ammo_casing/a50AE caliber = ".50 AE" @@ -127,3 +127,12 @@ caliber = ".38" max_ammo = 3 w_class = WEIGHT_CLASS_TINY + +/obj/item/ammo_box/magazine/zip_ammo_9mm + name = "budget pistol magazine (9mm)" + desc = "A cheaply-made, 4-round surplus magazine that fits standard-issue 9mm pistols. These rounds do okay damage, but struggle against armor." + icon_state = "ZipAmmo9mm" + ammo_type = /obj/item/ammo_casing/c9mm/surplus + caliber = "9mm" + max_ammo = 4 + custom_materials = list(/datum/material/iron = 20000) diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 5a4af7929cff..f5cb7e7ee9a2 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -1,6 +1,6 @@ /obj/item/ammo_box/magazine/recharge name = "power pack" - desc = "A rechargeable, detachable battery that serves as a magazine for laser rifles." + desc = "A detachable, rechargeable battery for the laser rifle. Grants 20 shots at full charge." icon_state = "oldrifle-20" base_icon_state = "oldrifle" ammo_type = /obj/item/ammo_casing/caseless/laser diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm index 1e184405effa..86fef186652b 100644 --- a/code/modules/projectiles/boxes_magazines/external/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -1,6 +1,6 @@ /obj/item/ammo_box/magazine/m10mm/rifle name = "rifle magazine (10mm)" - desc = "A well-worn magazine fitted for surplus rifles, designed to chamber 10mm." + desc = "A well-worn, 10-round magazine for the surplus rifle. These rounds do moderate damage, but struggle against armor." icon_state = "75-8" base_icon_state = "75" ammo_type = /obj/item/ammo_casing/c10mm @@ -13,16 +13,16 @@ /obj/item/ammo_box/magazine/m556 name = "toploader magazine (5.56x45mm)" - desc = "An advanced top-loading assault rifle magazine, designed to chamber 5.56x45mm." + desc = "An advanced, 30-round toploading magazine for the M-90gl Carbine. These rounds do moderate damage with good armor penetration." icon_state = "5.56m" - ammo_type = /obj/item/ammo_casing/a556 + ammo_type = /obj/item/ammo_casing/a556_39 caliber = "5.56x45mm" max_ammo = 30 multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/rifle47x33mm - name = "\improper SolGov AR magazine (4.73x33mm caseless)" - desc = "A rather large magazine designed to chamber 4.73x33mm caseless." + name = "\improper Solarian LMG magazine (4.73x33mm caseless)" + desc = "A large, 50-round magazine for the Solar machine gun. These rounds do moderate damage with good armor penetration." icon_state = "47x33mm-50" base_icon_state = "47x33mm" ammo_type = /obj/item/ammo_casing/caseless/c47x33mm @@ -35,8 +35,8 @@ icon_state = "[base_icon_state]-[round(ammo_count(),5)]" /obj/item/ammo_box/magazine/aks74u - name = "\improper assault rifle Magazine (5.45x39mm)" - desc = "A slightly curved assault rifle magazine designed to chamber 5.45x39mm." + name = "assault rifle magazine (5.45x39mm)" + desc = "A slightly-curved, 30-round magazine for the AKS-74U. These rounds do moderate damage with good armor penetration." icon_state = "ak47_mag" ammo_type = /obj/item/ammo_casing/a545_39 caliber = "5.45x39mm" @@ -47,8 +47,8 @@ icon_state = "ak47_mag-[!!ammo_count()]" /obj/item/ammo_box/magazine/aknt - name = "\improper subcaliber assault rifle magazine (4.6x30mm))" - desc = "A cheap polymer assault rifle magazine designed to chamber 4.6x30mm." + name = "subcaliber assault rifle magazine (4.6x30mm)" + desc = "A cheap, 30-round polymer magazine for the NT-SVG. These rounds do okay damage with average performance against armor." icon_state = "ak47_mag" ammo_type = /obj/item/ammo_casing/c46x30mm caliber = "4.6x30mm" @@ -59,8 +59,8 @@ icon_state = "ak47_mag-[!!ammo_count()]" /obj/item/ammo_box/magazine/ak47 - name = "\improper assault rifle magazine (7.62x39mm)" - desc = "A sharply curved assault rifle magazine, designed to chamber 7.62x39mm." + name = "assault rifle magazine (7.62x39mm)" + desc = "A sharply-curved, 20-round magazine for 7.62x39mm assault rifles. These rounds do good damage with good armor penetration." icon_state = "ak47_mag" ammo_type = /obj/item/ammo_casing/a762_39 caliber = "7.62x39mm" @@ -71,8 +71,8 @@ icon_state = "ak47_mag-[!!ammo_count()]" /obj/item/ammo_box/magazine/ebr - name = "\improper battle rifle magazine (.308 Winchester)" - desc = "A small steel battle rifle magazine designed to chamber .308 Winchester." + name = "battle rifle magazine (.308 Winchester)" + desc = "A small, 10-round steel magazine for the M514 EBR. These rounds do good damage with significant armor penetration." icon_state = "ebr_mag" ammo_type = /obj/item/ammo_casing/win308 caliber = ".308 Winchester" @@ -83,7 +83,8 @@ icon_state = "ebr_mag-[!!ammo_count()]" /obj/item/ammo_box/magazine/gal - name = "\improper CM-GAL Magazine (.308)" + name = "\improper GAL Magazine (.308 Winchester)" + desc = "A standard 10-round magazine for GAL platform DMRs. These rounds do good damage with significant armor penetration." icon_state = "ebr_mag" ammo_type = /obj/item/ammo_casing/win308 caliber = ".308 Winchester" @@ -94,10 +95,10 @@ icon_state = "galmag-[!!ammo_count()]" /obj/item/ammo_box/magazine/p16 - name = "\improper assault rifle magazine (5.56x45mm)" - desc = "A simple assault rifle magazine designed to chamber 5.56x45mm." + name = "assault rifle magazine (5.56x45mm)" + desc = "A simple, 30-round magazine for 5.56x45mm assault rifles. These rounds do moderate damage with good armor penetration." icon_state = "p16_mag" - ammo_type = /obj/item/ammo_casing/a556 + ammo_type = /obj/item/ammo_casing/a556_39 caliber = "5.56x45mm" max_ammo = 30 @@ -106,23 +107,13 @@ icon_state = "p16_mag-[!!ammo_count()]" /obj/item/ammo_box/magazine/swiss - name = "\improper Swiss Cheese Magazine (5.56mm)" + name = "\improper Swiss Cheese Magazine (5.56x45mm)" + desc = "A deft, 30-round magazine for the Swiss Cheese assault rifle. These rounds do moderate damage with good armor penetration." icon_state = "swissmag" - ammo_type = /obj/item/ammo_casing/a556 - caliber = "a556" + ammo_type = /obj/item/ammo_casing/a556_39 + caliber = "5.56x45mm" max_ammo = 30 /obj/item/ammo_box/magazine/swiss/update_icon_state() . = ..() icon_state = "swissmag-[!!ammo_count()]" - -/obj/item/ammo_box/aac_300blk_stripper - name = "stripper clip (.300 BLK)" - desc = "A stripper clip fitted for .300 Blackout." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/aac_300blk - caliber = ".300 BLK" - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index 9bf2073fa443..587718e5caad 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -1,7 +1,7 @@ /obj/item/ammo_box/magazine/wt550m9 name = "wt550 magazine (4.6x30mm)" - desc = "A compact top-loading PDW magazine, designed to chamber 4.6x30mm." - icon_state = "46x30mmt-20" + desc = "A compact, 30-round top-loading magazine for the WT-550 Automatic Rifle. These rounds do okay damage with average performance against armor." + icon_state = "46x30mmt-30" base_icon_state = "46x30mmt" ammo_type = /obj/item/ammo_casing/c46x30mm caliber = "4.6x30mm" @@ -9,30 +9,25 @@ /obj/item/ammo_box/magazine/wt550m9/update_icon_state() . = ..() - icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" + icon_state = "[base_icon_state]-[round(ammo_count(), 6)]" -/obj/item/ammo_box/magazine/wt550m9/wtap - name = "wt550 magazine (Armour Piercing 4.6x30mm)" - icon_state = "46x30mmtA-20" +/obj/item/ammo_box/magazine/wt550m9/ap + name = "wt550 magazine (4.6x30mm AP)" + desc = "A compact, 30-round top-loading magazine for the WT-550 Automatic Rifle. These armor-piercing rounds are great at piercing protective equipment, but lose some stopping power." + icon_state = "46x30mmtA-30" base_icon_state = "46x30mmtA" ammo_type = /obj/item/ammo_casing/c46x30mm/ap -/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon_state() - . = ..() - icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" - -/obj/item/ammo_box/magazine/wt550m9/wtic - name = "wt550 magazine (Incendiary 4.6x30mm)" - icon_state = "46x30mmtI-20" +/obj/item/ammo_box/magazine/wt550m9/inc + name = "wt550 magazine (4.6x30mm incendiary)" + desc = "A compact, 30-round top-loading magazine for the WT-550 Automatic Rifle. These incendiary rounds deal pitiful damage, but leave flaming trails which set targets ablaze." + icon_state = "46x30mmtI-30" + base_icon_state = "46x30mmtI" ammo_type = /obj/item/ammo_casing/c46x30mm/inc -/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon_state() - . = ..() - icon_state = "[base_icon_state]-[round(ammo_count(),4)]" - /obj/item/ammo_box/magazine/uzim9mm name = "long SMG magazine (9mm)" - desc = "A long submachine gun magazine, designed to chamber 9mm." + desc = "A thin, 32-round magazine for the Uzi SMG. These rounds do okay damage, but struggle against armor." icon_state = "uzi9mm-32" base_icon_state = "uzi9mm" ammo_type = /obj/item/ammo_casing/c9mm @@ -45,7 +40,7 @@ /obj/item/ammo_box/magazine/smgm9mm name = "SMG magazine (9mm)" - desc = "A submachine gun magazine, designed to chamber 9mm." + desc = "A 30-round magazine for 9mm submachine guns. These rounds do okay damage, but struggle against armor." icon_state = "smg9mm-42" base_icon_state = "smg9mm" ammo_type = /obj/item/ammo_casing/c9mm @@ -57,19 +52,23 @@ icon_state = "[base_icon_state]-[ammo_count() ? 42 : 0]" /obj/item/ammo_box/magazine/smgm9mm/ap - name = "SMG magazine (Armour Piercing 9mm)" + name = "SMG magazine (9mm AP)" + desc = "A 30-round magazine for 9mm submachine guns. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power." ammo_type = /obj/item/ammo_casing/c9mm/ap -/obj/item/ammo_box/magazine/smgm9mm/fire - name = "SMG Magazine (Incendiary 9mm)" +/obj/item/ammo_box/magazine/smgm9mm/inc + name = "SMG Magazine (9mm incendiary)" + desc = "A 30-round magazine for 9mm submachine guns. These incendiary rounds deal pitiful damage, but leave flaming trails which set targets ablaze." ammo_type = /obj/item/ammo_casing/c9mm/inc -/obj/item/ammo_box/magazine/smgm9mm/rubbershot - name = "SMG Magazine (Rubbershot 9mm)" - ammo_type = /obj/item/ammo_casing/c9mm/rubbershot +/obj/item/ammo_box/magazine/smgm9mm/rubber + name = "SMG Magazine (9mm rubber)" + desc = "A 30-round magazine for 9mm submachine guns. These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor." + ammo_type = /obj/item/ammo_casing/c9mm/rubber /obj/item/ammo_box/magazine/smgm10mm name = "SMG magazine (10mm)" + desc = "A 24-round magazine for the SkM-44(k). These rounds do moderate damage, but struggle against armor." icon_state = "smg10mm-24" base_icon_state = "smg10mm" ammo_type = /obj/item/ammo_casing/c10mm @@ -80,13 +79,14 @@ . = ..() icon_state = "[base_icon_state]-[ammo_count() == 1 ? 1 : round(ammo_count(),3)]" -/obj/item/ammo_box/magazine/smgm10mm/rubbershot - name = "SMG magazine (Rubbershot 10mm)" - ammo_type = /obj/item/ammo_casing/c10mm/rubbershot +/obj/item/ammo_box/magazine/smgm10mm/rubber + name = "SMG magazine (10mm rubber)" + desc = "A 24-round magazine for the SkM-44(k). These rubber rounds trade lethality for a heavy impact which can incapacitate targets. Performs even worse against armor." + ammo_type = /obj/item/ammo_casing/c10mm/rubber /obj/item/ammo_box/magazine/smgm45 name = "SMG magazine (.45)" - desc = "A bullpup submachine gun magazine, designed to chamber .45." + desc = "A 24-round magazine for .45 submachine guns. These rounds do moderate damage, but struggle against armor." icon_state = "c20r45-24" base_icon_state = "c20r45" ammo_type = /obj/item/ammo_casing/c45 @@ -99,7 +99,7 @@ /obj/item/ammo_box/magazine/smgm45/drum name = "drum magazine (.45)" - desc = "A bulky drum magazine for submachine guns, designed to chamber .45." + desc = "A bulky, 50-round drum magazine for .45 submachine guns. These rounds do moderate damage, but struggle against armor." icon_state = "drum45" max_ammo = 50 w_class = WEIGHT_CLASS_NORMAL @@ -110,7 +110,7 @@ /obj/item/ammo_box/magazine/pistol556mm name = "handgun magazine (5.56mm HITP caseless)" - desc = "A double-stack handgun magazine designed to chamber 5.56mm HITP caseless." + desc = "A 12-round, double-stack magazine for the Pistole C pistol. These rounds do okay damage with average performance against armor." icon_state = "5.56mmHITP-12" //ok i did it base_icon_state = "5.56mmHITP" ammo_type = /obj/item/ammo_casing/caseless/c556mm @@ -122,8 +122,8 @@ icon_state = "[base_icon_state]-[round(ammo_count(),2)]" /obj/item/ammo_box/magazine/tec9 - name = "machine pistol magazine(9mm AP)" - desc = "A very high capacity machine pistol magazine, designed to chamber 9mm." + name = "machine pistol magazine (9mm AP)" + desc = "A sizable 20-round magazine for the TEC-9 machine pistol. These armor-piercing rounds are okay at piercing protective equipment, but lose some stopping power.." icon_state = "tec_mag" ammo_type = /obj/item/ammo_casing/c9mm/ap caliber = "9mm" diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm index 348ff6436a1c..25894102905f 100644 --- a/code/modules/projectiles/boxes_magazines/external/sniper.dm +++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm @@ -1,8 +1,8 @@ /obj/item/ammo_box/magazine/sniper_rounds - name = "anti-materiel rifle magazine (.50)" + name = "anti-material rifle magazine (.50 BMG)" + desc = "A large, heavy 6-round box magazine designed for the sniper rifle. These rounds deal absurd damage, able to delimb targets, knock them on their feet, and bypass most protective equipment." icon_state = ".50mag" base_icon_state = ".50mag" - desc = "A large, heavy box magazine designed to chamber massive .50 BMG rounds." ammo_type = /obj/item/ammo_casing/p50 max_ammo = 6 caliber = ".50 BMG" @@ -13,14 +13,15 @@ icon_state = "[base_icon_state][ammo_count() ? "-ammo" : ""]" /obj/item/ammo_box/magazine/sniper_rounds/soporific - name = "anti-materiel rifle magazine (Zzzzz)" - desc = "A lower-capacity anti-materiel rifle magazine designed for specialized, soporific .50 BMG rounds." + name = "anti-material rifle magazine (.50 BMG soporific)" + desc = "A large, heavy 3-round box magazine designed for the sniper rifle. These soporific rounds are completely non-lethal, but render targets asleep for a little under a minute." icon_state = "soporific" ammo_type = /obj/item/ammo_casing/p50/soporific max_ammo = 3 /obj/item/ammo_box/magazine/sniper_rounds/penetrator - name = "anti-materiel rifle magazine (penetrator)" - desc = "A box magazine loaded with armor-piercing .50 BMG rounds powerful enough to punch through multiple targets and structures." + name = "anti-material rifle magazine (.50 BMG penetrator)" + desc = "A large, heavy 5-round box magazine designed for the sniper rifle. These penetrator rounds deal incredible damage and will penetrate most structures, though they don't knock down or delimb targets." + icon_state = "haemorrhage" ammo_type = /obj/item/ammo_casing/p50/penetrator max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm index 737a77cc2dc7..13b007e229e0 100644 --- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -7,7 +7,7 @@ /obj/item/ammo_box/magazine/internal/cylinder/rev762 name = "\improper Nagant revolver cylinder" - ammo_type = /obj/item/ammo_casing/n762 + ammo_type = /obj/item/ammo_casing/n762_38 caliber = "7.62x38mmR" max_ammo = 7 instant_load = FALSE diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 1b9bf492eca8..b85b223c254b 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -1,14 +1,14 @@ /obj/item/ammo_box/magazine/internal/boltaction name = "bolt action rifle internal magazine" desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a762 + ammo_type = /obj/item/ammo_casing/a762_54 caliber = "7.62x54mmR" max_ammo = 5 instant_load = TRUE /obj/item/ammo_box/magazine/internal/boltaction/enchanted max_ammo = 1 - ammo_type = /obj/item/ammo_casing/a762 + ammo_type = /obj/item/ammo_casing/a762_54 /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage ammo_type = /obj/item/ammo_casing/magic/arcane_barrage diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm index fff17d1b8e07..7ec610bbc33c 100644 --- a/code/modules/projectiles/guns/ballistic/assault.dm +++ b/code/modules/projectiles/guns/ballistic/assault.dm @@ -1,10 +1,10 @@ -/obj/item/gun/ballistic/automatic/assualt +/obj/item/gun/ballistic/automatic/assault burst_size = 1 actions_types = list() -/obj/item/gun/ballistic/automatic/assualt/ak47 +/obj/item/gun/ballistic/automatic/assault/ak47 name = "\improper SVG-67" - desc = "A frontier-built assault rifle descended from a pattern of unknown provenance. Its low cost and ease of maintenance make it a popular choice among a wide variety of outlaws." + desc = "A Frontier-built assault rifle descended from a pattern of unknown provenance. Its low cost, ease of maintenance, and powerful 7.62x39mm cartridge make it a popular choice among a wide variety of outlaws." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/ak47.ogg' icon_state = "ak47" @@ -15,20 +15,17 @@ slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/ak47 -/obj/item/gun/ballistic/automatic/assualt/ak47/ComponentInitialize() +/obj/item/gun/ballistic/automatic/assault/ak47/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) -/obj/item/gun/ballistic/automatic/assualt/ak47/nt +/obj/item/gun/ballistic/automatic/assault/ak47/nt name = "\improper NT-SVG" - desc = "An even cheaper version of the already-cheap SVG-67, rechambered for the lightweight 4.6x30mm PDW cartridge. The flimsy folding stock and light construction make for a highly portable rifle lacking in accuracy and stopping power." + desc = "An even cheaper version of the SVG-67, rechambered for the lightweight 4.6x30mm PDW cartridge. The flimsy folding stock and light construction make for a highly-portable rifle that lacks accuracy and power." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/shot.ogg' icon_state = "ak47_nt" item_state = "ak47_nt" - mag_display = TRUE - weapon_weight = WEAPON_MEDIUM - w_class = WEIGHT_CLASS_BULKY mag_type = /obj/item/ammo_box/magazine/aknt var/folded = FALSE var/unfolded_spread = 2 @@ -36,7 +33,7 @@ var/folded_spread = 20 var/folded_item_state = "ak47_nt_stockless" -/obj/item/gun/ballistic/automatic/assualt/ak47/nt/CtrlClick(mob/user) +/obj/item/gun/ballistic/automatic/assault/ak47/nt/CtrlClick(mob/user) . = ..() if((!ishuman(user) || user.stat)) return @@ -47,7 +44,7 @@ user.update_inv_hands() user.update_inv_s_store() -/obj/item/gun/ballistic/automatic/assualt/ak47/nt/proc/fold(mob/user) +/obj/item/gun/ballistic/automatic/assault/ak47/nt/proc/fold(mob/user) if(folded) to_chat(user, "You unfold the stock on the [src].") spread = unfolded_spread @@ -63,7 +60,7 @@ playsound(src.loc, 'sound/weapons/empty.ogg', 100, 1) update_appearance() -/obj/item/gun/ballistic/automatic/assualt/ak47/nt/update_overlays() +/obj/item/gun/ballistic/automatic/assault/ak47/nt/update_overlays() . = ..() var/mutable_appearance/stock if(!folded) @@ -72,58 +69,54 @@ stock = mutable_appearance(icon, null) . += stock -/obj/item/gun/ballistic/automatic/assualt/ak47/inteq +/obj/item/gun/ballistic/automatic/assault/ak47/inteq name = "\improper SkM-24" - desc = "An obsolete assault rifle seized from some frontier armory and extensively modified to IRMG standards. Chambered in 7.62x39mm." + desc = "An antique assault rifle seized from Frontiersmen armories then extensively modified to IRMG standards. Chambered in 7.62x39mm." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/akm.ogg' icon_state = "akm" item_state = "akm" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' mob_overlay_icon = 'icons/mob/clothing/back.dmi' - mag_display = TRUE -/obj/item/gun/ballistic/automatic/assualt/p16 +/obj/item/gun/ballistic/automatic/assault/p16 name = "\improper P-16" - desc = "A Night of Fire-era assault rifle pattern from Sol, chambered in 5.56mm. Rediscovered by the Colonial Minutemen and now frequently reproduced. A favorite of professional mercenaries and well-heeled pirates." + desc = "An assault rifle pattern from Sol, existing before the Night of Fire. A favorite of professional mercenaries and well-heeled pirates. Chambered in 5.56mm." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/m16.ogg' icon_state = "p16" item_state = "p16" mag_display = TRUE - weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK mag_type = /obj/item/ammo_box/magazine/p16 -/obj/item/gun/ballistic/automatic/assualt/p16/ComponentInitialize() +/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) -/obj/item/gun/ballistic/automatic/assualt/p16/minutemen +/obj/item/gun/ballistic/automatic/assault/p16/minutemen name = "\improper CM-16" - desc = "An extensive modification of the P-16, now the standard-issue rifle of the Colonial Minutemen. Chambered in 5.56mm." + desc = "The standard-issue rifle of the Colonial Minutemen and an extensively modified reproduction of the P-16. Chambered in 5.56mm." icon_state = "cm16" item_state = "cm16" -/obj/item/gun/ballistic/automatic/assualt/ar +/obj/item/gun/ballistic/automatic/assault/ar name = "\improper NT-ARG 'Boarder'" desc = "A burst-fire 5.56mm carbine occasionally found in the hands of Nanotrasen marines." fire_sound = 'sound/weapons/gun/rifle/shot_alt2.ogg' icon_state = "arg" item_state = "arg" slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/m556 + mag_type = /obj/item/ammo_box/magazine/p16 can_suppress = FALSE burst_size = 3 fire_delay = 1 -/obj/item/gun/ballistic/automatic/assualt/ar/ComponentInitialize() +/obj/item/gun/ballistic/automatic/assault/ar/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) -/obj/item/gun/ballistic/automatic/assualt/swiss_cheese +/obj/item/gun/ballistic/automatic/assault/swiss_cheese name = "\improper Swiss Cheese" desc = "An ancient longarm famous for its boxy, modular design. The DMA on this unit is, sadly, broken. Uses 5.56mm ammunition for Matter mode." icon = 'icons/obj/guns/48x32guns.dmi' @@ -141,18 +134,18 @@ mag_type = /obj/item/ammo_box/magazine/swiss actions_types = list(/datum/action/item_action/toggle_firemode) -/obj/item/gun/ballistic/automatic/assualt/swiss_cheese/ComponentInitialize() +/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize() . = ..() AddComponent(/datum/component/automatic_fire, 0.65 SECONDS) -/obj/item/gun/ballistic/automatic/assualt/swiss_cheese/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/ballistic/automatic/assault/swiss_cheese/afterattack(atom/target, mob/living/user, flag, params) if(select == 2) to_chat(user, "You hear a strange sound from the DMA unit. It doesn't appear to be operational.") return else return ..() -/obj/item/gun/ballistic/automatic/assualt/swiss_cheese/burst_select() +/obj/item/gun/ballistic/automatic/assault/swiss_cheese/burst_select() var/mob/living/carbon/human/user = usr switch(select) if(1) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 20066b6a7abf..b159376b547b 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -49,7 +49,7 @@ /obj/item/gun/ballistic/automatic/sniper_rifle name = "sniper rifle" - desc = "An anti-materiel rifle chambered in .50 BMG, partnered with an effective optics package that grants it much greater range than most rifles. Its prodigious bulk requires both hands and some time to aim." + desc = "An anti-material rifle chambered in .50 BMG with a scope mounted on it. Its prodigious bulk requires both hands to use." icon_state = "sniper" item_state = "sniper" fire_sound = 'sound/weapons/gun/sniper/shot.ogg' @@ -73,7 +73,7 @@ /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate name = "syndicate sniper rifle" - desc = "A heavily modified .50 caliber anti-materiel rifle capable of accepting a suppressor. Its prodigious bulk requires both hands and some time to aim." + desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire." can_suppress = TRUE can_unsuppress = TRUE pin = /obj/item/firing_pin/implant/pindicate @@ -81,13 +81,13 @@ // Old Semi-Auto Rifle // /obj/item/gun/ballistic/automatic/surplus - name = "Surplus Rifle" - desc = "One of countless cheap, obsolete rifles found throughout the frontier, chambered in 10mm. While bulky and easily defeated by even mild armor, they are effective deterrents against wildlife and are still powerful enough to put up some fight against pirates and other boarders." + name = "surplus rifle" + desc = "One of countless cheap, obsolete rifles found throughout the Frontier. Its lack of lethality renders it mostly a deterrent. Chambered in 10mm." icon_state = "surplus" item_state = "moistnugget" weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/m10mm/rifle - fire_delay = 30 + fire_delay = 10 burst_size = 1 can_unsuppress = TRUE can_suppress = TRUE @@ -113,7 +113,7 @@ /obj/item/gun/ballistic/automatic/ebr name = "\improper M514 EBR" - desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308 Winchester. It's known for rather high stopping power and mild armor-piercing capabilities." + desc = "A reliable, high-powered battle rifle often found in the hands of Syndicate personnel and remnants, chambered in .308 Winchester. Effective against personnel and armor alike." icon = 'icons/obj/guns/48x32guns.dmi' lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi' @@ -130,7 +130,7 @@ /obj/item/gun/ballistic/automatic/gal name = "\improper CM-GAL-S" - desc = "The standard issue DMR of the CMM. Dates back to the Xenofauna War, this particular model is in a carbine configuration and as such shorter than the standard model. Chambered in .308." + desc = "The standard issue DMR of the CMM. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308." icon = 'icons/obj/guns/48x32guns.dmi' fire_sound = 'sound/weapons/gun/rifle/shot.ogg' icon_state = "gal" diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm index cb21b5d1a867..993c616f885f 100644 --- a/code/modules/projectiles/guns/ballistic/gauss.dm +++ b/code/modules/projectiles/guns/ballistic/gauss.dm @@ -1,12 +1,11 @@ /obj/item/gun/ballistic/automatic/powered/gauss name = "prototype gauss rifle" - desc = "A NT experimental rifle with an high capacity. Useful for putting down crowds. Chambered in ferromagnetic pellets." + desc = "An experimental Nanotrasen rifle with a high capacity. Useful for putting down crowds. Chambered in ferromagnetic pellets." icon_state = "gauss" item_state = "arg" slot_flags = 0 mag_type = /obj/item/ammo_box/magazine/gauss fire_sound = 'sound/weapons/gun/gauss/magrifle.ogg' - load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' can_suppress = FALSE burst_size = 1 @@ -16,69 +15,54 @@ empty_indicator = TRUE weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY - charge_sections = 4 ammo_x_offset = 2 /obj/item/gun/ballistic/automatic/powered/gauss/modelh name = "Model H" - desc = "Standard issue pistol of the Solarian confederation. Its unique ability to fire slugs instead of pellets make it effective in taking down unarmored targets, but can be useless against armored ones. This also makes it drain battery very fast, be careful. Chambered in ferromagnetic slugs." + desc = "Standard-issue pistol of the Solarian Confederation. Fires slow ferromagnetic slugs at a high energy cost, though they rend flesh with ease." mag_type = /obj/item/ammo_box/magazine/modelh - icon_state = "model-h" item_state = "model-h" fire_sound = 'sound/weapons/gun/gauss/modelh.ogg' load_sound = 'sound/weapons/gun/gauss/pistol_reload.ogg' - cell_type = /obj/item/stock_parts/cell/gun/solgov - slot_flags = ITEM_SLOT_BELT - w_class = WEIGHT_CLASS_SMALL fire_delay = 0 //pistol - mag_display = FALSE empty_indicator = FALSE - /obj/item/gun/ballistic/automatic/powered/gauss/claris name = "Claris" - desc = "A antiquated solarian rifle. Just as the founding Solarians intended. Chambered in ferromagnetic pellets." + desc = "An antiquated Solarian rifle. Chambered in ferromagnetic pellets, just as the founding Solarians intended." mag_type = /obj/item/ammo_box/magazine/internal/claris - icon = 'icons/obj/guns/48x32guns.dmi' icon_state = "claris" item_state = "claris" fire_sound = 'sound/weapons/gun/gauss/claris.ogg' load_sound = 'sound/weapons/gun/gauss/sniper_reload.ogg' - cell_type = /obj/item/stock_parts/cell/gun/solgov fire_delay = 2 - bolt_type = BOLT_TYPE_NO_BOLT internal_magazine = TRUE casing_ejector = FALSE - mag_display = FALSE empty_indicator = FALSE /obj/item/gun/ballistic/automatic/powered/gauss/gar - name = "Solar 'GAR' Assualt Rifle" - desc = "A unusally modern, for the solar confederation, assualt rifle. Fires ferromagnetic lances at alarming speeds in every sense of the word. Chambered in ferromagnetic lances." + name = "Solar 'GAR' Assault Rifle" + desc = "A Solarian assault rifle, unusually modern for its producers. Launches ferromagnetic lances at alarming speeds." mag_type = /obj/item/ammo_box/magazine/gar - icon = 'icons/obj/guns/48x32guns.dmi' icon_state = "gar" item_state = "gar" fire_sound = 'sound/weapons/gun/gauss/gar.ogg' load_sound = 'sound/weapons/gun/gauss/rifle_reload.ogg' - cell_type = /obj/item/stock_parts/cell/gun/solgov - burst_size = 2 fire_delay = 2 actions_types = list() - empty_indicator = FALSE /obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize() diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index b94e679d4783..dfe8a52cde19 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -7,12 +7,11 @@ slowdown = 1 drag_slowdown = 1.5 - // L6 SAW // /obj/item/gun/ballistic/automatic/hmg/l6_saw name = "\improper L6 SAW" - desc = "A heavy machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 490 FS' engraved on the receiver below the designation. Chambered in 7.12x82mm." + desc = "An HMG designated 'L6 SAW'. Has 'Aussec Armoury - 490 FS' engraved on the receiver below the designation. Chambered in 7.12x82mm." icon_state = "l6" item_state = "l6closedmag" base_icon_state = "l6" @@ -38,19 +37,16 @@ if(cover_open && magazine) . += "It seems like you could use an empty hand to remove the magazine." - /obj/item/gun/ballistic/automatic/hmg/l6_saw/AltClick(mob/user) cover_open = !cover_open to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") playsound(user, 'sound/weapons/gun/l6/l6_door.ogg', 60, TRUE) update_appearance() - /obj/item/gun/ballistic/automatic/hmg/l6_saw/update_overlays() . = ..() . += "l6_door_[cover_open ? "open" : "closed"]" - /obj/item/gun/ballistic/automatic/hmg/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) if(cover_open) to_chat(user, "[src]'s cover is open! Close it before firing!") @@ -75,9 +71,9 @@ return ..() -/obj/item/gun/ballistic/automatic/hmg/solar +/obj/item/gun/ballistic/automatic/hmg/solar //This thing fires a 5.56 equivalent, that's an LMG, not an HMG, get out name = "\improper Solar" - desc = "The TerraGov HMG-169, designed in 169 FS, nicknamed 'Solar.' A inscription reads: 'PROPERTY OF TERRAGOV', with 'TERRAGOV' poorly scribbled out, and replaced by 'SOLAR ARMORIES.' Chambered in 4.73×33mm caseless ammunition." + desc = "A TerraGov LMG-169 designed in 169 FS, nicknamed 'Solar.' A inscription reads: 'PROPERTY OF TERRAGOV', with 'TERRAGOV' poorly scribbled out, and replaced by 'SOLAR ARMORIES'. Chambered in 4.73×33mm caseless ammunition." icon_state = "solar" fire_sound = 'sound/weapons/gun/l6/shot.ogg' item_state = "arg" diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index ccd54cf5dfec..18030833e6cd 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -34,7 +34,7 @@ /obj/item/gun/ballistic/automatic/gyropistol name = "gyrojet pistol" - desc = "A prototype pistol designed to fire self propelled rockets." + desc = "A prototype pistol designed to fire self-propelled rockets." icon_state = "gyropistol" fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' mag_type = /obj/item/ammo_box/magazine/m75 @@ -45,7 +45,7 @@ /obj/item/gun/ballistic/rocketlauncher name = "\improper PML-9" - desc = "A reusable rocket propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel." + desc = "A reusable rocket-propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel." icon_state = "rocketlauncher" item_state = "rocketlauncher" mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher @@ -75,9 +75,7 @@ /obj/item/gun/ballistic/rocketlauncher/solgov name = "Panzerfaust XII" - desc = "The standard recoiless rifle of the Solarian Confederation. Legend goes that every couple of decades, the bureaucracy changes a small part of the rifle, then bumps up the number. Chambered in rockets." - + desc = "The standard recoiless rifle of the Solarian Confederation. Barely varies from previous models." icon = 'icons/obj/guns/48x32guns.dmi' icon_state = "panzerfaust" item_state = "panzerfaust" - diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 3b0c0742a657..d03b3992b741 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -1,6 +1,6 @@ /obj/item/gun/ballistic/automatic/pistol name = "stechkin pistol" - desc = "A small, easily concealable 10mm handgun, bearing Scarborough Arms stamps. Has a threaded barrel for suppressors." + desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. Has a threaded barrel for suppressors." icon_state = "pistol" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/m10mm @@ -36,7 +36,7 @@ /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" - desc = "A classic .45 handgun with a small magazine capacity. An engraving on the slide marks it as a product of Hunter's Pride." + desc = "A classic .45 handgun. An engraving on the slide marks it as a product of Hunter's Pride." icon_state = "m1911" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m45 @@ -63,18 +63,18 @@ bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg' /obj/item/gun/ballistic/automatic/pistol/deagle/gold - desc = "A gold plated Desert Eagle folded over a million times by superior martian gunsmiths. Uses .50 AE ammo." + desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo." icon_state = "deagleg" item_state = "deagleg" /obj/item/gun/ballistic/automatic/pistol/deagle/camo - desc = "A Deagle brand Deagle for operators operating operationally. Uses .50 AE ammo." + desc = "A Deagle-brand Deagle for operators operating operationally. Uses .50 AE ammo." //I hate this joke with a passion icon_state = "deaglecamo" item_state = "deagleg" /obj/item/gun/ballistic/automatic/pistol/APS name = "stechkin APS pistol" - desc = "A relative of the more common 10mm Stechkin, converted into a burst-fire machine pistol. Uses 9mm ammo." + desc = "A burst-fire machine pistol based on the stechkin model. Utilizes specialized 9mm magazines." icon_state = "aps" w_class = WEIGHT_CLASS_SMALL mag_type = /obj/item/ammo_box/magazine/pistolm9mm @@ -101,7 +101,7 @@ /obj/item/gun/ballistic/automatic/pistol/commander name = "\improper Commander" - desc = "A classic handgun in a tasteful black and stainless steel color scheme, with an enamel Nanotrasen logo set into the grips. Chambered in 9mm." + desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." icon_state = "commander" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm @@ -112,7 +112,7 @@ /obj/item/gun/ballistic/automatic/pistol/commander/inteq name = "\improper Commissioner" - desc = "A handgun seized from Nanotrasen armories by deserting troopers and modified to IRMG's standards, with a yellow IRMG shield set into the grips. Chambered in 9mm." + desc = "A handgun seized from Nanotrasen armories by deserting troopers and modified to IRMG's standards. A yellow IRMG shield is set into the grips. Chambered in 9mm." icon_state = "commander-inteq" item_state = "commander-inteq" @@ -121,7 +121,7 @@ /obj/item/gun/ballistic/automatic/pistol/commissar name = "\improper Commissar" - desc = "A Nanotrasen-issue handgun, modified to further enhance it's effectiveness in troop discipline." + desc = "A Nanotrasen-issue handgun, modified with a voice box to further enhance its effectiveness in troop discipline." icon_state = "commander" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/co9mm @@ -171,7 +171,7 @@ /obj/item/gun/ballistic/automatic/pistol/solgov name = "\improper Pistole C" - desc = "A favorite of the Terran Regency, but despised by the Solarian bureaucracy. Was taken out of standard service several centruries ago, and is issued in low numbers in the military. However, it is popular with civillians. Chambered in 5.56mm caseless." + desc = "A favorite of the Terran Regency that is despised by the Solarian bureaucracy. Shifted out of military service centuries ago, though still popular among civilians. Chambered in 5.56mm caseless." icon_state = "pistole-c" weapon_weight = WEAPON_LIGHT w_class = WEIGHT_CLASS_SMALL @@ -179,12 +179,11 @@ fire_sound = 'sound/weapons/gun/pistol/pistolec.ogg' /obj/item/gun/ballistic/automatic/pistol/solgov/old - desc = "A favorite of the Terran Regency, but despised by the Solarian bureaucracy. Was taken out of standard service several centruries ago, and is issued in low numbers in the military. However, it is popular with civillians. Chambered in 5.56mm caseless." icon_state = "pistole-c-old" /obj/item/gun/ballistic/automatic/pistol/tec9 - name = "\improper TEC9 machine pistol" - desc = "A somewhat cheaply-made machine pistol designed to vomit forth 9mm ammunition at a truly eye-watering rate of fire." + name = "\improper TEC-9 machine pistol" + desc = "A crude machine pistol designed to vomit 9mm ammunition at a truly eye-watering rate of fire." icon_state = "tec9" weapon_weight = WEAPON_LIGHT w_class = WEIGHT_CLASS_SMALL @@ -193,7 +192,7 @@ /obj/item/gun/ballistic/automatic/pistol/disposable name = "disposable gun" - desc = "An exceedingly flimsy plastic gun that is extremely cheap and easy to produce. You get what you pay for." + desc = "An exceedingly flimsy plastic gun that is extremely cheap to produce. You get what you pay for." icon_state = "disposable" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/disposable @@ -219,7 +218,7 @@ /obj/item/gun/ballistic/automatic/pistol/disposable/pizza name = "pizza disposable gun" - desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against itallians + desc = "How horrible. Whoever you point at with this won't be very cheesed to meet you." //this is a warcrime against italians // IF YOU'RE GOING TO DO US DIRTY SPELL IT RIGHT icon_state = "disposable_pizza" random_icon = FALSE custom_materials = list(/datum/material/pizza=2000) @@ -227,7 +226,7 @@ //not technically a pistol but whatever /obj/item/gun/ballistic/derringer name = ".38 Derringer" - desc = "A easily concealable derringer. Uses .38 ammo." + desc = "An easily concealable derringer. Uses .38 special ammo." icon_state = "derringer" mag_type = /obj/item/ammo_box/magazine/internal/derr38 fire_sound = 'sound/weapons/gun/revolver/shot.ogg' @@ -256,13 +255,13 @@ /obj/item/gun/ballistic/derringer/traitor name = "\improper .357 Syndicate Derringer" - desc = "An easily concealable derriger, if not for the bright red and black. Uses .357 ammo." + desc = "An easily concealable derriger, if not for the bright red-and-black. Uses .357 ammo." icon_state = "derringer_syndie" mag_type = /obj/item/ammo_box/magazine/internal/derr357 fire_sound_volume = 50 //Tactical stealth firing /obj/item/gun/ballistic/derringer/gold name = "\improper Golden Derringer" - desc = "The golden sheen is somewhat counterintuitive as a stealth weapon, but it looks cool. Uses .357 ammo." + desc = "The golden sheen is somewhat counter-intuitive on a holdout weapon, but it looks cool. Uses .357 ammo." icon_state = "derringer_gold" mag_type = /obj/item/ammo_box/magazine/internal/derr357 diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 83fe331f4210..b1c70e7a73b6 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -1,6 +1,6 @@ /obj/item/gun/ballistic/revolver name = "\improper .357 revolver" - desc = "A weighty magnum revolver with a Scarborough Arms logo engraved on the barrel. Uses .357 ammo." //usually used by syndicates + desc = "A weighty revolver with a Scarborough Arms logo engraved on the barrel. Uses .357 ammo." //usually used by syndicates icon_state = "revolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder fire_sound = 'sound/weapons/gun/revolver/shot.ogg' @@ -75,7 +75,7 @@ /obj/item/gun/ballistic/revolver/detective name = "\improper Colt Detective Special" - desc = "A compact and ridiculously old-fashioned law enforcement firearm. Uses .38 Special rounds." + desc = "A compact and ridiculously old-fashioned law enforcement firearm. Uses .38 special rounds." fire_sound = 'sound/weapons/gun/revolver/shot.ogg' icon_state = "detective" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 @@ -151,7 +151,7 @@ /obj/item/gun/ballistic/revolver/nagant name = "\improper Nagant revolver" - desc = "An ancient model of revolver with notoriously poor ergonomics, chambered in 7.62x38mmR. While its unique design prevents the use of speed loaders, it is the only revolver able to use a suppressor." + desc = "An ancient model of revolver with notoriously poor ergonomics, chambered in 7.62x38mmR. Uniquely able to be suppressed." icon_state = "nagant" can_suppress = TRUE @@ -160,7 +160,7 @@ /obj/item/gun/ballistic/revolver/hunting name = "hunting revolver" - desc = "A massive, long-barreled revolver designed for hunting the most dangerous game. Can only be reloaded one cartridge at a time due to its reinforced frame. Uses .45-70 ammo." + desc = "A massive, long-barreled revolver designed for the most dangerous game. Can only be reloaded one cartridge at a time due to its reinforced frame. Uses .45-70 ammo." icon_state = "hunting" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev4570 @@ -169,7 +169,7 @@ /obj/item/gun/ballistic/revolver/russian name = "\improper Russian revolver" - desc = "A revolver for particularly lethal drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull. The origin of its name remains a subject of intense debate. " + desc = "A Solarian revolver for particularly lethal drinking games. It has a mechanism requiring you to spin the chamber before each trigger pull. Uses .357 ammo." icon_state = "russianrevolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE @@ -269,11 +269,11 @@ /obj/item/gun/ballistic/revolver/srm name = "SRM Standard Issue .357 Revolver" - desc = "A sturdy, powerful, and reliable revolver. Try not to find yourself on the other end." + desc = "A sturdy, powerful, and reliable revolver utilized by the Saint-Roumain Militia." /obj/item/gun/ballistic/revolver/pepperbox name = "\improper pepperbox pistol" - desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. How did it even end up here? While fast to fire, it is extremely inaccurate. Uses .357 ammo." + desc = "An archaic precursor to revolver-type firearms, this gun was rendered completely obsolete millennia ago. While fast to fire, it is extremely inaccurate. Uses .357 ammo." icon_state = "pepperbox" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/pepperbox spread = 20 diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 8ac729535335..ac80dc47e890 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -1,6 +1,6 @@ /obj/item/gun/ballistic/rifle name = "Bolt Rifle" - desc = "Some kind of bolt action rifle. You get the feeling you shouldn't have this." + desc = "Some kind of bolt-action rifle. You get the feeling you shouldn't have this." icon_state = "hunting" item_state = "hunting" mag_type = /obj/item/ammo_box/magazine/internal/boltaction @@ -52,8 +52,8 @@ /obj/item/gun/ballistic/rifle/boltaction name = "\improper Illestren Hunting Rifle" - desc = "A point of pride for Hunter's Pride, this rifle is one of their most popular offerings. Despite its marketing, it is very rarely used for actual hunting and more often used for putting holes in people, for which it is even more popular for. Chambered in 7.62x54." - sawn_desc = "An extremely sawn-off Illestren, popularly known as an \"obrez\". There was probably a reason it wasn't made this short to begin with." + desc = "One of Hunter's Pride most successful firearms. The bolt-action is popular among colonists, pirates, snipers, and countless more. Chambered in 7.62x54." + sawn_desc = "An extremely sawn-off Illestren, generally known as an \"obrez\". There was probably a reason it wasn't made this short to begin with." w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_HEAVY icon = 'icons/obj/guns/48x32guns.dmi' @@ -82,7 +82,7 @@ /obj/item/gun/ballistic/rifle/boltaction/solgov name = "SSG-669C" - desc = "A bolt action sniper rifle used by the solarian army, beloved for its rotary design and accuracy. Chambered in 8x58mm Caseless." + desc = "A bolt-action sniper rifle used by Solarian troops. Beloved for its rotary design and accuracy. Chambered in 8x58mm Caseless." mag_type = /obj/item/ammo_box/magazine/internal/boltaction/solgov icon_state = "ssg669c" item_state = "ssg669c" @@ -91,7 +91,7 @@ /obj/item/gun/ballistic/rifle/boltaction/roumain name = "standard-issue 'Smile' rifle" - desc = "A bolt action rifle usually given to mercenary hunters of the Saint-Roumain Militia. Chambered in .300 Magnum." + desc = "A bolt-action rifle usually given to mercenary hunters of the Saint-Roumain Militia. Chambered in .300 Magnum." mag_type = /obj/item/ammo_box/magazine/internal/boltaction/smile icon_state = "roma" item_state = "roma" @@ -150,7 +150,7 @@ /obj/item/gun/ballistic/rifle/boltaction/polymer name = "polymer survivor rifle" - desc = "A bolt-action rifle chambered in .300 Blackout, manufactured out of improvised materials and showing obvious signs of years of makeshift repairs and ill-advised modifications. Use at your own risk." + desc = "A bolt-action rifle made of scrap, desperation, and luck. Likely to shatter at any moment. Chambered in .300 Blackout." icon = 'icons/obj/guns/projectile.dmi' icon_state = "crackhead_rifle" item_state = "crackhead_rifle" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index f8ddd3a31b6c..e333122e2e0a 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -40,7 +40,7 @@ /obj/item/gun/ballistic/shotgun/riot //for spawn in the armory name = "riot shotgun" - desc = "A sturdy shotgun with a longer magazine tube and a fixed wooden stock designed for non-lethal riot control." + desc = "A sturdy shotgun with a six-shell tube and a fixed wooden stock designed for non-lethal riot control." icon_state = "riotshotgun" item_state = "shotgun" mag_type = /obj/item/ammo_box/magazine/internal/shot/riot @@ -55,7 +55,7 @@ /obj/item/gun/ballistic/shotgun/automatic/combat name = "combat shotgun" - desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." + desc = "A semi-automatic shotgun with tactical furniture and six-shell capacity underneath." icon_state = "cshotgun" item_state = "shotgun_combat" fire_delay = 5 @@ -64,7 +64,7 @@ /obj/item/gun/ballistic/shotgun/automatic/combat/compact name = "compact combat shotgun" - desc = "A compact version of the semi automatic combat shotgun. For close encounters." + desc = "A compact version of the semi-automatic combat shotgun. For close encounters." icon_state = "cshotgunc" mag_type = /obj/item/ammo_box/magazine/internal/shot/com/compact w_class = WEIGHT_CLASS_BULKY @@ -175,7 +175,7 @@ /obj/item/gun/ballistic/shotgun/doublebarrel name = "double-barreled shotgun" - desc = "A true classic." + desc = "A true classic. Both barrels can be fired in quick succession." icon_state = "dshotgun" item_state = "shotgun_db" w_class = WEIGHT_CLASS_BULKY diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm index 11db569a5181..e617173c932e 100644 --- a/code/modules/projectiles/guns/ballistic/smg.dm +++ b/code/modules/projectiles/guns/ballistic/smg.dm @@ -4,7 +4,7 @@ /obj/item/gun/ballistic/automatic/smg/proto name = "\improper Nanotrasen Saber SMG" - desc = "A prototype full auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock." + desc = "A prototype full-auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock." icon_state = "saber" actions_types = list() mag_type = /obj/item/ammo_box/magazine/smgm9mm @@ -48,7 +48,6 @@ name = "\improper Cobra 20" desc = "An older model of SMG manufactured by Scarborough Arms, a predecessor to the military C-20 series. Chambered in .45. " can_bayonet = FALSE - icon_state = "cobra20" item_state = "cobra20" @@ -71,7 +70,7 @@ /obj/item/gun/ballistic/automatic/smg/wt550 name = "\improper WT-550 Automatic Rifle" - desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle." + desc = "An outdated PDW, used centuries ago by Nanotrasen security elements. Uses 4.6x30mm rounds." icon_state = "wt550" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/wt550m9 @@ -106,10 +105,10 @@ /obj/item/gun/ballistic/automatic/smg/vector name = "\improper Vector carbine" - desc = "A police carbine based off of an SMG design, with most of the complex workings removed for reliability. Chambered in 9mm." + desc = "A police carbine based on a pre-Night of Fire SMG design. Most of the complex workings have been removed for reliability. Chambered in 9mm." icon_state = "vector" item_state = "vector" - mag_type = /obj/item/ammo_box/magazine/smgm9mm/rubbershot //you guys remember when the autorifle was chambered in 9mm + mag_type = /obj/item/ammo_box/magazine/smgm9mm/rubber //you guys remember when the autorifle was chambered in 9mm bolt_type = BOLT_TYPE_LOCKING mag_display = TRUE weapon_weight = WEAPON_LIGHT @@ -229,7 +228,7 @@ /obj/item/gun/ballistic/automatic/smg/aks74u name = "\improper AKS-74U" - desc = "A pre-FTL era carbine, the \"curio\" status of the weapon and its extreme fire rate make it perfect for bandits, pirates and colonists on a budget." + desc = "A pre-FTL era carbine, known to be incredibly cheap. Its extreme fire rate make it perfect for bandits, pirates and colonists on a budget." fire_sound = 'sound/weapons/gun/rifle/shot.ogg' icon_state = "aks74u" lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm index 3a25619ba9a8..d057213f92e7 100644 --- a/code/modules/projectiles/projectile/bullets/gauss.dm +++ b/code/modules/projectiles/projectile/bullets/gauss.dm @@ -1,3 +1,5 @@ +// Ferromagnetic Pellet (Prototype Gauss Rifle & Claris) + /obj/projectile/bullet/gauss name = "ferromagnetic pellet" icon_state = "gauss-pellet" @@ -7,16 +9,17 @@ light_color = COLOR_SOFT_RED light_range = 3 +// Ferromagnetic Lance (GAR AR) + /obj/projectile/bullet/gauss/lance name = "ferromagnetic lance" icon_state = "redtrac" damage = 30 - armour_penetration = 40 - speed = 0.4 + +// Ferromagnetic Slug (Model H) /obj/projectile/bullet/gauss/slug name = "ferromagnetic slug" icon_state = "gauss-slug" damage = 50 speed = 0.8 - armour_penetration = 40 diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index 327113038a0c..ed9469cb668a 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -54,18 +54,18 @@ damage = 20 armour_penetration = 20 -// 7.12x82mm (SAW) +// 7.12x82mm (L6 SAW) /obj/projectile/bullet/mm712x82 name = "7.12x82mm bullet" damage = 25 armour_penetration = 40 -/obj/projectile/bullet/mm712x82_ap +/obj/projectile/bullet/mm712x82/ap name = "7.12x82mm armor-piercing bullet" armour_penetration = 75 -/obj/projectile/bullet/mm712x82_hp +/obj/projectile/bullet/mm712x82/hp name = "7.12x82mm hollow point bullet" damage = 45 armour_penetration = -20 @@ -76,12 +76,11 @@ armour_penetration = 40 fire_stacks = 3 -/obj/projectile/bullet/mm712x82_match +/obj/projectile/bullet/mm712x82/match name = "7.12x82mm match bullet" - damage = 25 - armour_penetration = 40 + speed = 0.3 + armour_penetration = 50 ricochets_max = 2 ricochet_chance = 60 ricochet_auto_aim_range = 4 ricochet_incidence_leeway = 35 - diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 5fabb11b9420..6a1323e481dc 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -5,17 +5,16 @@ damage = 20 armour_penetration = -20 -/obj/projectile/bullet/c9mm_surplus +/obj/projectile/bullet/c9mm/surplus name = "9mm surplus bullet" damage = 15 - armour_penetration = -20 -/obj/projectile/bullet/c9mm_ap +/obj/projectile/bullet/c9mm/ap name = "9mm armor-piercing bullet" damage = 15 armour_penetration = 20 -/obj/projectile/bullet/c9mm_hp +/obj/projectile/bullet/c9mm/hp name = "9mm hollow point bullet" damage = 40 armour_penetration = -50 @@ -26,30 +25,29 @@ armour_penetration = -20 fire_stacks = 2 -/obj/projectile/bullet/c9mm/rubbershot +/obj/projectile/bullet/c9mm/rubber name = "9mm rubber bullet" damage = 5 - armour_penetration = -50 - stamina = 20 + armour_penetration = -40 + stamina = 30 -// 10mm (Stechkin) +// 10mm (Stechkin & SkM-44(k)) /obj/projectile/bullet/c10mm name = "10mm bullet" damage = 25 armour_penetration = -20 -/obj/projectile/bullet/c10mm_surplus +/obj/projectile/bullet/c10mm/surplus name = "10mm surplus bullet" damage = 20 - armour_penetration = -20 -/obj/projectile/bullet/c10mm_ap +/obj/projectile/bullet/c10mm/ap name = "10mm armor-piercing bullet" damage = 20 armour_penetration = 20 -/obj/projectile/bullet/c10mm_hp +/obj/projectile/bullet/c10mm/hp name = "10mm hollow point bullet" damage = 45 armour_penetration = -50 @@ -60,30 +58,29 @@ armour_penetration = -20 fire_stacks = 2 -/obj/projectile/bullet/c10mm/rubbershot +/obj/projectile/bullet/c10mm/rubber name = "10mm rubber bullet" - damage = 5 - stamina = 20 - armour_penetration = -20 + damage = 7 + stamina = 38 + armour_penetration = -40 -// .45 (M1911, C20r) +// .45 (M1911, C20r, Thompson) /obj/projectile/bullet/c45 name = ".45 bullet" damage = 25 armour_penetration = -20 -/obj/projectile/bullet/c45_surplus +/obj/projectile/bullet/c45/surplus name = ".45 surplus bullet" damage = 20 - armour_penetration = -20 -/obj/projectile/bullet/c45_ap +/obj/projectile/bullet/c45/ap name = ".45 armor-piercing bullet" damage = 20 armour_penetration = 20 -/obj/projectile/bullet/c45_hp +/obj/projectile/bullet/c45/hp name = ".45 hollow point bullet" damage = 45 armour_penetration = -50 @@ -94,8 +91,8 @@ fire_stacks = 2 armour_penetration = -20 -/obj/projectile/bullet/c45/rubbershot +/obj/projectile/bullet/c45/rubber name = ".45 rubber bullet" - damage = 5 - stamina = 20 - armour_penetration = -20 + damage = 7 + stamina = 38 + armour_penetration = -40 diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 3c204157f8a3..dcf8bb682387 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -5,7 +5,7 @@ damage = 30 armour_penetration = -20 -// .50AE (Desert Eagle) +// .50 AE (Desert Eagle) /obj/projectile/bullet/a50AE name = ".50 AE bullet" @@ -16,12 +16,12 @@ damage = 60 armour_penetration = -50 -// .38 (Detective's Gun & Winchester) +// .38 (Colt Detective Special & Winchester) /obj/projectile/bullet/c38 - name = ".38 bullet" - damage = 20 - armour_penetration = -20 + name = ".38 special bullet" + damage = 25 + armour_penetration = -30 ricochets_max = 2 ricochet_chance = 50 ricochet_auto_aim_angle = 10 @@ -29,6 +29,8 @@ /obj/projectile/bullet/c38/match name = ".38 match bullet" + speed = 0.3 + armour_penetration = -10 ricochets_max = 4 ricochet_chance = 100 ricochet_auto_aim_angle = 40 @@ -37,10 +39,12 @@ ricochet_decay_chance = 1 ricochet_decay_damage = 1 -/obj/projectile/bullet/c38/match/bouncy +/obj/projectile/bullet/c38/match/bouncy // I don't know why this is a subtype of match name = ".38 rubber bullet" - damage = 10 - stamina = 30 + speed = 0.4 + damage = 7 + stamina = 38 + armour_penetration = -60 ricochets_max = 6 ricochet_incidence_leeway = 70 ricochet_chance = 130 @@ -49,7 +53,7 @@ /obj/projectile/bullet/c38/dumdum name = ".38 dum-dum bullet" - damage = 15 + damage = 20 armour_penetration = -50 ricochets_max = 0 shrapnel_type = /obj/item/shrapnel/bullet/c38/dumdum @@ -74,19 +78,17 @@ /obj/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail name = ".38 hot shot bullet" - damage = 20 ricochets_max = 0 /obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target - M.adjust_fire_stacks(6) + M.adjust_fire_stacks(3) M.IgniteMob() /obj/projectile/bullet/c38/iceblox //see /obj/projectile/temp for the original code name = ".38 iceblox bullet" - damage = 20 var/temperature = 100 ricochets_max = 0 @@ -96,7 +98,7 @@ var/mob/living/M = target M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature)) -// .357 (Syndie Revolver) +// .357 (Syndicate Revolver) /obj/projectile/bullet/a357 name = ".357 bullet" @@ -105,6 +107,8 @@ // admin only really, for ocelot memes /obj/projectile/bullet/a357/match name = ".357 match bullet" + speed = 0.3 + armour_penetration = 10 ricochets_max = 5 ricochet_chance = 140 ricochet_auto_aim_angle = 50 @@ -126,6 +130,8 @@ /obj/projectile/bullet/a4570/match name = ".45-70 match bullet" + speed = 0.3 + armour_penetration = 10 ricochets_max = 5 ricochet_chance = 140 ricochet_auto_aim_angle = 50 diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 5143e66ef23a..a69ef88b4f68 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -1,23 +1,29 @@ -// 5.56mm (M-90gl Carbine) +// 5.56mm (M-90gl Carbine & P-16) -/obj/projectile/bullet/a556 +/obj/projectile/bullet/a556_45 name = "5.56x45mm bullet" damage = 25 armour_penetration = 20 // 7.62x54mmR (Illestren Rifle) -/obj/projectile/bullet/a762 +/obj/projectile/bullet/a762_54 name = "7.62x54mmR bullet" + speed = 0.3 damage = 30 armour_penetration = 40 +// .300 Magnum (Smile Rifle) + /obj/projectile/bullet/a300 name = ".300 Magnum bullet" + speed = 0.3 damage = 40 stamina = 10 armour_penetration = 40 +// Bloat evil wizard stupid shit + /obj/projectile/bullet/a762_enchanted name = "enchanted 7.62x54mmR bullet" damage = 20 @@ -30,24 +36,25 @@ damage = 25 armour_penetration = 20 -//.300 BLK (Survivor Rifle) +//.300 BLK (Polymer Survivor Rifle) /obj/projectile/bullet/aac_300blk name = ".300 Blackout bullet" damage = 30 armour_penetration = 20 -//7.62x39mm (SVG-67) +//7.62x39mm (SVG-67 & SkM-24) /obj/projectile/bullet/a762_39 name = "7.62x39mm" damage = 30 armour_penetration = 20 -//.308 WIN (M514) +//.308 WIN (M514 & GAL DMRs) /obj/projectile/bullet/win308 name = ".308 Winchester" + speed = 0.3 damage = 30 armour_penetration = 40 @@ -55,5 +62,6 @@ /obj/projectile/bullet/a858 name = "8x58mm caseless bullet" + speed = 0.3 damage = 30 armour_penetration = 40 diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index c3f9049e3a64..0f2d43206fc8 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -1,28 +1,27 @@ -/obj/projectile/bullet/shotgun_slug +/obj/projectile/bullet/slug name = "12g shotgun slug" - damage = 60 - armour_penetration = -10 + damage = 40 + speed = 0.5 -/obj/projectile/bullet/shotgun_beanbag +/obj/projectile/bullet/slug/beanbag name = "beanbag slug" - damage = 5 - stamina = 45 - armour_penetration = -10 + damage = 10 + stamina = 60 + armour_penetration = -20 /obj/projectile/bullet/incendiary/shotgun name = "incendiary slug" damage = 20 - armour_penetration = -10 + speed = 0.5 /obj/projectile/bullet/incendiary/shotgun/dragonsbreath name = "dragonsbreath pellet" damage = 5 armour_penetration = -35 -/obj/projectile/bullet/shotgun_stunslug +/obj/projectile/bullet/slug/stun name = "stunslug" damage = 5 - armour_penetration = -10 paralyze = 100 stutter = 5 jitter = 20 @@ -30,63 +29,64 @@ icon_state = "spark" color = "#FFFF00" -/obj/projectile/bullet/shotgun_meteorslug +/obj/projectile/bullet/slug/meteor name = "meteorslug" icon = 'icons/obj/meteor.dmi' icon_state = "dust" - damage = 40 - armour_penetration = -10 + damage = 30 paralyze = 15 knockdown = 80 hitsound = 'sound/effects/meteorimpact.ogg' -/obj/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/slug/meteor/on_hit(atom/target, blocked = FALSE) . = ..() if(ismovable(target)) var/atom/movable/M = target var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src))) M.safe_throw_at(throw_target, 3, 2) -/obj/projectile/bullet/shotgun_meteorslug/Initialize() +/obj/projectile/bullet/slug/meteor/Initialize() . = ..() SpinAnimation() -/obj/projectile/bullet/shotgun_frag12 - name ="frag12 slug" - damage = 35 - armour_penetration = -10 +/obj/projectile/bullet/slug/frag12 + name = "frag12 slug" + damage = 25 paralyze = 50 -/obj/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/slug/frag12/on_hit(atom/target, blocked = FALSE) ..() explosion(target, -1, 0, 1) return BULLET_ACT_HIT /obj/projectile/bullet/pellet ///How much damage is subtracted per tile? - var/tile_dropoff = 1 + var/tile_dropoff = 1 //Standard of 10% per tile ///How much stamina damage is subtracted per tile? - var/tile_dropoff_stamina = 0.8 + var/tile_dropoff_stamina = 1.5 //As above armour_penetration = -35 + speed = 0.5 -/obj/projectile/bullet/pellet/shotgun_buckshot +/obj/projectile/bullet/pellet/buckshot name = "buckshot pellet" damage = 10 - -/obj/projectile/bullet/pellet/shotgun_rubbershot +/obj/projectile/bullet/pellet/rubbershot name = "rubbershot pellet" - damage = 2 - stamina = 8 - tile_dropoff = 0.2 // Keep it at 10% per tile + damage = 2.5 + tile_dropoff = 0.15 + stamina = 15 + armour_penetration = -70 -/obj/projectile/bullet/pellet/shotgun_incapacitate +/obj/projectile/bullet/pellet/rubbershot/incapacitate name = "incapacitating pellet" damage = 1 + tile_dropoff = 0.1 stamina = 6 + tile_dropoff_stamina = 0.6 -/obj/projectile/bullet/pellet/Range() +/obj/projectile/bullet/pellet/Range() //10% loss per tile = max range of 10, generally ..() if(damage > 0) damage -= tile_dropoff @@ -95,17 +95,9 @@ if(damage < 0 && stamina < 0) qdel(src) -/obj/projectile/bullet/pellet/shotgun_improvised - tile_dropoff = 0.45 //Come on it does 4.5 damage don't be like that. //WS Edit - Shotgun nerf +/obj/projectile/bullet/pellet/improvised damage = 6 - -/obj/projectile/bullet/pellet/shotgun_improvised/Initialize() - . = ..() - range = rand(1, 8) - -/obj/projectile/bullet/pellet/shotgun_improvised/on_range() - do_sparks(1, TRUE, src) - ..() + tile_dropoff = 0.6 // Mech Scattershot @@ -113,8 +105,8 @@ damage = 24 armour_penetration = -20 -/obj/projectile/bullet/pellet/shotgun_buckshot/twobore +/obj/projectile/bullet/pellet/buckshot/twobore name = "two-bore pellet" damage = 30 armour_penetration = -25 - tile_dropoff = 5 + tile_dropoff = 3 diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 0cf2225e3872..fb5e2a53ce65 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -1,10 +1,10 @@ -// 4.6x30mm (Autorifles) +// 4.6x30mm (WT-550 Automatic Rifle & NT-SVG) /obj/projectile/bullet/c46x30mm name = "4.6x30mm bullet" damage = 20 -/obj/projectile/bullet/c46x30mm_ap +/obj/projectile/bullet/c46x30mm/ap name = "4.6x30mm armor-piercing bullet" damage = 15 armour_penetration = 40 @@ -14,30 +14,35 @@ damage = 10 fire_stacks = 1 +// 4.73x33mm caseless (Solar) + /obj/projectile/bullet/c47x33mm name = "4.73x33mm bullet" damage = 25 armour_penetration = 20 +// 5.56 HITP caseless (Solare C) + /obj/projectile/bullet/c556mm name = "5.56mm HITP bullet" damage = 20 -/obj/projectile/bullet/c556mm_surplus +/obj/projectile/bullet/c556mm/surplus name = "5.56mm HITP surplus bullet" damage = 15 -/obj/projectile/bullet/c556mm_ap +/obj/projectile/bullet/c556mm/ap name = "5.56mm HITP AP bullet" damage = 15 armour_penetration = 40 -/obj/projectile/bullet/c556mm_hp - name = "5.56mm HITP hollow-point bullet" +/obj/projectile/bullet/c556mm/hp + name = "5.56mm HITP hollow point bullet" damage = 30 armour_penetration = -50 -/obj/projectile/bullet/c556mm/rubbershot +/obj/projectile/bullet/c556mm/rubber name = "5.56mm HITP rubber bullet" damage = 5 - stamina = 20 + stamina = 30 + armour_penetration = -20 diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 9dc8bfb5d4d7..1f725b8113f2 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -1,10 +1,10 @@ -// .50 (Sniper) +// .50 BMG (Sniper) /obj/projectile/bullet/p50 - name =".50 bullet" - speed = 0.4 + name = ".50 BMG bullet" + speed = 0.3 damage = 70 - paralyze = 100 + knockdown = 100 dismemberment = 50 armour_penetration = 60 var/breakthings = TRUE @@ -16,11 +16,11 @@ return ..() /obj/projectile/bullet/p50/soporific - name =".50 soporific bullet" + name = ".50 BMG soporific bullet" armour_penetration = 0 damage = 0 dismemberment = 0 - paralyze = 0 + knockdown = 0 breakthings = FALSE /obj/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) @@ -30,17 +30,16 @@ return ..() /obj/projectile/bullet/p50/penetrator - name = "penetrator round" + name = ".50 BMG penetrator round" icon_state = "gauss" damage = 60 projectile_piercing = PASSMOB projectile_phasing = (ALL & (~PASSMOB)) dismemberment = 0 //It goes through you cleanly. - paralyze = 0 + knockdown = 0 breakthings = FALSE /obj/projectile/bullet/p50/penetrator/shuttle //Nukeop Shuttle Variety icon_state = "gaussstrong" damage = 25 - speed = 0.3 range = 16 diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1b5ccd05a63a..4d28452521af 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -265,7 +265,7 @@ desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ap" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtap + build_path = /obj/item/ammo_box/magazine/wt550m9/ap departmental_flags = DEPARTMENTAL_FLAG_SECURITY /datum/design/mag_oldsmg/ic_mag @@ -273,7 +273,7 @@ desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" id = "mag_oldsmg_ic" materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/glass = 1000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtic + build_path = /obj/item/ammo_box/magazine/wt550m9/inc departmental_flags = DEPARTMENTAL_FLAG_SECURITY //WS edit - free lethals diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index 6cf283f8f49b..ee40b2782574 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/ballistic/shotgun/doublebarrel, /obj/item/gun/ballistic/shotgun, /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/automatic/assualt/ar, + /obj/item/gun/ballistic/automatic/assault/ar, /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/rifle/boltaction, /obj/item/pneumatic_cannon/speargun, diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index c5050d08c0b7..6eea344afde0 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -767,7 +767,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "10mm Incendiary Magazine" desc = "An additional 8-round 10mm magazine; compatible with the Stechkin Pistol. \ Loaded with incendiary rounds which inflict little damage, but ignite the target." - item = /obj/item/ammo_box/magazine/m10mm/fire + item = /obj/item/ammo_box/magazine/m10mm/inc cost = 2 exclude_modes = list(/datum/game_mode/nuclear/clown_ops) @@ -889,8 +889,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 9 /datum/uplink_item/ammo/machinegun/hollow - name = "7.12x82mm (Hollow-Point) Box Magazine" - desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \ + name = "7.12x82mm (hollow point) Box Magazine" + desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; equipped with hollow point tips to help \ with the unarmored masses of crew." item = /obj/item/ammo_box/magazine/mm712x82/hollow @@ -898,7 +898,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "7.12x82mm (Incendiary) Box Magazine" desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L6 SAW; tipped with a special flammable \ mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." - item = /obj/item/ammo_box/magazine/mm712x82/incen + item = /obj/item/ammo_box/magazine/mm712x82/inc /datum/uplink_item/ammo/machinegun/match name = "7.12x82mm (Match) Box Magazine" diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index f4456cc740e5..d2fb11bfef4b 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -17,7 +17,7 @@ /obj/item/gun/ballistic/shotgun/automatic/combat = 2, /obj/item/gun/ballistic/automatic/gyropistol = 1, /obj/item/gun/ballistic/shotgun = 2, - /obj/item/gun/ballistic/automatic/assualt/ar = 2) + /obj/item/gun/ballistic/automatic/assault/ar = 2) premium = list( /obj/item/ammo_box/magazine/smgm9mm = 2, /obj/item/ammo_box/magazine/m50 = 4, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index c1dfa757d6ee..1e9a3460f064 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -161,7 +161,7 @@ ) voucher_items = list( - "NT-AK" = /obj/item/gun/ballistic/automatic/assualt/ak47/nt) //if im being honest, theres no point in addiing other options when this is clearly the best + "NT-AK" = /obj/item/gun/ballistic/automatic/assault/ak47/nt) //if im being honest, theres no point in addiing other options when this is clearly the best /obj/item/gun_voucher name = "security weapon voucher" diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index bf11a268fa8eaf303fc65bd132924e0f7a1ab0f2..96528874fee3c6db2521b98011d955c78f80cec7 100644 GIT binary patch delta 1315 zcmV+;1>E|I;{l4}0gzCC2-tKB)Tg}!w5`ZOMJbT%ZL+_94-#c3+bkdVmH>|&&Nnj@ zIp)Xcx6faSuhH#&vG}X(hq`N{n<%>$i>sgY{&ajPr9RGd`CKQwuOevUAP*E_ap!R}){ccYtBMb`$iv$Y; zivbG&Q=dr>bk9`0BoLa(zo<+B|1t%n$`nvNQy_qu0=bYWkXA~V5iUr1L|}n516dmUD@ty)4zbdnuw995G_VJK#FkyP+|mu5F;3%Ln2sOOdQt2 z@d0YMAwUm@0!17epovnswRgql8xiIb#_GHp6d=*7aX_bkS3D3aT@shm<>AyG>$W2B zPKrMBA3jDbK6d`_OlV&N!6sJvw?{|%w`E8AKL-<;_&?-*!Y`E4kQtpS)k|40!7bkz#9Cj z&ZuA483nic{5ciY9?70EvmjMx790@IEa)3J7W7&j%02Uf*GgDZK`b`bcG&hNBm|p~ z7;HjbDCO9Zbc3ShvgaNv!;Ajl9dxG z`K;ip?$CtK3T|_A2r!A~WXFDcS8TqKBDJxi2YDFcpuZ2( zv7_+Fflg7!PRt_*`b6Cd{aQ0}pf}c$+tFEn!0-28@GW&70E+v~fKUsd(BBLQwGe6` zaDIO)=|`p?$Pv|nUuC@si`Mri>}qNgQVpl2#tpeHX{pyxAMfGyXS`}$<9sYuu^VRA5j#rsu% zKfFAZJz0kXfm$=_*MCO+5uH(gj?AdPV=6zXi{rF4O#|a{!IIX@E1bN@IOBf0CB4*^ zwIf^B+iY2*v}Ik_mbGwO)(>uVEe3I^G|m5M z?~eoNVGHG5m5`S^6Gt|r8TBvIq2Nk?KcoJ1m{Ih+DG}DjD@>BgA4z`|%nQXN`+@Hv zU6BMfsXz}EhM)B?pe=F&$qO`x`hBlVLyV6YFg<~wh-{+JNy~xccH>ZBzA=40#KSxL z%dbeXfSCnvG%C}_O#42j;*X@?{X|yV?m6C;rrm-iOnAscsmZ`;_alTKn$x=#tN9px Z{(2kT-WQ910Q`zOl}4H2J+oT{FKk))g4O^4 delta 1315 zcmV+;1>E|I;{l4}0gzCC7}#_R)Tg}!w5`ZOMahutZL+_94-#cN+bkdVmH>|&&NnkO zIpW9Yx6fZzU!(iS)$FgL>#Mej?xO5g%x->GyW>8(i&8ne*%wv0KMw!&M{_KqyXZrz z^dG<9$Ku26W>+W7 z#|Nn4h5$Vr3KVf@fF?@i);_G(--s}mFjnVkP=G{NwKDPewjA&N@!A4g4w?{|%w`E8Ae-1`6@&5oi(tnt9B=#u59wpc#>=5>c z2Z(}xXS6>pHJb+rVstK1dK;ZfmfS|?el?8FWvu*87@f;FgIo$ZP$Nd?l4PFIxg@uC ze}b^5znfVqx(Nj->98-&{vxkFZ17AHO?oz3Zxf=i1*~av+J&!~#7h7ASgV1J>YI zbwd5RPAIt5=P#+S_DDpSSRlfg1-$^rf=;YML4(wx+%YeBtAsTr#A0J@i*2t%BCrk# z!8#-c>wqAv1ER1F2*Vna%Mj6)A)+lqL?ivjGs{II?aGP89g1q(M7{gS5ElDm;Z!I61F`K&3Q6&z|E zD*3D=)kiepvw}O_6aq}*IoaXgKCIT?NI_oG@M1C0{`$Ru!Kb`448GKz;UEt~9Q1c% zT6Q2FIM6R@*|~Y(K)0w}pl>z<2RdXexg(u_1^oW_1>aSt0id|w3<$LV3jNK1Pz#|3 z0_XQPlzwFTiJVj&2v#tm{(L$XTV#FYp8Up(O^0S2IpB^X{oedp9hTOj)ITISTIR@s zWjd0)(9qx)L}@{OXp|PvBzjamM|0LprJr zYf3h(!`ZNQX~TN24Qu2!tSj8;T!J!ebS}Z8utw*Se3-R~EPHF}+M9F#>ectw)b;;q z@(%;)VGHG5nUME8BS$u*3H2}2q2L35?}Yl(VM5U(r$ksAFEB|ee<1x;FfA05>@(j} zx*!Q`Qh}Z;^gpYR??Z%_D2Zc*Qa+CSMxFY Z{PjM%e_YM}0nMj9%HlgmX|r1eFKixtfRq3L From b86fa2ee5f3cf8d1ab3603816fa3e2e83ee949b7 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 16 Sep 2023 21:33:38 -0500 Subject: [PATCH 46/57] Automatic changelog generation for PR #2354 [ci skip] --- html/changelogs/AutoChangeLog-pr-2354.yml | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2354.yml diff --git a/html/changelogs/AutoChangeLog-pr-2354.yml b/html/changelogs/AutoChangeLog-pr-2354.yml new file mode 100644 index 000000000000..e4e8db557286 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2354.yml @@ -0,0 +1,26 @@ +author: Skrem7 +delete-after: true +changes: + - tweak: The NT 'Boarder' ARG now loads standard P-16 magazines, rather than the + M-90gl toploaders. + - balance: Standardizes pellet projectiles to lose 10% damage of both types per + tile across the board. Improvised pellets no longer have a hardcapped 1-8 tile + range. + - balance: Less-lethal rounds now do 50% more stamina than the force of their lethal + counterparts, with 25% the normal force and double the negative AP. If the round + had positive or zero AP, it was subtracted by 20. + - balance: Shotgun slugs do 40 damage, down from 60, but have zero AP, rather than + -10. FRAG-12 and meteor slugs have had their damage adjusted to reflect their + relative force. + - balance: Surplus rifle fire_delay has been cut to 1 second from 3. + - balance: Any DMR, match, or sniper round now travels slightly faster than other + bullets. Shotgun slugs and pellets now travel slightly slower than other bullets. + - balance: Match rounds have had their AP slightly increased. + - bugfix: Fixed WT-550 magazines not displaying properly. + - spellcheck: Went over (almost) every single ballistic description, including the + guns themselves, magazines, ballistic casings, and speed loaders/stripper clips + to not only have better consistency and readability, but also be more clear + on the general effectiveness of each caliber. + - spellcheck: Assualt is gone. + - code_imp: Repaths/renames most ballistic ammo pathing to maintain consistency + or take advantage of inherits, when possible. From e6fb67fe20b4c142df87c69cd3af74d63476cfdd Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 18 Sep 2023 00:45:57 +0000 Subject: [PATCH 47/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2354.yml | 26 ----------------------- html/changelogs/archive/2023-09.yml | 25 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 26 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2354.yml diff --git a/html/changelogs/AutoChangeLog-pr-2354.yml b/html/changelogs/AutoChangeLog-pr-2354.yml deleted file mode 100644 index e4e8db557286..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2354.yml +++ /dev/null @@ -1,26 +0,0 @@ -author: Skrem7 -delete-after: true -changes: - - tweak: The NT 'Boarder' ARG now loads standard P-16 magazines, rather than the - M-90gl toploaders. - - balance: Standardizes pellet projectiles to lose 10% damage of both types per - tile across the board. Improvised pellets no longer have a hardcapped 1-8 tile - range. - - balance: Less-lethal rounds now do 50% more stamina than the force of their lethal - counterparts, with 25% the normal force and double the negative AP. If the round - had positive or zero AP, it was subtracted by 20. - - balance: Shotgun slugs do 40 damage, down from 60, but have zero AP, rather than - -10. FRAG-12 and meteor slugs have had their damage adjusted to reflect their - relative force. - - balance: Surplus rifle fire_delay has been cut to 1 second from 3. - - balance: Any DMR, match, or sniper round now travels slightly faster than other - bullets. Shotgun slugs and pellets now travel slightly slower than other bullets. - - balance: Match rounds have had their AP slightly increased. - - bugfix: Fixed WT-550 magazines not displaying properly. - - spellcheck: Went over (almost) every single ballistic description, including the - guns themselves, magazines, ballistic casings, and speed loaders/stripper clips - to not only have better consistency and readability, but also be more clear - on the general effectiveness of each caliber. - - spellcheck: Assualt is gone. - - code_imp: Repaths/renames most ballistic ammo pathing to maintain consistency - or take advantage of inherits, when possible. diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index 3cd99190c981..d281e2a39f3f 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -92,3 +92,28 @@ Pickle-Coding: - bugfix: Allows the supermatter crystal to produce gases while powered, even in absolutely empty turfs, excluding space turfs. +2023-09-18: + Skrem7: + - tweak: The NT 'Boarder' ARG now loads standard P-16 magazines, rather than the + M-90gl toploaders. + - balance: Standardizes pellet projectiles to lose 10% damage of both types per + tile across the board. Improvised pellets no longer have a hardcapped 1-8 tile + range. + - balance: Less-lethal rounds now do 50% more stamina than the force of their lethal + counterparts, with 25% the normal force and double the negative AP. If the round + had positive or zero AP, it was subtracted by 20. + - balance: Shotgun slugs do 40 damage, down from 60, but have zero AP, rather than + -10. FRAG-12 and meteor slugs have had their damage adjusted to reflect their + relative force. + - balance: Surplus rifle fire_delay has been cut to 1 second from 3. + - balance: Any DMR, match, or sniper round now travels slightly faster than other + bullets. Shotgun slugs and pellets now travel slightly slower than other bullets. + - balance: Match rounds have had their AP slightly increased. + - bugfix: Fixed WT-550 magazines not displaying properly. + - spellcheck: Went over (almost) every single ballistic description, including the + guns themselves, magazines, ballistic casings, and speed loaders/stripper clips + to not only have better consistency and readability, but also be more clear + on the general effectiveness of each caliber. + - spellcheck: Assualt is gone. + - code_imp: Repaths/renames most ballistic ammo pathing to maintain consistency + or take advantage of inherits, when possible. From f01a2b8a44bdd2990db4d160f844d48688833b87 Mon Sep 17 00:00:00 2001 From: Mark Suckerberg Date: Mon, 18 Sep 2023 20:25:27 -0500 Subject: [PATCH 48/57] Fixes qdel in new error (#2360) ## About The Pull Request Fixes that one spurious fail by making sure non-initialised bottles don't smash ## Why It's Good For The Game Yes ## Changelog :cl: /:cl: --- code/modules/food_and_drinks/drinks/drinks/bottle.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 65c3ac05dd5b..77de6fddcad7 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -35,6 +35,8 @@ custom_price = 55 /obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE) + if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc + return //Creates a shattering noise and replaces the bottle with a broken_bottle if(bartender_check(target) && ranged) return From 4f5845a23f3d4124a3d3331d92f0f6202475b649 Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:16:09 -0400 Subject: [PATCH 49/57] Adds new foodtype, GORE, split from GROSS. Shuffles species food preferences. (#2359) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ports: - https://github.com/BeeStation/BeeStation-Hornet/pull/9004 (Cool person made this pr 😎) ## About The Pull Request Very shrimple 🦐 PR.(contains no shrimp) Adds a new foodtype `GORE`, split from the `GROSS` foodtype. A newfood PR thats rather simple, but also important to prepare for future changes. The tag is meant to represent things that "are visibly from a corpse or an organ", while the `GROSS` tag now represents "things which are rotten or otherwise inedible". This will be mostly effect lizards. They were meant to like gross, meaty things like some of the raw meats, but it doesnt make sense for this also to encompass gross things like Burgers with baseballs as a primary ingredient, While this will lessen the food lizards will enjoy, it will also widen the food Kepori and Arachnids enjoy. Both are similarly carnivorous, so for consistency's sake, why not? Additionally, I took a bit to generally clean up Shiptests species food preferences, adding missing disliked or liked food where I thought it was appropriate. I included comments with most of my changes that should relay my general ideas about what makes sense and what doesn't. I do, of course, invite challenges to any of the liked or disliked foods I've altered that you think could be better. ## Why It's Good For The Game Lizards are the main target of this, but it should improve the food gameplay of other species as well. Specifically should open up more food for Kepori and Arachnids. Lizards and other species being memes for being able to eat half of all unique food because they like raw and gross is really dumb. If you chew on inedible food, mr lizard, you will regret it. ## Changelog :cl: RKz, Jacquerel add: New foodtype, GORE. Split from GROSS, GORE foodtype will be replacing it where the food in particular resembles a corpse or organ. GROSS should only apply to inedible or rotting foods. (baseball burgers) balance: 'Gore' is disliked by Humans and Toxic to Moths. However, Gore is liked by Lizards, Arachnids, Kepori, Slimepeople and Flies. Lizards no longer like 'gross' food. balance: All butchered player species are considered to be gore, only preferred by Lizards, Arachnids, Kepori, Slimepeople and Flies. If you like the taste of your fellow(or rival) crew, prepare accordingly. balance: Moved food preferences around to make more sense with the current system. Nothing drastic, but species liked foods should be much more immersive in general. /:cl: --- code/__DEFINES/food.dm | 5 +++ code/modules/food_and_drinks/food/ration.dm | 2 +- .../food_and_drinks/food/snacks/meat.dm | 34 +++++++++---------- .../food_and_drinks/food/snacks_burgers.dm | 10 +++--- .../food_and_drinks/food/snacks_meat.dm | 8 ++--- .../food_and_drinks/food/snacks_pastry.dm | 5 +-- .../food_and_drinks/food/snacks_soup.dm | 4 +-- .../carbon/human/species_types/flypeople.dm | 2 +- .../carbon/human/species_types/humans.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../carbon/human/species_types/kepori.dm | 4 +-- .../human/species_types/lizardpeople.dm | 4 +-- .../carbon/human/species_types/mothmen.dm | 4 +-- .../carbon/human/species_types/podpeople.dm | 2 +- .../carbon/human/species_types/spider.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../mob/living/simple_animal/hostile/bees.dm | 4 +++ code/modules/surgery/organs/organ_internal.dm | 2 +- 18 files changed, 54 insertions(+), 44 deletions(-) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 7e0feafb3da3..f2b6a8fd196d 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -14,6 +14,11 @@ #define BREAKFAST (1<<13) #define CLOTH (1<<14) #define GRILLED (1<<15) +/*#define NUTS (1<<16) +#define SEAFOOD (1<<17) +#define ORANGES (1<<18) +#define BUGS (1<<19)*/ +#define GORE (1<<20) /// IC meaning (more or less) for food flags #define FOOD_FLAGS_IC list( \ diff --git a/code/modules/food_and_drinks/food/ration.dm b/code/modules/food_and_drinks/food/ration.dm index 899bff9c9a26..ab6c72d55516 100644 --- a/code/modules/food_and_drinks/food/ration.dm +++ b/code/modules/food_and_drinks/food/ration.dm @@ -168,7 +168,7 @@ desc = "A mix of various salted offal, providing a unique and flavorful snack for those with adventurous tastes." filling_color = "#cc3300" tastes = list("assorted offal" = 1) - foodtype = MEAT + foodtype = MEAT | GORE //its literally entrails /obj/item/reagent_containers/food/snacks/ration/entree/maple_pork_sausage_patty name = "maple pork sausage patty" diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index 81f0fc8923ac..86323c2e00bc 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -39,7 +39,7 @@ cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/plain/human slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human tastes = list("tender meat" = 1) - foodtype = MEAT | RAW | GROSS + foodtype = MEAT | RAW | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/initialize_slice(obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human/slice, reagents_per_slice) ..() @@ -88,7 +88,7 @@ cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/plain/human/lizard filling_color = "#6B8E23" tastes = list("meat" = 4, "scales" = 1) - foodtype = MEAT | RAW + foodtype = MEAT | RAW | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant icon_state = "plantmeat" @@ -102,21 +102,21 @@ desc = "Ow, the edge." filling_color = "#202020" tastes = list("darkness" = 1, "meat" = 1) - foodtype = MEAT | RAW + foodtype = MEAT | RAW | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly icon_state = "flymeat" desc = "Nothing says tasty like maggot filled radioactive mutant flesh." list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/uranium = 3) tastes = list("maggots" = 1, "the inside of a reactor" = 1) - foodtype = MEAT | RAW | GROSS + foodtype = MEAT | RAW | GROSS | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth icon_state = "mothmeat" desc = "Unpleasantly powdery and dry. Kind of pretty, though." filling_color = "#BF896B" tastes = list("dust" = 1, "powder" = 1, "meat" = 2) - foodtype = MEAT | RAW + foodtype = MEAT | RAW | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/squid name = "calamari" @@ -131,8 +131,8 @@ desc = "There's a point where this needs to stop, and clearly we have passed it." filling_color = "#F0F0F0" tastes = list("bone" = 1) - slice_path = null //can't slice a bone into cutlets - foodtype = GROSS + slice_path = null //can't slice a bone into cutlets + foodtype = GROSS | GORE /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie name = " meat (rotten)" @@ -140,7 +140,7 @@ desc = "Halfway to becoming fertilizer for your garden." filling_color = "#6B8E23" tastes = list("brains" = 1, "meat" = 1) - foodtype = RAW | MEAT | TOXIC + foodtype = RAW | MEAT | TOXIC | GORE | GROSS // who the hell would eat this /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ethereal name = "crystalline cellulose" @@ -176,23 +176,23 @@ /obj/item/reagent_containers/food/snacks/meat/slab/mouse name = "mouse meat" desc = "A slab of mouse meat. Best not eat it raw." - foodtype = RAW | MEAT | GROSS + foodtype = RAW | MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/slab/mothroach name = "mothroach meat" - desc = "A light slab of meat." - foodtype = RAW | MEAT | GROSS + desc = "A light slab of mothroach meat." + foodtype = RAW | MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/slab/corgi name = "corgi meat" desc = "Tastes like... well you know..." tastes = list("meat" = 4, "a fondness for wearing hats" = 1) - foodtype = RAW | MEAT | GROSS + foodtype = RAW | MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/slab/pug name = "pug meat" desc = "Tastes like... well you know..." - foodtype = RAW | MEAT | GROSS + foodtype = RAW | MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/slab/killertomato name = "killer tomato meat" @@ -358,7 +358,7 @@ /obj/item/reagent_containers/food/snacks/meat/steak/plain/human tastes = list("tender meat" = 1) - foodtype = MEAT | GROSS + foodtype = MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/steak/killertomato name = "killer tomato steak" @@ -396,7 +396,7 @@ tastes = list("beef" = 1, "cod fish" = 1) /obj/item/reagent_containers/food/snacks/meat/steak/chicken - name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites. + name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites. //I concur icon_state = "birdsteak" tastes = list("chicken" = 1) @@ -444,7 +444,7 @@ /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human tastes = list("tender meat" = 1) - foodtype = MEAT | RAW | GROSS + foodtype = MEAT | RAW | GORE /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human/initialize_cooked_food(obj/item/reagent_containers/food/snacks/S, cooking_efficiency) ..() @@ -506,7 +506,7 @@ /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human tastes = list("tender meat" = 1) - foodtype = MEAT | GROSS + foodtype = MEAT | GORE /obj/item/reagent_containers/food/snacks/meat/cutlet/killertomato name = "killer tomato cutlet" diff --git a/code/modules/food_and_drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm index 5bff4f8edb27..44ee559641e3 100644 --- a/code/modules/food_and_drinks/food/snacks_burgers.dm +++ b/code/modules/food_and_drinks/food/snacks_burgers.dm @@ -33,7 +33,7 @@ desc = "A bloody burger." bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("bun" = 2, "long pig" = 4) - foodtype = MEAT | GRAIN | GROSS + foodtype = MEAT | GRAIN | GORE /obj/item/reagent_containers/food/snacks/burger/human/CheckParts(list/parts_list) ..() @@ -52,7 +52,7 @@ name = "corgi burger" desc = "You monster." bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 5) - foodtype = GRAIN | MEAT | GROSS + foodtype = GRAIN | MEAT | GORE /obj/item/reagent_containers/food/snacks/burger/appendix name = "appendix burger" @@ -60,7 +60,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) icon_state = "appendixburger" tastes = list("bun" = 4, "grass" = 2) - foodtype = GRAIN | MEAT | GROSS + foodtype = GRAIN | MEAT | GORE /obj/item/reagent_containers/food/snacks/burger/fish name = "fillet -o- carp sandwich" @@ -133,7 +133,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 6, /datum/reagent/consumable/nutriment/vitamin = 5) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/medicine/mannitol = 5, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("bun" = 4, "brains" = 2) - foodtype = GRAIN | MEAT | GROSS + foodtype = GRAIN | MEAT | GORE /obj/item/reagent_containers/food/snacks/burger/ghost name = "ghost burger" @@ -305,7 +305,7 @@ desc = "Pretty much what you'd expect..." icon_state = "ratburger" bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | MEAT | GROSS + foodtype = GRAIN | MEAT | GORE /obj/item/reagent_containers/food/snacks/burger/baseball name = "home run baseball burger" diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 515ef35bd882..78999078193c 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -321,7 +321,7 @@ /obj/item/reagent_containers/food/snacks/boiledspiderleg name = "boiled spider leg" - desc = "A giant spider's leg that's still twitching after being cooked. Gross!" + desc = "A giant spider's leg that's still twitching after being cooked. Yum!" //Its cooked and not GORE, so it shouldnt imply that its gross to eat icon_state = "spiderlegcooked" trash = /obj/item/trash/plate bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/nutriment/vitamin = 2) @@ -414,7 +414,7 @@ desc = "A human meat, on a stick." bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) tastes = list("tender meat" = 3, "metal" = 1) - foodtype = MEAT | GROSS + foodtype = MEAT | GORE /obj/item/reagent_containers/food/snacks/kebab/monkey name = "meat-kebab" @@ -436,7 +436,7 @@ desc = "Severed lizard tail on a stick." bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("meat" = 8, "metal" = 4, "scales" = 1) - foodtype = MEAT + foodtype = MEAT // NOT GORE, tastes delicious! /obj/item/reagent_containers/food/snacks/kebab/rat name = "rat-kebab" @@ -445,7 +445,7 @@ w_class = WEIGHT_CLASS_NORMAL list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2) tastes = list("rat meat" = 1, "metal" = 1) - foodtype = MEAT | GROSS + foodtype = MEAT | GORE /obj/item/reagent_containers/food/snacks/kebab/rat/double name = "double rat-kebab" diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 6cedb2a98142..d060dc1c2969 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -76,7 +76,7 @@ bonus_reagents = list(/datum/reagent/consumable/ketchup = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/ketchup = 2) tastes = list("meat" = 1) - foodtype = JUNKFOOD | MEAT | GROSS | FRIED | BREAKFAST + foodtype = JUNKFOOD | MEAT | GORE | FRIED | BREAKFAST is_decorated = TRUE /obj/item/reagent_containers/food/snacks/donut/berry @@ -377,13 +377,14 @@ /obj/item/reagent_containers/food/snacks/soylentgreen name = "\improper Soylent Green" - desc = "Not made of people. Honest." //Totally people. + desc = "Not made of people. Honest*." //Totally people. icon_state = "soylent_green" trash = /obj/item/trash/waffles bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#9ACD32" tastes = list("waffles" = 7, "people" = 1) + // The wafers are supposed to be flavorful and nutritious in the movie. They shouldn't be gross in a dystopian future where the chef regularly feeds people from the morgue to you. foodtype = GRAIN | MEAT /obj/item/reagent_containers/food/snacks/soylenviridians diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 3933ff4b233a..c7bcf963faf2 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -54,7 +54,7 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/blood = 10, /datum/reagent/water = 5, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("iron" = 1) - foodtype = GROSS + foodtype = GORE //its literally blood /obj/item/reagent_containers/food/snacks/soup/wingfangchu name = "wing fang chu" @@ -157,7 +157,7 @@ icon_state = "eyeballsoup" bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/liquidgibs = 3) tastes = list("tomato" = 1, "squirming" = 1) - foodtype = MEAT | GROSS + foodtype = MEAT | GORE /obj/item/reagent_containers/food/snacks/soup/milo name = "milosoup" diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index c7486730d7bb..af19f1316ce2 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -8,7 +8,7 @@ mutantstomach = /obj/item/organ/stomach/fly meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly disliked_food = null - liked_food = GROSS + liked_food = GORE | RAW // Sure, the raw... the bloody... but I think stuff GROSS, like baseball burgers, are liked changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/fly diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index dc671c736e69..885be6f5886a 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -7,7 +7,7 @@ mutant_bodyparts = list("ears", "tail_human") use_skintones = TRUE skinned_type = /obj/item/stack/sheet/animalhide/human - disliked_food = GROSS | RAW + disliked_food = GROSS | RAW | CLOTH liked_food = JUNKFOOD | FRIED | SUGAR changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it." diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 94cd1523344a..7dcfb31f1e8a 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -14,7 +14,7 @@ damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs var/datum/action/innate/humanoid_customization/humanoid_customization - liked_food = MEAT + liked_food = MEAT | GORE // Spliced with humans, they still never lost their carnivorous drive disliked_food = NONE toxic_food = NONE coldmod = 6 // = 3x cold damage diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 469c012a2d9d..5693c646cf3f 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -7,8 +7,8 @@ mutant_bodyparts = list("kepori_body_feathers", "kepori_tail_feathers", "kepori_feathers") default_features = list("mcolor" = "0F0", "wings" = "None", "kepori_feathers" = "Plain", "kepori_body_feathers" = "Plain", "kepori_tail_feathers" = "Fan", "body_size" = "Normal") meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken - disliked_food = GROSS | FRIED - liked_food = MEAT + disliked_food = FRIED | GROSS | CLOTH + liked_food = MEAT | GORE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT loreblurb = "Kepori are a species covered in feathers vaguely reminiscent of earth’s extinct troodontidae. They’re small and sometimes seen as weak by other species due to their hollow bones but make up for that in speed and reflexes. Those found in space are commonly known as rollaways. They tend to woop when excited, scared, or for any other reason at all." attack_verb = "slash" 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 1391e33ee7c0..141efed98e12 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -18,8 +18,8 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard skinned_type = /obj/item/stack/sheet/animalhide/lizard exotic_bloodtype = "L" - disliked_food = GRAIN | DAIRY - liked_food = GROSS | MEAT + disliked_food = GRAIN | DAIRY | CLOTH | GROSS + liked_food = GORE | MEAT inert_mutation = FIREBREATH deathsound = 'sound/voice/lizard/deathsound.ogg' wings_icons = list("Dragon") diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index d284224c37d0..02ddf79f6bc4 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -11,9 +11,9 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth - liked_food = FRUIT | SUGAR + liked_food = FRUIT | SUGAR | CLOTH disliked_food = GROSS - toxic_food = MEAT | RAW + toxic_food = MEAT | RAW | GORE mutanteyes = /obj/item/organ/eyes/compound //WS Edit - Compound eyes mutanttongue = /obj/item/organ/tongue/moth //WS Edit - Insectoid language changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 6d14741c13b6..daa645a662a8 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -14,7 +14,7 @@ heatmod = 1.5 meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant disliked_food = MEAT | DAIRY - liked_food = VEGETABLES | FRUIT | GRAIN + liked_food = VEGETABLES | FRUIT | GRAIN | CLOTH //cannibals apparentely changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/plant diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm index 0e6082b9d87d..84faffde6ca2 100644 --- a/code/modules/mob/living/carbon/human/species_types/spider.dm +++ b/code/modules/mob/living/carbon/human/species_types/spider.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt")) attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/spider - liked_food = MEAT | RAW + liked_food = MEAT | RAW | GORE // Regular spiders literally liquify the insides of their prey and drink em like a smoothie. I think this fits disliked_food = FRUIT | GROSS toxic_food = VEGETABLES | DAIRY | CLOTH mutanteyes = /obj/item/organ/eyes/night_vision/spider diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 4f9aea033461..48f84240c5ac 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -274,7 +274,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0) bitesize = 3 eatverb = "devour" list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) - foodtype = GROSS | MEAT | RAW + foodtype = GORE | MEAT | RAW grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5) /obj/item/reagent_containers/food/snacks/deadmouse/examine(mob/user) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index c87b82091597..d079fbed4ce4 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -10,6 +10,10 @@ #define BEE_POLLINATE_PEST_CHANCE 33 #define BEE_POLLINATE_POTENCY_CHANCE 50 +/* For when we makes bees edible lmao (NEWFOOD) +#define BEE_FOODGROUPS RAW | MEAT | GORE /*| BUGS*/ +*/ + /mob/living/simple_animal/hostile/poison/bees name = "bee" desc = "Buzzy buzzy bee, stingy sti- Ouch!" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 264574c476e4..51d857aaeff6 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -38,7 +38,7 @@ /obj/item/organ/Initialize() . = ..() if(organ_flags & ORGAN_EDIBLE) - AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) + AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GORE, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) ///When you take a bite you cant jam it in for surgery anymore. /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) From e613f212f723bbf5bc30640d3b15aeebb8bdac2e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 19 Sep 2023 15:41:52 -0500 Subject: [PATCH 50/57] Automatic changelog generation for PR #2359 [ci skip] --- html/changelogs/AutoChangeLog-pr-2359.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2359.yml diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml new file mode 100644 index 000000000000..0d3d5d529348 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2359.yml @@ -0,0 +1,11 @@ +author: RKz, Jacquerel +delete-after: true +changes: + - rscadd: New foodtype, GORE. Split from GROSS, GORE foodtype will be replacing + it where the food in particular resembles a corpse or organ. GROSS should only + apply to inedible or rotting foods. (baseball burgers) + - balance: All butchered player species are considered to be gore, only preferred + by Lizards, Arachnids, Kepori, Slimepeople and Flies. If you like the taste + of your fellow(or rival) crew, prepare accordingly. + - balance: Moved food preferences around to make more sense with the current system. + Nothing drastic, but species liked foods should be much more immersive in general. From 0163e694d99b046b7afe53ce862911b3665e48b5 Mon Sep 17 00:00:00 2001 From: spockye <79304582+spockye@users.noreply.github.com> Date: Tue, 19 Sep 2023 22:28:18 +0200 Subject: [PATCH 51/57] i fucked up (disco edition) (#2326) forgot to update the icon state ## About The Pull Request forgot to update the icon state, making it a error in the mapmaker THIS IS NOT A GOOD FIX, SOMEONE SHOULD FIX THIS FOR REAL LATER (im too dumb) ## Why It's Good For The Game makes the jukeboxes APPEAR in the mapper ## Changelog :cl: fix: temp fixed the jukebox(with subtypes) so they appear in the mapmaker /:cl: --- code/game/machinery/dance_machine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index dc66649c0aa9..3fd9d90db45e 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -2,7 +2,7 @@ name = "jukebox" desc = "A classic music player." icon = 'icons/obj/stationobjs.dmi' - icon_state = "jukebox" + icon_state = "jukebox-" verb_say = "states" density = TRUE var/active = FALSE @@ -15,14 +15,14 @@ /obj/machinery/jukebox/boombox name = "boombox" desc = "A theoretically-portable music player that's much larger and heavier than it really needs to be." - icon_state = "boombox" + icon_state = "boombox-" density = FALSE /obj/machinery/jukebox/disco name = "radiant dance machine mark IV" desc = "The first three prototypes were discontinued after mass casualty incidents." - icon_state = "disco" + icon_state = "disco-" anchored = FALSE var/list/spotlights = list() var/list/sparkles = list() From 4a3b25941a236b0365f4dbef95abc1cc9337d761 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 19 Sep 2023 17:05:10 -0500 Subject: [PATCH 52/57] Automatic changelog generation for PR #2326 [ci skip] --- html/changelogs/AutoChangeLog-pr-2326.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2326.yml diff --git a/html/changelogs/AutoChangeLog-pr-2326.yml b/html/changelogs/AutoChangeLog-pr-2326.yml new file mode 100644 index 000000000000..2195efe659f8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2326.yml @@ -0,0 +1,4 @@ +author: spockye +delete-after: true +changes: + - bugfix: temp fixed the jukebox(with subtypes) so they appear in the mapmaker From 070c9e21330efaa71d2c28980eb652dd19ba0a57 Mon Sep 17 00:00:00 2001 From: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Tue, 19 Sep 2023 16:30:13 -0500 Subject: [PATCH 53/57] Eyepatch Flopping + Double Eyepatch (#2362) ## About The Pull Request You can now alt+click any eyepatch (normal, thermal, sechud) to switch the side that it covers. Examine tells you which side it currently covers. You can also add another eyepatch to an eyepatch (only normal because I don't want to make special ones for the other two types when the first will probably see the light of day once) to make a DOUBLE EYEPATCH, aka a blindfold. Interacting with the blindfold in hand gives you the two eyepatches back. ## Why It's Good For The Game Switching eyepatch to decide which side you wear it on is just... good, because character and like, stuff. Double eyepatch is a full-on meme that makes me giggle a LITTLE but I'm fine with it not existing. ## Changelog :cl: add: Adds the double eyepatch, a blindfold made by adding a normal eyepatch to another tweak: Eyepatches can now swap sides with ALT+CLICK /:cl: --- code/modules/clothing/glasses/_glasses.dm | 59 ++++++++++++++++++++-- code/modules/clothing/glasses/hud.dm | 15 +++++- icons/mob/clothing/eyes.dmi | Bin 12239 -> 12665 bytes icons/obj/clothing/glasses.dmi | Bin 16680 -> 17097 bytes 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index a94a18bce614..f4c2a5a27f4e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -128,8 +128,31 @@ /obj/item/clothing/glasses/eyepatch name = "eyepatch" desc = "Yarr." - icon_state = "eyepatch" - item_state = "eyepatch" + icon_state = "eyepatch-0" + item_state = "eyepatch-0" + var/flipped = FALSE + +/obj/item/clothing/glasses/eyepatch/AltClick(mob/user) + . = ..() + flipped = !flipped + to_chat(user, "You shift the eyepatch to cover the [flipped == 0 ? "right" : "left"] eye.") + icon_state = "eyepatch-[flipped]" + item_state = "eyepatch-[flipped]" + update_appearance() + +/obj/item/clothing/glasses/eyepatch/examine(mob/user) + . = ..() + . += "It is currently aligned to the [flipped == 0 ? "right" : "left"] side." + +/obj/item/clothing/glasses/eyepatch/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/clothing/glasses/eyepatch)) + var/obj/item/clothing/glasses/eyepatch/old_patch = I + var/obj/item/clothing/glasses/blindfold/eyepatch/double_patch = new/obj/item/clothing/glasses/blindfold/eyepatch + double_patch.forceMove(user.drop_location()) + to_chat(user, "You combine the eyepatches with a knot.") + old_patch.Destroy() + Destroy() /obj/item/clothing/glasses/monocle name = "monocle" @@ -348,6 +371,21 @@ M.color = "#[H.eye_color]" . += M +/obj/item/clothing/glasses/blindfold/eyepatch + name = "double eyepatch" + desc = "For those pirates who've been at it a while. May interfere with navigating ability." + icon_state = "eyepatchd" + item_state = "eyepatchd" + +/obj/item/clothing/glasses/blindfold/eyepatch/attack_self(mob/user) + . = ..() + var/obj/item/clothing/glasses/eyepatch/patch_one = new/obj/item/clothing/glasses/eyepatch + var/obj/item/clothing/glasses/eyepatch/patch_two = new/obj/item/clothing/glasses/eyepatch + patch_one.forceMove(user.drop_location()) + patch_two.forceMove(user.drop_location()) + to_chat(user, "You undo the knot on the eyepatches.") + Destroy() + /obj/item/clothing/glasses/sunglasses/big desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes." icon_state = "bigsunglasses" @@ -411,8 +449,21 @@ /obj/item/clothing/glasses/thermal/eyepatch name = "optical thermal eyepatch" desc = "An eyepatch with built-in thermal optics." - icon_state = "eyepatch" - item_state = "eyepatch" + icon_state = "eyepatch-0" + item_state = "eyepatch-0" + var/flipped = FALSE + +/obj/item/clothing/glasses/thermal/eyepatch/AltClick(mob/user) + . = ..() + flipped = !flipped + to_chat(user, "You shift the eyepatch to cover the [flipped == 0 ? "right" : "left"] eye.") + icon_state = "eyepatch-[flipped]" + item_state = "eyepatch-[flipped]" + update_appearance() + +/obj/item/clothing/glasses/thermal/eyepatch/examine(mob/user) + . = ..() + . += "It is currently aligned to the [flipped == 0 ? "right" : "left"] side." /obj/item/clothing/glasses/cold name = "cold goggles" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index bd5cedd2e3d7..fd802cf55ec6 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -128,7 +128,20 @@ /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch name = "eyepatch HUD" desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball." - icon_state = "hudpatch" + icon_state = "hudpatch-0" + var/flipped = FALSE + +/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/AltClick(mob/user) + . = ..() + flipped = !flipped + to_chat(user, "You shift the hudpatch to cover the [flipped == 0 ? "right" : "left"] eye.") + icon_state = "hudpatch-[flipped]" + item_state = "hudpatch-[flipped]" + update_appearance() + +/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/examine(mob/user) + . = ..() + . += "It is currently aligned to the [flipped == 0 ? "right" : "left"] side." /obj/item/clothing/glasses/hud/security/sunglasses name = "security HUDSunglasses" diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index bdfe41995f6d765e4bc55b1e0e3787b24e7cfa6a..9af8d7dc8bba59121c8b120229b0d679d06ca1df 100644 GIT binary patch literal 12665 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 `a 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 literal 12239 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 V3vr-rfd2sjkQSE{D-+QV_+M=zcEtby From 79787ad60a1e671e7a4a64f26c44861d5546b46c Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 19 Sep 2023 17:30:33 -0500 Subject: [PATCH 54/57] Automatic changelog generation for PR #2362 [ci skip] --- html/changelogs/AutoChangeLog-pr-2362.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2362.yml diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml new file mode 100644 index 000000000000..26d6dcf2a65b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2362.yml @@ -0,0 +1,6 @@ +author: Skrem7 +delete-after: true +changes: + - rscadd: Adds the double eyepatch, a blindfold made by adding a normal eyepatch + to another + - tweak: Eyepatches can now swap sides with ALT+CLICK From 22770b482d3979b45aafb01db129cd549c540255 Mon Sep 17 00:00:00 2001 From: Skrem_7 <98909416+Skrem7@users.noreply.github.com> Date: Tue, 19 Sep 2023 17:05:37 -0500 Subject: [PATCH 55/57] cybernetic organs no longer permanently begin to shut down (#2335) ## About The Pull Request Removes the chance of an EMP effect shutting down cybernetic organs based on its intensity aka rng ## Why It's Good For The Game I would prefer to not force IPCs to have to ahelp for revival if they get hit by one loose ion (gross) ## Changelog :cl: balance: Cybernetic organs can no longer require replacement due to EMPs (they do not suffer permanent damage) /:cl: --- code/modules/surgery/organs/heart.dm | 6 ------ code/modules/surgery/organs/liver.dm | 2 -- code/modules/surgery/organs/lungs.dm | 2 -- code/modules/surgery/organs/stomach.dm | 2 -- 4 files changed, 12 deletions(-) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index dd6d8efc1065..cafcc0196b1b 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -217,12 +217,6 @@ owner.Dizzy(10) owner.losebreath += 10 severe_cooldown = world.time + 20 SECONDS - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - Stop() - owner.visible_message("[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!", \ - "You feel a terrible pain in your chest, as if your heart has stopped!") - addtimer(CALLBACK(src, .proc/Restart), 10 SECONDS) /obj/item/organ/heart/cybernetic/on_life() . = ..() diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index d8e10731da30..b2812d941975 100644 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -116,8 +116,6 @@ if(world.time > severe_cooldown) //So we cant just spam emp to kill people. owner.adjustToxLoss(10) severe_cooldown = world.time + 10 SECONDS - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. /obj/item/organ/liver/cybernetic/upgraded/ipc icon = 'icons/obj/surgery.dmi' diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index fa928c1e2053..fc5de4be3049 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -419,8 +419,6 @@ if(world.time > severe_cooldown) //So we cant just spam emp to kill people. owner.losebreath += 20 severe_cooldown = world.time + 30 SECONDS - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. #undef PP #undef PP_MOLES diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 615428d962b5..10cc049eb806 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -160,8 +160,6 @@ if(!COOLDOWN_FINISHED(src, severe_cooldown)) //So we cant just spam emp to kill people. owner.vomit(stun = FALSE) COOLDOWN_START(src, severe_cooldown, 10 SECONDS) - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. //WS Begin - IPCs From 3b560c22a9ddf73100db37571d9d0a1138e71aaa Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 19 Sep 2023 17:55:15 -0500 Subject: [PATCH 56/57] Automatic changelog generation for PR #2335 [ci skip] --- html/changelogs/AutoChangeLog-pr-2335.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2335.yml diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml new file mode 100644 index 000000000000..6bf9cfe27cca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2335.yml @@ -0,0 +1,5 @@ +author: Skrem7 +delete-after: true +changes: + - balance: Cybernetic organs can no longer require replacement due to EMPs (they + do not suffer permanent damage) From 604248b149ed8124b5c24c1afbe6d3a7f5a93605 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 20 Sep 2023 00:45:44 +0000 Subject: [PATCH 57/57] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2326.yml | 4 ---- html/changelogs/AutoChangeLog-pr-2335.yml | 5 ----- html/changelogs/AutoChangeLog-pr-2359.yml | 11 ----------- html/changelogs/AutoChangeLog-pr-2362.yml | 6 ------ html/changelogs/archive/2023-09.yml | 18 ++++++++++++++++++ 5 files changed, 18 insertions(+), 26 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2326.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2335.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2359.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2362.yml diff --git a/html/changelogs/AutoChangeLog-pr-2326.yml b/html/changelogs/AutoChangeLog-pr-2326.yml deleted file mode 100644 index 2195efe659f8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2326.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: spockye -delete-after: true -changes: - - bugfix: temp fixed the jukebox(with subtypes) so they appear in the mapmaker diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml deleted file mode 100644 index 6bf9cfe27cca..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2335.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Skrem7 -delete-after: true -changes: - - balance: Cybernetic organs can no longer require replacement due to EMPs (they - do not suffer permanent damage) diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml deleted file mode 100644 index 0d3d5d529348..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2359.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: RKz, Jacquerel -delete-after: true -changes: - - rscadd: New foodtype, GORE. Split from GROSS, GORE foodtype will be replacing - it where the food in particular resembles a corpse or organ. GROSS should only - apply to inedible or rotting foods. (baseball burgers) - - balance: All butchered player species are considered to be gore, only preferred - by Lizards, Arachnids, Kepori, Slimepeople and Flies. If you like the taste - of your fellow(or rival) crew, prepare accordingly. - - balance: Moved food preferences around to make more sense with the current system. - Nothing drastic, but species liked foods should be much more immersive in general. diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml deleted file mode 100644 index 26d6dcf2a65b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2362.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Skrem7 -delete-after: true -changes: - - rscadd: Adds the double eyepatch, a blindfold made by adding a normal eyepatch - to another - - tweak: Eyepatches can now swap sides with ALT+CLICK diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml index d281e2a39f3f..ded7a537e32f 100644 --- a/html/changelogs/archive/2023-09.yml +++ b/html/changelogs/archive/2023-09.yml @@ -117,3 +117,21 @@ - spellcheck: Assualt is gone. - code_imp: Repaths/renames most ballistic ammo pathing to maintain consistency or take advantage of inherits, when possible. +2023-09-20: + RKz, Jacquerel: + - rscadd: New foodtype, GORE. Split from GROSS, GORE foodtype will be replacing + it where the food in particular resembles a corpse or organ. GROSS should only + apply to inedible or rotting foods. (baseball burgers) + - balance: All butchered player species are considered to be gore, only preferred + by Lizards, Arachnids, Kepori, Slimepeople and Flies. If you like the taste + of your fellow(or rival) crew, prepare accordingly. + - balance: Moved food preferences around to make more sense with the current system. + Nothing drastic, but species liked foods should be much more immersive in general. + Skrem7: + - rscadd: Adds the double eyepatch, a blindfold made by adding a normal eyepatch + to another + - tweak: Eyepatches can now swap sides with ALT+CLICK + - balance: Cybernetic organs can no longer require replacement due to EMPs (they + do not suffer permanent damage) + spockye: + - bugfix: temp fixed the jukebox(with subtypes) so they appear in the mapmaker

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 z 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%0De^b%#oiKdQ9 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 z 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 `HVm)iMa18Je(%1*0U;&kTZ2;yUwV!P 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