diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 53af9cf4285..9cbc0903429 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -90,6 +90,8 @@ Things you **CAN'T** do: * [Close PRs](https://imgur.com/w2RqpX8.png): Only maintainers are allowed to close PRs. Do not hit that button. * Close issues purely for breaking a template if the same information is contained without it. +For more information reference the [Issue Manager Guide](.github/guides/ISSUE_MANAGER.md). + ## Development Guides diff --git a/.github/guides/ISSUE_MANAGER.md b/.github/guides/ISSUE_MANAGER.md new file mode 100644 index 00000000000..4d584c42147 --- /dev/null +++ b/.github/guides/ISSUE_MANAGER.md @@ -0,0 +1,49 @@ +## What is an Issue Manager + +Issue Managers proactively manage issues for the repo by providing feedback, performing triage, and troubleshooting problems. They search through the codebase to link relevant code, issues, and PRs that help contributors identify and solve an issue. + +## Triage An Issue + +New issues should be properly diagnosed by using several methods and tools below: + +#### Emergency Issues + +When examining new issues you should immediately notify a maintainer if you see the following: + +- **Security Exploit** [[1]](https://github.com/tgstation/tgstation/issues/51654) [[2]](https://github.com/tgstation/tgstation/issues/38407) [[3]](https://github.com/tgstation/tgstation/issues/9900) - Something that can be used to bypass bans, give a player admin powers, cheats or hacks +- **Server Crashing** [[1]](https://github.com/tgstation/tgstation/issues/29342) [[2]](https://github.com/tgstation/tgstation/issues/25890) [[3]](https://github.com/tgstation/tgstation/issues/17475) - Something that is causing the server to _consistently_ crash +- **Server Lagging** [[1]](https://github.com/tgstation/tgstation/issues/60193) [[2]](https://github.com/tgstation/tgstation/issues/51927) [[3]](https://github.com/tgstation/tgstation/issues/32762) - Something that is causing a _severe_ amount of lag during the game + +#### Link Code Snippets + +To help triangulate bugs, search the GitHub repo to locate relevant code and attach it to an issue. Do this by creating a [link to the code](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet). This saves the contributors time from having to identify the problem and will be appreciated. + +#### Use Gitblame + +GitHub also has a tool called `gitblame` that is useful in [tracking code](https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#viewing-the-line-by-line-revision-history-for-a-file) to determine who and when someone made a change. This is ideally used to help solve old issues when there is uncertainty over which PR might have fixed it. It is also a good tool to use to link PRs that caused the issue. + +#### Search For Keywords + +When a new issue appears search for any keywords involved with the issue. This is important to prune for duplicates, match several issues to a test merge PR, or if you want to link multiple issues together since there is overlapping problems. (but not duplicate) + +## Closing Issues + +It is recommended to close issues in the following situations: + +- **Feature Requests** [[1]](https://github.com/tgstation/tgstation/issues/55919) [[2]](https://github.com/tgstation/tgstation/issues/53342) [[3]](https://github.com/tgstation/tgstation/issues/45412) - The issue is a suggestion or request for a new feature to be added to the game. +- **Working as Intended** [[1]](https://github.com/tgstation/tgstation/issues/62619) [[2]](https://github.com/tgstation/tgstation/issues/61511) [[3]](https://github.com/tgstation/tgstation/issues/60942) - The issue is detailing a problem that is _specifically intended_ by the code and is not considered a bug. +- **Duplicates** [[1]](https://github.com/tgstation/tgstation/issues/62709) [[2]](https://github.com/tgstation/tgstation/issues/62364) [[3]](https://github.com/tgstation/tgstation/issues/61823) - The issue is detailing an identical problem from another issue. Do not automatically close the most recent issue. Instead compare both and close the one that provides the least information. +- **Removed Features** [[1]](https://github.com/tgstation/tgstation/issues/48255) [[2]](https://github.com/tgstation/tgstation/issues/47194) [[3]](https://github.com/tgstation/tgstation/issues/45653) - The issue is referring to something that was removed from the codebase and no longer exists. +- **Defective Issues** [[1]](https://github.com/tgstation/tgstation/issues/57366) [[2]](https://github.com/tgstation/tgstation/issues/48778) [[3]](https://github.com/tgstation/tgstation/issues/51520) - The issue is badly written and lacking information. Politely ask the person to add more information or rewrite the issue. If there is no response after a sufficient amount of time close the issue. +- **Irreproducible Issues** [[1]](https://github.com/tgstation/tgstation/issues/51493) [[2]](https://github.com/tgstation/tgstation/issues/22796) [[3]](https://github.com/tgstation/tgstation/issues/25610) - The issue is old, cannot be reproduced, and nobody has reported a duplicate issue recently. If you feel _confident_ that the issue has been fixed at some point, list your reasons or link possible PRs that could have fixed it. +- **Impossible to Fix Issues** [[1]](https://github.com/tgstation/tgstation/issues/524) [[2]](https://github.com/tgstation/tgstation/issues/2679) [[3]](https://github.com/tgstation/tgstation/issues/9637) - The issue is not possible to fix due to either vague details or a clearly defined problem. + +## Reopening Issues + +In special cases a closed issue should be reopened if: + +- It has been updated with pertinent information (when before it was lacking info making it defective) +- The initial problem has reappeared (after it was presumably fixed in a PR) +- Someone feels that the issue was closed prematurely during discussion + +If there is a dispute on whether an issue should remain closed, ask for a second opinion. Get clarification from another Issue Manager or Maintainer and respect their judgement as the final verdict. diff --git a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm index ccd2818eb32..842a6899450 100644 --- a/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm +++ b/_maps/RandomRuins/SpaceRuins/cyborg_mothership.dmm @@ -7,7 +7,7 @@ /turf/open/misc/asteroid/airless, /area/space) "d" = ( -/obj/effect/decal/remains/human/grave, +/obj/effect/decal/remains/human, /turf/open/misc/asteroid/airless, /area/space) "e" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 95208044759..e6e877bba95 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -473,6 +473,20 @@ /obj/item/clothing/mask/gas/owl_mask, /turf/open/floor/wood, /area/station/maintenance/fore/greater) +"akB" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination/atmos, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "akR" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -784,10 +798,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"aqV" = ( -/obj/structure/chair/sofa/bench/left, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "aqW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/right{ @@ -1010,6 +1020,13 @@ /obj/effect/turf_decal/tile/blue/half, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) +"awK" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/disposal/incinerator) "awL" = ( /obj/structure/chair{ dir = 4 @@ -1425,6 +1442,23 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"aHy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/research) "aHJ" = ( /obj/structure/window/spawner/directional/north, /obj/machinery/hydroponics/soil, @@ -1885,6 +1919,11 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) +"aRa" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/service/cafeteria) "aRn" = ( /obj/effect/turf_decal/siding/dark_red, /obj/item/stack/sheet/cardboard{ @@ -2178,16 +2217,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"aWE" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/department/engine) "aXI" = ( /turf/closed/wall/r_wall, /area/station/science/lobby) @@ -2278,13 +2307,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"bab" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/plating, -/area/station/hallway/secondary/dock) "bat" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -2416,6 +2438,27 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"bdg" = ( +/obj/effect/turf_decal/siding/thinplating_new/terracotta{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/recharger{ + pixel_x = -7; + pixel_y = 3 + }, +/obj/item/folder/yellow{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/wood/tile, +/area/station/command/bridge) "bdJ" = ( /obj/structure/frame/machine, /obj/item/circuitboard/machine/smes, @@ -2886,6 +2929,17 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"bow" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/dockarrival, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"boB" = ( +/obj/effect/turf_decal/tile/green/diagonal_centre, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/iron/diagonal, +/area/station/hallway/primary/central/aft) "boK" = ( /obj/effect/turf_decal/stripes/asteroid/end{ dir = 1 @@ -3019,6 +3073,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"brV" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/rack, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "brZ" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -3501,14 +3562,6 @@ dir = 8 }, /area/station/maintenance/disposal/incinerator) -"bAk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/disposal/incinerator) "bAo" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ dir = 4 @@ -3871,6 +3924,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/main) +"bFS" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/hydro, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "bFW" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/rnd_all, @@ -3906,17 +3972,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/construction) -"bGs" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "bGv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4052,6 +4107,21 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"bJE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "garbage"; + name = "trash belt" + }, +/obj/machinery/recycler, +/turf/open/floor/plating, +/area/station/service/janitor) "bJL" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -4326,6 +4396,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"bRi" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/right, +/obj/machinery/light/small/directional/west, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "bRk" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -4401,13 +4481,6 @@ /obj/machinery/flasher/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"bSW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "bSX" = ( /obj/machinery/flasher/directional/east{ id = "AI"; @@ -4601,6 +4674,16 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) +"bWq" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/left, +/obj/machinery/light/small/directional/east, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "bWs" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4619,6 +4702,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) +"bWL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/court, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "bWQ" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/decal/cleanable/dirt, @@ -5143,13 +5235,6 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) -"chF" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/rack, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "chO" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -5427,14 +5512,6 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron, /area/station/service/hydroponics) -"cph" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/lower) "cpt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5680,6 +5757,18 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) +"cuN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "cuS" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -5840,6 +5929,11 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"czb" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) "cze" = ( /obj/machinery/turretid{ icon_state = "control_stun"; @@ -6230,6 +6324,14 @@ /obj/machinery/light/directional/east, /turf/open/floor/plating, /area/station/engineering/main) +"cFf" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/industrial_lift/tram/white, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "cFg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6358,17 +6460,17 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"cIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ +"cId" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/remains/human/grave{ - pixel_x = 6; - pixel_y = 6 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +/obj/effect/landmark/navigate_destination/teleporter, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "cIs" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ @@ -6733,20 +6835,6 @@ /obj/effect/turf_decal/siding/blue/corner, /turf/open/floor/iron/white/small, /area/station/medical/storage) -"cPj" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/mail_sorting/engineering/general, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "cPD" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -7336,11 +7424,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/atmos) -"dcp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "dcG" = ( /obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ dir = 8 @@ -7526,6 +7609,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"dfL" = ( +/obj/machinery/computer/cargo/request, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "dfN" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, @@ -7706,15 +7798,6 @@ dir = 1 }, /area/station/engineering/atmospherics_engine) -"djR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "djU" = ( /obj/machinery/power/smes/engineering, /turf/open/floor/plating, @@ -8132,15 +8215,6 @@ /obj/item/airlock_painter, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"dsr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/delamination_counter/directional/west, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "dst" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -8676,6 +8750,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) +"dBN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering{ + name = "Auxillary Base Construction" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half{ + dir = 8 + }, +/area/station/construction/mining/aux_base) "dBV" = ( /turf/open/floor/plating/airless, /area/station/engineering/atmospherics_engine) @@ -8799,15 +8887,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) -"dDW" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/north, -/obj/structure/chair/sofa/bench/right, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "dEt" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 6 @@ -8884,6 +8963,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"dGT" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/structure/barricade/wooden, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "dHk" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 @@ -9044,6 +9131,23 @@ }, /turf/open/floor/iron/diagonal, /area/station/maintenance/department/engine/atmos) +"dKo" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "AISat Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/ai_monitored/turret_protected/aisat/maint) "dKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9539,12 +9643,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"dTu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/station/engineering/atmos) "dTI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -10217,6 +10315,11 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) +"egq" = ( +/obj/structure/bookcase/random/nonfiction, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/bar) "egr" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -10324,6 +10427,15 @@ }, /turf/open/floor/iron, /area/station/security) +"ejm" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "ejn" = ( /obj/structure/frame, /obj/item/stack/cable_coil/five, @@ -10773,20 +10885,6 @@ dir = 1 }, /area/station/engineering/atmos) -"eru" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "erA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10814,19 +10912,6 @@ /obj/machinery/computer/records/security, /turf/open/floor/iron/small, /area/station/security/office) -"esc" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Pure" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos) "esv" = ( /obj/docking_port/stationary{ dwidth = 4; @@ -11152,19 +11237,6 @@ /obj/structure/sink/directional/east, /turf/open/floor/iron/white, /area/station/medical/virology) -"eyo" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/east, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_edge{ - dir = 4 - }, -/area/station/maintenance/disposal/incinerator) "eyv" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/computer/security{ @@ -11194,6 +11266,13 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"eze" = ( +/obj/structure/chair/sofa/bench/right, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/incident_display/tram/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "ezg" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/spawner/random/structure/crate, @@ -11267,6 +11346,14 @@ /obj/machinery/light/floor, /turf/open/floor/noslip, /area/station/medical/medbay/central) +"eAH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "eAK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -11314,17 +11401,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"eBx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Telecomms Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/textured_half, -/area/station/hallway/primary/starboard) "eBH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11783,13 +11859,6 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"eJp" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "eJw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11846,14 +11915,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"eKT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/brown/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "eKU" = ( /turf/closed/wall/r_wall/rust, /area/station/engineering/atmos/pumproom) @@ -11863,19 +11924,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eKY" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "eLn" = ( /obj/machinery/door/airlock/glass{ name = "Gold Standard Law Firm" @@ -11926,21 +11974,6 @@ dir = 8 }, /area/station/engineering/break_room) -"eLY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/vault{ - name = "Vault" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/access/all/supply/vault, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor, -/area/station/ai_monitored/command/nuke_storage) "eMj" = ( /obj/machinery/modular_computer/preset/cargochat/engineering{ dir = 8 @@ -12316,6 +12349,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"eTH" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/hop, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "eTL" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -12383,10 +12426,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"eVb" = ( -/obj/structure/closet/secure_closet/engineering_welding, -/turf/open/floor/iron/small, -/area/station/engineering/atmos) "eVe" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -12520,16 +12559,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/small, /area/station/engineering/atmos) -"eYQ" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/left/directional/north, -/obj/structure/chair/sofa/bench/left, -/obj/machinery/light/small/directional/east, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "eYV" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, @@ -12586,17 +12615,6 @@ /obj/machinery/door/airlock/public, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"fas" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/yellow/line, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/station/maintenance/disposal/incinerator) "fav" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/computer/security/telescreen/entertainment/directional/west, @@ -13212,11 +13230,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"fod" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) "foe" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -13895,6 +13908,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/station/engineering/supermatter) +"fzo" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/landmark/navigate_destination/research, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "fzt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14231,12 +14251,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/break_room) -"fDz" = ( -/obj/structure/chair/sofa/bench/right, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "fDC" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -14504,6 +14518,15 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/pumproom) +"fIh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockesc, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/hallway/secondary/exit/departure_lounge) "fIr" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron/small, @@ -14557,6 +14580,16 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"fJw" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/lawyer, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "fJK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -15355,23 +15388,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"fWH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "AISat Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/maint) "fWJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -15470,23 +15486,6 @@ dir = 8 }, /area/station/hallway/secondary/dock) -"fZw" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "AISat Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/ai_monitored/turret_protected/aisat/maint) "gan" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/research{ @@ -15535,6 +15534,16 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/white/small, /area/station/science/lab) +"gaW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/disposals, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) "gbD" = ( /obj/machinery/hydroponics/soil, /obj/item/food/grown/mushroom/reishi, @@ -15621,16 +15630,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"gem" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "geu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -15835,6 +15834,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"ggY" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "ghc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -17008,6 +17021,17 @@ }, /turf/open/space/basic, /area/space/nearstation) +"gDD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/light/directional/north, +/obj/item/analyzer, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/maintenance/disposal/incinerator) "gDE" = ( /obj/structure/window/spawner/directional/east, /turf/open/space/basic, @@ -17027,15 +17051,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) -"gDV" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner{ - pixel_y = 6 - }, -/obj/machinery/light/cold/directional/north, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "gEc" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -17166,15 +17181,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"gHn" = ( -/obj/machinery/computer/security/mining, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) "gHA" = ( /obj/structure/chair/wood{ dir = 8 @@ -17183,24 +17189,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood, /area/station/service/chapel/funeral) -"gHG" = ( -/obj/machinery/computer/cargo/request, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 1 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) -"gHJ" = ( -/obj/structure/hedge, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/brown{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/command/bridge) "gHP" = ( /obj/structure/hedge, /obj/effect/mapping_helpers/broken_floor, @@ -17701,14 +17689,6 @@ /obj/structure/fermenting_barrel, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"gPQ" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/structure/barricade/wooden, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) "gPT" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/spawner/random/structure/girder, @@ -17844,6 +17824,11 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical/central) +"gRV" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "gRX" = ( /obj/machinery/newscaster/directional/south, /obj/structure/broken_flooring/singular/directional/east, @@ -18575,26 +18560,6 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) -"hcJ" = ( -/obj/effect/turf_decal/siding/thinplating_new/terracotta{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/siding/yellow, -/obj/machinery/recharger{ - pixel_x = -7; - pixel_y = 3 - }, -/obj/item/folder/yellow{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = 6 - }, -/turf/open/floor/wood/tile, -/area/station/command/bridge) "hcY" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -18952,6 +18917,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth, /area/station/command/gateway) +"hiA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Telecomms Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/white/textured_half, +/area/station/engineering/storage/tcomms) "hiV" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -19224,24 +19201,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) -"hnr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hnO" = ( /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment{ @@ -19669,16 +19628,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"hvz" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) "hvG" = ( /obj/machinery/computer/prisoner/management{ dir = 8 @@ -19718,20 +19667,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"hwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/command/glass{ - name = "E.V.A. Storage" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/eva, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/ai_monitored/command/storage/eva) "hwk" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/siding/green, @@ -20820,6 +20755,17 @@ /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"hRO" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "hRX" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -20; @@ -20996,6 +20942,20 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"hVC" = ( +/obj/structure/window/reinforced/plasma/spawner/directional/east, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/station/maintenance/disposal/incinerator) "hVM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21789,6 +21749,23 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/station/science/xenobiology) +"ijf" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/incident_display/dual/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) +"ijo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/machinery/light/cold/directional/north, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security) "ijB" = ( /obj/machinery/atmospherics/components/trinary/mixer/flipped{ dir = 8 @@ -22346,15 +22323,6 @@ "itb" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/aisat/maint) -"itq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/hallway/abandoned_command) "itw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -22868,6 +22836,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"iCH" = ( +/obj/structure/chair/sofa/bench/left, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "iCN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23587,6 +23560,21 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) +"iPo" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/research{ + name = "Development Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/lobby) "iPv" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -23618,6 +23606,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"iQs" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/eva, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "iQv" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -24692,6 +24691,10 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/iron, /area/station/science/xenobiology) +"jjN" = ( +/obj/structure/chair/sofa/bench, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "jjO" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 @@ -24992,6 +24995,16 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"jqe" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "jqs" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -18; @@ -25047,6 +25060,23 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"jqM" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "AISat Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/ai_monitored/turret_protected/aisat/maint) "jqZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -25151,6 +25181,12 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/aft) +"jsY" = ( +/obj/machinery/door/airlock/external{ + name = "Common Mining Dock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/dock) "jte" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -25522,6 +25558,13 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"jBs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/dorms, +/turf/open/floor/iron, +/area/station/commons/dorms) "jBx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26086,6 +26129,15 @@ dir = 4 }, /area/station/cargo/office) +"jKG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/command/glass, +/obj/effect/mapping_helpers/airlock/access/any/command/hop, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured_half, +/area/station/command/heads_quarters/hop) "jKJ" = ( /obj/machinery/door/window/right/directional/north, /turf/open/floor/iron, @@ -26242,6 +26294,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"jNz" = ( +/obj/machinery/computer/security/mining, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/machinery/incident_display/dual/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "jNH" = ( /obj/structure/closet/boxinggloves, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -26263,10 +26324,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"jNZ" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/smooth_half, -/area/station/hallway/primary/central/fore) "jOb" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -26349,20 +26406,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/fore/greater) -"jPO" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) "jQh" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -26607,6 +26650,21 @@ /obj/structure/industrial_lift/tram/subfloor, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) +"jUQ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/engineering/general, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/engineering, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "jVe" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -26821,16 +26879,6 @@ }, /turf/open/floor/engine, /area/station/science/explab) -"jYW" = ( -/obj/machinery/door/airlock/maintenance/external{ - name = "Command Storeroom" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) "jYY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27288,6 +27336,18 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/wood, /area/station/service/chapel/funeral) +"kht" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/landmark/navigate_destination/incinerator, +/turf/open/floor/iron/smooth_corner{ + dir = 8 + }, +/area/station/maintenance/disposal/incinerator) "khD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -27350,6 +27410,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"kiw" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/effect/landmark/navigate_destination/sec, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "kiB" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -27752,6 +27821,15 @@ }, /turf/open/floor/iron/small, /area/station/maintenance/department/engine) +"kpE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/tcomms, +/turf/open/floor/iron, +/area/station/science/lower) "kpF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/hangover, @@ -28184,6 +28262,16 @@ "kxL" = ( /turf/open/floor/iron/dark/small, /area/station/hallway/secondary/entry) +"kxR" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Command Storeroom" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/turf/open/floor/plating, +/area/station/maintenance/department/bridge) "kxX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -28480,24 +28568,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"kDl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage"; - name = "trash belt" - }, -/obj/machinery/recycler{ - dir = 1; - eat_dir = 2 - }, -/turf/open/floor/plating, -/area/station/service/janitor) "kDq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -28936,15 +29006,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kJZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/hallway/abandoned_command) "kKa" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -29061,6 +29122,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"kMU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "kMW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29525,6 +29592,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"kVD" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/window/reinforced/tram/directional/east, +/obj/structure/chair/comfy/shuttle, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "kWd" = ( /obj/machinery/door/airlock{ name = "Room 2" @@ -29572,14 +29648,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"kXe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/obj/machinery/camera/autoname/directional/north, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "kXl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -30332,11 +30400,6 @@ /obj/item/pickaxe, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) -"lib" = ( -/obj/structure/chair/sofa/bench, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "liG" = ( /obj/structure/cable, /obj/structure/table/glass, @@ -30485,6 +30548,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"lly" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/north, +/obj/structure/chair/sofa/bench/left, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "llC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -30552,6 +30624,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/carpet/donk, /area/station/command/heads_quarters/qm) +"lmk" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/chair/comfy/shuttle, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "lmv" = ( /obj/structure/disposalpipe/segment, /obj/item/kirbyplants/random, @@ -30600,17 +30681,6 @@ /obj/structure/ore_box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"lnU" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "lnZ" = ( /obj/effect/turf_decal/tile/dark_red, /obj/effect/decal/cleanable/dirt, @@ -30665,6 +30735,11 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/space/basic, /area/space/nearstation) +"lpv" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/bar, +/turf/open/floor/catwalk_floor/iron, +/area/station/service/bar) "lpC" = ( /turf/open/floor/plating, /area/station/service/chapel/funeral) @@ -30785,6 +30860,16 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"lrC" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "lrE" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -31363,17 +31448,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/detective, /turf/open/floor/iron/textured_half, /area/station/security/detectives_office) -"lBO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor/iron, -/area/station/engineering/storage/tech) "lCg" = ( /obj/structure/chair{ dir = 4 @@ -31445,6 +31519,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"lDq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/iron, +/area/station/hallway/secondary/dock) "lDx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31557,15 +31637,6 @@ /obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"lGA" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/general, -/obj/machinery/door/airlock/command/glass{ - name = "Command Hallway" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/hallway/secondary/command) "lGK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31871,17 +31942,6 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"lLu" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/right/directional/west, -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "lLv" = ( /turf/open/floor/wood, /area/station/maintenance/fore/greater) @@ -32467,6 +32527,17 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/smooth, /area/station/security/evidence) +"lVe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/pink/visible{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "lVl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/south, @@ -32963,20 +33034,12 @@ /obj/effect/landmark/start/medical_doctor, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"mcQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) +"mcR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/service/theater) "mda" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -33122,16 +33185,6 @@ /obj/machinery/recharger, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs) -"mgk" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/structure/chair/sofa/bench/right, -/obj/machinery/light/small/directional/west, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, @@ -33448,6 +33501,16 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) +"mmD" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/security/tram) "mmE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33558,22 +33621,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"mpc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Development Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/lobby) "mpk" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/green, @@ -33833,16 +33880,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/wood/tile, /area/station/command/meeting_room) -"mvb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/command/glass, -/obj/effect/mapping_helpers/airlock/access/any/command/hop, -/obj/machinery/door/firedoor, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/dark/textured_half, -/area/station/command/heads_quarters/hop) "mvh" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/holopad, @@ -34198,6 +34235,13 @@ /obj/item/instrument/eguitar, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"mBx" = ( +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/security/execution/transfer) "mBC" = ( /obj/structure/sign/poster/official/soft_cap_pop_art/directional/north, /turf/open/floor/iron/grimy, @@ -34896,6 +34940,16 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"mNq" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "mNu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line, @@ -35077,12 +35131,6 @@ dir = 8 }, /area/station/command/heads_quarters/hos) -"mRj" = ( -/obj/structure/chair/sofa/bench/right, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron, -/area/station/security/tram) "mRl" = ( /obj/machinery/door/airlock/engineering{ name = "Smoke Room" @@ -35423,6 +35471,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"mYC" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/small, +/area/station/engineering/atmos) "mYP" = ( /obj/structure/table, /obj/item/storage/bag/tray/cafeteria{ @@ -35801,15 +35854,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) -"nfO" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) "nfS" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/carpet/orange, @@ -36632,13 +36676,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"nxc" = ( -/obj/structure/closet/secure_closet/security/med, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/turf/open/floor/iron/checker{ - dir = 1 - }, -/area/station/security/execution/transfer) "nxo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36938,6 +36975,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) +"nBt" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Air to Pure" + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "nBw" = ( /obj/effect/turf_decal/siding/thinplating_new, /turf/open/floor/iron/dark/herringbone, @@ -36979,6 +37031,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"nBR" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/window/reinforced/tram/directional/east, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "nCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/office{ @@ -37309,6 +37372,14 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"nHT" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/door/airlock/command/glass{ + name = "Command Hallway" + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/hallway/secondary/command) "nId" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) @@ -37461,6 +37532,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"nMo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "nMA" = ( /obj/machinery/door/airlock{ name = "Construction Maintenance" @@ -38058,16 +38136,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/science/cytology) -"nXL" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/left/directional/south, -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "nXP" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -38253,14 +38321,6 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"obW" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/mid/directional/west, -/obj/structure/industrial_lift/tram/white, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "ocb" = ( /turf/open/floor/iron/white/small, /area/station/science/cubicle) @@ -38641,14 +38701,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) -"oio" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "ois" = ( /obj/effect/turf_decal/siding/white{ dir = 6 @@ -39184,6 +39236,10 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_half, /area/station/engineering/atmos) +"osV" = ( +/obj/effect/landmark/navigate_destination/vault, +/turf/open/floor/glass, +/area/station/hallway/secondary/spacebridge) "osY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/broken_flooring/corner/directional/south, @@ -39535,16 +39591,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron, /area/station/security/lockers) -"oAu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/engineering/supermatter/room) "oAA" = ( /obj/structure/closet/emcloset, /obj/effect/mapping_helpers/broken_floor, @@ -39831,6 +39877,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"oFW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/techstorage, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "oGk" = ( /turf/open/floor/circuit, /area/station/tcommsat/server) @@ -39932,6 +39988,17 @@ dir = 1 }, /area/station/security/execution/transfer) +"oIj" = ( +/obj/structure/cable, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft) "oIk" = ( /obj/structure/table, /turf/open/floor/iron, @@ -40044,6 +40111,19 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/textured_half, /area/station/security/warden) +"oKB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/command/glass{ + name = "E.V.A. Storage" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/command/eva, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/station/ai_monitored/command/storage/eva) "oKP" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -40526,17 +40606,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"oSY" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "oTj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"oTm" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "oTo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40764,6 +40848,11 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"oXg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "oXs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/emcloset, @@ -41336,6 +41425,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"piD" = ( +/obj/structure/chair/sofa/bench/right, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/incident_display/tram/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "piG" = ( /obj/effect/turf_decal/siding/green{ dir = 8 @@ -41520,6 +41616,25 @@ }, /turf/open/floor/wood/tile, /area/station/service/lawoffice) +"plW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) "plZ" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -41819,16 +41934,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"pqI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pqK" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/south, @@ -42063,10 +42168,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/grimy, /area/station/service/library) -"puT" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/wood/tile, -/area/station/service/bar) "pvg" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -42530,6 +42631,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) +"pBC" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "pBD" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -42949,6 +43055,14 @@ }, /turf/open/floor/plating, /area/station/command/bridge) +"pIT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/navigate_destination/aiupload, +/turf/open/floor/iron/white, +/area/station/hallway/primary/starboard) "pJg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43570,6 +43684,18 @@ /obj/structure/bookcase/random, /turf/open/floor/iron/grimy, /area/station/service/library) +"pST" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/plating, +/area/station/maintenance/port/lesser) "pTc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43894,18 +44020,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) -"pXg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/reinforced/titaniumglass, -/obj/machinery/light/directional/north, -/obj/item/analyzer, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/maintenance/disposal/incinerator) "pXo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44402,15 +44516,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, /area/station/service/library) -"qfQ" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "qfV" = ( /obj/machinery/vending/tool, /obj/structure/sign/poster/official/random/directional/south, @@ -44720,6 +44825,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"qjm" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/hallway/secondary/exit/departure_lounge) "qjn" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table, @@ -46349,15 +46463,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"qLl" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/window/reinforced/tram/right/directional/east, -/obj/structure/chair/comfy/shuttle, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "qLq" = ( /obj/machinery/recharge_station, /obj/machinery/button/door/directional/west{ @@ -46665,6 +46770,12 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/small, /area/station/security/prison/shower) +"qRz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/pile/directional/east, +/obj/effect/landmark/navigate_destination/dockescpod, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) "qRB" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement{ @@ -47012,6 +47123,26 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/medical/psychology) +"qWp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/research) "qWF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47108,6 +47239,11 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"qXN" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/landmark/navigate_destination/med, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "qXQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, @@ -47972,6 +48108,17 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/station/cargo/boutique) +"rmS" = ( +/obj/machinery/incident_display/delam/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/engineering/supermatter/room) "rmX" = ( /obj/structure/table, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -48290,15 +48437,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"rrF" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "rrH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48825,6 +48963,16 @@ dir = 1 }, /area/station/hallway/secondary/entry) +"rzL" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/incident_display/tram/directional/north, +/turf/open/floor/iron, +/area/station/maintenance/department/medical/central) "rAb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48838,15 +48986,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"rAj" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/medical/central) "rAn" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/bot, @@ -49373,11 +49512,6 @@ }, /turf/open/floor/carpet/blue, /area/station/cargo/boutique) -"rHP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/dock) "rHQ" = ( /obj/machinery/deepfryer, /turf/open/floor/iron/cafeteria, @@ -49563,15 +49697,6 @@ /obj/machinery/door/poddoor/incinerator_ordmix, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"rLv" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/south, -/obj/structure/chair/sofa/bench/right{ - dir = 1 - }, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "rLw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50223,6 +50348,14 @@ /obj/item/clothing/head/costume/griffin, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) +"rWu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Commons" + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/textured_half, +/area/station/commons) "rWA" = ( /obj/structure/disposalpipe/segment, /obj/structure/broken_flooring/pile/directional/east, @@ -50248,6 +50381,12 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"rWQ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/layer_manifold/brown/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) "rWW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50704,6 +50843,17 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"seX" = ( +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/turf/open/floor/iron/white/small, +/area/station/medical/medbay/central) "sfb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, @@ -51847,16 +51997,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"swN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "swO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -52103,15 +52243,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"sBa" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/industrial_lift/tram/white, -/obj/structure/window/reinforced/tram/mid/directional/north, -/obj/structure/chair/sofa/bench/left, -/turf/open/floor/noslip/tram_platform, -/area/station/maintenance/port/aft) "sBp" = ( /obj/structure/table, /obj/machinery/processor{ @@ -53091,6 +53222,16 @@ /obj/structure/table_frame, /turf/open/floor/iron, /area/station/cargo/sorting) +"sSL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/gateway, +/turf/open/floor/iron, +/area/station/maintenance/hallway/abandoned_command) "sSQ" = ( /turf/closed/wall, /area/station/maintenance/department/medical/central) @@ -53185,10 +53326,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) -"sTl" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/cafeteria) "sTp" = ( /turf/closed/wall, /area/station/service/cafeteria) @@ -53318,11 +53455,6 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"sWj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/theater) "sWm" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -53587,17 +53719,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, /area/station/security/courtroom) -"tah" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft) "tat" = ( /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/tile/dark_red/fourcorners, @@ -53926,6 +54047,19 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"tfN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore/lesser) "tgj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/easel, @@ -54246,19 +54380,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"tob" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering{ - name = "Auxillary Base Construction" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/construction/mining/aux_base) "tod" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -54272,18 +54393,6 @@ "tof" = ( /turf/closed/wall/rust, /area/station/ai_monitored/turret_protected/ai) -"ton" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "toA" = ( /turf/open/floor/iron, /area/station/hallway/secondary/recreation) @@ -55338,18 +55447,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"tFg" = ( -/obj/structure/disposalpipe/sorting/mail{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "tFn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55414,20 +55511,6 @@ "tFQ" = ( /turf/closed/wall, /area/station/medical/medbay/central) -"tFS" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/research{ - name = "Development Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/lobby) "tFX" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -55485,6 +55568,20 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor/flat_white, /area/station/service/kitchen/coldroom) +"tHu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/vault{ + name = "Vault" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/catwalk_floor, +/area/station/ai_monitored/command/nuke_storage) "tHK" = ( /turf/closed/wall, /area/station/security/prison/shower) @@ -56201,6 +56298,11 @@ dir = 1 }, /area/station/hallway/primary/starboard) +"tUk" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/landmark/navigate_destination/bridge, +/turf/open/floor/iron/smooth_half, +/area/station/hallway/primary/central/fore) "tUo" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -56628,18 +56730,6 @@ dir = 1 }, /area/station/hallway/primary/central/fore) -"ubU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/lesser) "uch" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -57034,12 +57124,6 @@ /obj/effect/landmark/start/clown, /turf/open/floor/stone, /area/station/service/theater) -"uhI" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/hallway/primary/starboard) "uhN" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/decal/cleanable/dirt, @@ -57719,18 +57803,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/secondary/spacebridge) -"usB" = ( -/obj/effect/turf_decal/delivery/red, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay" - }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/white/small, -/area/station/medical/medbay/central) "usF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/easel, @@ -57738,16 +57810,6 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/sepia, /area/station/maintenance/aft) -"usI" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/dark_red/opposingcorners, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/security/tram) "usJ" = ( /turf/open/floor/iron/kitchen/small, /area/station/maintenance/aft) @@ -58475,6 +58537,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"uFL" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/left{ + dir = 1 + }, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "uFQ" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/south, @@ -59120,6 +59191,13 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"uQG" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/chapel, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "uQK" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -59207,6 +59285,23 @@ /obj/machinery/skill_station, /turf/open/floor/wood/parquet, /area/station/service/library) +"uSh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/research{ + name = "Development Division Access" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white/textured_half{ + dir = 1 + }, +/area/station/science/lobby) "uSi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59404,16 +59499,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics) -"uUV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/dark_red/half/contrasted, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron, -/area/station/security) "uVb" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -60165,15 +60250,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"vie" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced/tram/left/directional/west, -/obj/structure/chair/comfy/shuttle, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "vij" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -60336,6 +60412,17 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/service/hydroponics/garden/monastery) +"vkE" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vkG" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -61542,6 +61629,17 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) +"vDj" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/window/reinforced/tram/directional/west, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/industrial_lift/tram, +/turf/open/floor/noslip/tram_platform, +/area/station/security/tram) "vDB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64509,23 +64607,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"wwZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/research) "wxd" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -64626,6 +64707,15 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/break_room) +"wyR" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/brown{ + dir = 5 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/smooth, +/area/station/command/bridge) "wyY" = ( /obj/structure/disposalpipe/segment, /obj/structure/table/wood, @@ -64802,20 +64892,6 @@ /obj/machinery/flasher/directional/east, /turf/open/floor/iron/half, /area/station/hallway/primary/central/fore) -"wCu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/textured_half{ - dir = 1 - }, -/area/station/science/research) "wCx" = ( /obj/effect/turf_decal/siding/green{ dir = 8 @@ -65619,6 +65695,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"wOZ" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos) "wPd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) @@ -66280,6 +66366,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"wYt" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/chemfactory, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "wYv" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -66487,16 +66584,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"xaA" = ( -/obj/effect/landmark/navigate_destination, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/hallway/secondary/exit/departure_lounge) "xaC" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -66705,6 +66792,12 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"xdY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/navigate_destination/det, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "xen" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -67709,17 +67802,6 @@ dir = 1 }, /area/station/command/bridge) -"xqx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/structure/window/reinforced/tram/mid/directional/east, -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/industrial_lift/tram, -/turf/open/floor/noslip/tram_platform, -/area/station/security/tram) "xqC" = ( /turf/closed/wall, /area/station/maintenance/hallway/abandoned_command) @@ -68072,6 +68154,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"xvi" = ( +/obj/machinery/door/airlock/hatch, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/station/maintenance/department/engine) "xvl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68161,6 +68253,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison/work) +"xwV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/cargo, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "xxa" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_burn_chamber_input, /turf/open/floor/engine/vacuum, @@ -68930,16 +69033,6 @@ }, /turf/open/floor/iron/terracotta/small, /area/station/security/checkpoint/escape) -"xHl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "xHm" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -69392,6 +69485,16 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"xNL" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/janitor, +/turf/open/floor/iron, +/area/station/commons/dorms) "xNS" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -69439,6 +69542,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"xOn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_red/half/contrasted, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "xOw" = ( /obj/structure/bed{ dir = 4 @@ -69628,6 +69740,15 @@ "xQr" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) +"xQt" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/industrial_lift/tram/white, +/obj/structure/window/reinforced/tram/directional/south, +/obj/structure/chair/sofa/bench/right{ + dir = 1 + }, +/turf/open/floor/noslip/tram_platform, +/area/station/maintenance/port/aft) "xQw" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -69776,6 +69897,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) +"xSm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/library, +/turf/open/floor/wood/parquet, +/area/station/service/library) "xSp" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -69804,6 +69931,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/hallway/primary/starboard) +"xSL" = ( +/obj/structure/table, +/obj/item/storage/box/prisoner{ + pixel_y = 6 + }, +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/tile/dark_red/opposingcorners, +/obj/machinery/incident_display/tram/directional/north, +/turf/open/floor/iron, +/area/station/security/tram) "xSO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -70037,13 +70174,6 @@ }, /turf/open/floor/plating/rust, /area/station/maintenance/department/engine) -"xVz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Commons" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/commons) "xVG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -81233,7 +81363,7 @@ fyv vFD vZW rCv -xaA +qjm reM xKi reM @@ -81483,7 +81613,7 @@ snZ mni rQS rQS -rQS +fIh rQS rQS dBH @@ -81654,7 +81784,7 @@ cwg xZV xZV xYG -oAu +rmS tod vFW aAt @@ -82431,7 +82561,7 @@ coA hzi bEG leh -dsr +eAH aVj bJL iQv @@ -82541,7 +82671,7 @@ vFy vGU rOG hbm -nth +gRV vSW fEC vmL @@ -83225,7 +83355,7 @@ ddj dvb cwf eop -eGt +pBC fcD fta xae @@ -83474,7 +83604,7 @@ dvR dIe dRE ecF -cIe +lVe hjT ioQ eQe @@ -83717,7 +83847,7 @@ aBs aKG omJ yjE -aWE +xvi yjE bUk yfa @@ -83737,7 +83867,7 @@ ieu eQi fbq dxP -dTu +kMU eoY xae xae @@ -84767,7 +84897,7 @@ dfB dAl dUT epq -dTu +kMU ffs eGt fHQ @@ -85112,7 +85242,7 @@ ftm uxD qVP nGA -ubU +pST iSK aVX tTg @@ -85339,7 +85469,7 @@ xRZ wAZ wXk xgN -oSY +uQG kar vnr vIh @@ -85381,10 +85511,10 @@ rBE lzM aFR hYz -vie -obW -obW -lLu +lmk +cFf +cFf +vDj jUN aFR kGC @@ -85869,7 +85999,7 @@ qVP hiq lUV gEH -uUV +ijo iWE tAs tAs @@ -85895,10 +86025,10 @@ ckH lzM aFR ryj -qLl +kVD cID cID -xqx +nBR gXd aFR kGC @@ -86052,7 +86182,7 @@ djj dBi dWI eqX -dTu +kMU fjK eGt fMN @@ -86294,9 +86424,9 @@ dzT bpm dWp ybO -dcp +ijf tly -eVb +mYC lPf fNk glB @@ -86434,7 +86564,7 @@ dDB dDB rtQ rtQ -gDV +xSL vKG nne oKy @@ -86656,7 +86786,7 @@ yjr aTq wuc trp -bGs +vkE trp trp wuc @@ -86691,7 +86821,7 @@ blb blb blb rtQ -usI +mmD pzA abJ vKG @@ -86921,7 +87051,7 @@ wuc pvh lQG lzM -mRj +eze uMu ulI lzM @@ -87079,7 +87209,7 @@ eTL eTL fnp dXK -eru +nBt hYC fjS xae @@ -87336,8 +87466,8 @@ cUd dkW fnp dXT -esc -eJp +wOZ +rWQ vpl tJO fNA @@ -87485,7 +87615,7 @@ wpy xXV tYq pZm -nxc +mBx wjZ eaT pDu @@ -87594,7 +87724,7 @@ dll fpk fAZ fHn -eKT +cwf flg ftZ fOn @@ -87880,12 +88010,12 @@ sjq sjq syx jIh -ton +cuN jhs kso kHH kYG -lnU +hRO lJY uSM naE @@ -87909,7 +88039,7 @@ jAe yfC wWT jjS -xOS +xdY lBN vOP ixl @@ -88348,8 +88478,8 @@ sZu bKu cpt yjE -pXg -bAk +gDD +awK dOq dOq jcF @@ -88477,9 +88607,9 @@ wyA xul pND trp -mgk +bRi qOv -gem +jqe vJH xAR trp @@ -88607,7 +88737,7 @@ dAS yjE mfK iHy -eyo +hVC dmw hDX dyG @@ -88730,13 +88860,13 @@ ujr rKv dYp trp -fDz +piD xul knJ fAr -sBa +lly qOv -rLv +xQt vJH xAR trp @@ -88765,7 +88895,7 @@ wbf prq mTP qPN -kXe +xOn ccs kPk wjZ @@ -88864,9 +88994,9 @@ tWj cAh cLn blb -blb +lrC fPb -fas +kht dzl fQN wBo @@ -88880,7 +89010,7 @@ qbB fBe fIg eLL -fod +czb ffs eGt gjT @@ -88987,13 +89117,13 @@ etx fwS ePg trp -lib +jjN knJ xul mxM iaZ cSD -chF +brV vJH xAR trp @@ -89244,13 +89374,13 @@ kIn sgT oRP trp -aqV +iCH knJ nFu mxM gTk jMv -chF +brV vJH xAR trp @@ -89505,9 +89635,9 @@ mPv bbU knJ fAr -dDW +ejm qOv -qfQ +uFL vJH xAR trp @@ -89706,7 +89836,7 @@ sel rDy uWB yeu -tFg +bFS tXT wHE qnz @@ -89762,9 +89892,9 @@ vUf vAU caE trp -eYQ +bWq qOv -nXL +oTm vJH xAR trp @@ -89966,7 +90096,7 @@ pxl wXO xjh alh -oio +kiw tJz vLC rJH @@ -90158,7 +90288,7 @@ yjE vxt hOy eUi -eKY +akB eUi feq dIt @@ -90183,7 +90313,7 @@ gKU gRe iCw jDP -hnr +plW hvy mXB xRV @@ -90192,7 +90322,7 @@ xRV xRV smV lCg -pqI +xwV jXk xRV vKR @@ -90929,7 +91059,7 @@ smo vxt gUS sne -cPj +jUQ cXP msg fRG @@ -90955,7 +91085,7 @@ inR toU hhi jax -hvz +iQs xnQ nTa tlt @@ -91212,7 +91342,7 @@ inU iCN lYj mmw -hwg +oKB hCr tsF xRV @@ -91243,7 +91373,7 @@ efC efC vpN oTo -vpN +lpv vpN vkh vkh @@ -91751,7 +91881,7 @@ paV wLJ oXe jVM -puT +egq ycS tEI ycS @@ -92462,7 +92592,7 @@ qin bst hyD kpz -tnx +nMo sRP yjE yjE @@ -92770,7 +92900,7 @@ uIv okp qfF wuw -wuw +xSm pNa qfF xAq @@ -93277,8 +93407,8 @@ iLC iLC jts wzK -mvb -djR +jKG +eTH kuE wQB xeO @@ -94331,7 +94461,7 @@ rIg prQ uXb sSr -wEp +boB wYV xli blb @@ -94807,7 +94937,7 @@ gFv uFm cKV xsh -hcJ +bdg xGJ oTF jwi @@ -94819,7 +94949,7 @@ izD uAY izL uAY -jYW +kxR vrn oGJ wVZ @@ -95625,11 +95755,11 @@ qtl qTM vHL ozd -qTM +osV xbP rUB rUB -eLY +tHu xcv nBw ghQ @@ -95831,7 +95961,7 @@ dDB dDB dDB ycC -gHn +jNz mPJ mPJ ipD @@ -95848,7 +95978,7 @@ opn jwa opn jYY -tSe +cId oGJ wQB xeO @@ -96088,7 +96218,7 @@ dDB dDB dDB ycC -gHG +dfL mQz noq iqp @@ -96345,7 +96475,7 @@ blb blb ycC ycC -gHJ +wyR kHi gLM iqF @@ -96386,7 +96516,7 @@ ril vVw vFv vVw -sTl +aRa wEp tIL tYX @@ -96849,7 +96979,7 @@ fKc eVz fTe xvT -fWH +jqM xvT gfs gwS @@ -97130,8 +97260,8 @@ koD oUd iNV oUd -lGA -jNZ +nHT +tUk mzM tWL kyZ @@ -97877,7 +98007,7 @@ eBN fQY fTh xvT -fZw +dKo xvT gfs jEZ @@ -97928,7 +98058,7 @@ wLA rNA siP sEK -sWj +mcR tqK tIL tYX @@ -98497,7 +98627,7 @@ xXG wgL hcv sSQ -rAj +rzL uOw eBQ qDD @@ -99427,7 +99557,7 @@ kIj kxX kIj kIj -jPO +tfN eDN gcz gcz @@ -100819,7 +100949,7 @@ qNj qNj kVb sSQ -gPQ +dGT sSQ sSQ sSQ @@ -101028,8 +101158,8 @@ xSp dUC qTK vnF -pRQ -usB +qXN +seX vsx xZY tFQ @@ -101511,7 +101641,7 @@ dYG gzx wRL qIv -qIv +jBs qZq qIv oEi @@ -101528,7 +101658,7 @@ vrY vrY sXq wGu -nhZ +bWL xoa uCp yeh @@ -102847,7 +102977,7 @@ rAt nzc rQF lIh -swN +wYt xuD ckV tAS @@ -103030,7 +103160,7 @@ aJq aJq xqC gMK -itq +sSL oAC rZu uPt @@ -103303,7 +103433,7 @@ mhu nJH kkD kjh -kJZ +gaW ons lyj lOa @@ -104080,7 +104210,7 @@ lyp pij pwz pWX -nfO +xNL qIv nOf rsv @@ -104367,7 +104497,7 @@ pDU qcQ nSA pDU -jOk +oFW pDU koz qcQ @@ -104624,7 +104754,7 @@ ldq oom ssz yeP -lBO +sYt yeP yeP iPF @@ -104844,7 +104974,7 @@ sIA jPq kaF roB -kDl +bJE roB lde sRL @@ -104925,7 +105055,7 @@ cmz hOR sSQ yhv -myW +qRz tVc jtK shL @@ -106395,7 +106525,7 @@ dSl wXt qkF wXt -xVz +rWu toA rvy fQi @@ -106719,7 +106849,7 @@ vbR vbR vbR vbR -vbR +bow vbR ykn vbR @@ -107433,7 +107563,7 @@ gle qfo qvM uFJ -rrF +fJw toA ssj waT @@ -109494,7 +109624,7 @@ wPd ssF vmn pqm -xqW +pqm tOZ ugC xPY @@ -109751,7 +109881,7 @@ bjL vMt vCl vMt -xqW +pqm tPm fTM bAs @@ -110008,10 +110138,10 @@ rVj vMt sJw lup -eBx +hiA xRg xuu -bSW +pIT wQP xPv uSi @@ -110265,7 +110395,7 @@ xOM vMt tQQ vMt -xqW +pqm eDz fTM xRB @@ -110522,7 +110652,7 @@ wPd mzo sJF pqm -xqW +pqm tOZ alb qzn @@ -110821,7 +110951,7 @@ jFh tuT kTw kOV -tob +dBN kTw kTw hLU @@ -111809,7 +111939,7 @@ wbu tbD tyA tTx -uhI +fzo xSZ vbA vAK @@ -112337,7 +112467,7 @@ rUI xDg wtT pWl -mpc +uSh phZ wbp wMH @@ -112631,7 +112761,7 @@ svs svs grm svs -bab +jsY svs grm svs @@ -112851,7 +112981,7 @@ qEe sRj jkz ifU -tFS +iPo cAb xjb pAF @@ -113093,9 +113223,9 @@ dDF vkn vMC xFA -wCu +aHy xFA -wwZ +qWp xFA mdt mdt @@ -114173,7 +114303,7 @@ svs svs grm svs -bab +jsY svs grm svs @@ -115702,7 +115832,7 @@ gky lrh gky vbm -tah +oIj xEc gky niZ @@ -117994,7 +118124,7 @@ xok xok qID iHM -cph +kpE lDc oAc joj @@ -118743,7 +118873,7 @@ urm vbj xok dex -fWJ +oXg qNO xaN vhC @@ -119533,7 +119663,7 @@ xok xok xok bWt -xHl +mNq bCQ qgq ruo @@ -119568,7 +119698,7 @@ svs mWT gyi lwY -rHP +lDq mCf wfk dKA @@ -120308,7 +120438,7 @@ lkV tDM okW kQt -mcQ +ggY hyE xKl vkW diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 8e3837f0ee1..44be376ac4f 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1381,6 +1381,11 @@ /obj/effect/spawner/random/food_or_drink/snack, /turf/open/floor/carpet/black, /area/station/maintenance/port) +"aqb" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/engine_access, +/turf/open/floor/engine, +/area/station/engineering/supermatter) "aqc" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -3930,6 +3935,11 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"aWt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, +/obj/machinery/incident_display/delam/directional/south, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "aWu" = ( /obj/structure/cable, /obj/machinery/door/poddoor/preopen{ @@ -8141,23 +8151,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"bVI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Fore"; - name = "engineering camera" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "bVJ" = ( /obj/machinery/camera/directional/north{ c_tag = "Central Hallway - Center"; @@ -11529,6 +11522,26 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/storage) +"cNk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron, +/area/station/science/research) "cNp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -15080,15 +15093,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"dKp" = ( -/obj/machinery/rnd/production/protolathe/department/science, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/sign/departments/science/alt/directional/east, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/iron, -/area/station/science/lab) "dKs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18064,6 +18068,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"eyb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "eyr" = ( /obj/item/kirbyplants/random, /obj/machinery/power/apc/auto_name/directional/north, @@ -19161,13 +19172,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/medical/virology) -"eNt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "eNB" = ( /obj/effect/turf_decal/siding/green{ dir = 8 @@ -20104,19 +20108,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"eYu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "eYy" = ( /obj/structure/cable, /obj/structure/closet/secure_closet/atmospherics, @@ -20735,14 +20726,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"ffN" = ( -/obj/structure/sign/poster/random/directional/south, -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "ffP" = ( /obj/item/radio/intercom/directional/east, /obj/item/kirbyplants/random, @@ -25802,16 +25785,6 @@ /obj/item/toy/cards/deck, /turf/open/floor/iron/grimy, /area/station/service/abandoned_gambling_den) -"gtA" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "gtG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -26382,6 +26355,16 @@ "gAw" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"gAx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "gAE" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple{ @@ -29120,6 +29103,22 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"hlb" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/storage/box/coffeepack{ + pixel_x = -13; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/engineering/break_room) "hlj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad, @@ -30592,6 +30591,23 @@ dir = 1 }, /area/station/medical/morgue) +"hFR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sci-entrance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron, +/area/station/science/research) "hFS" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -35121,6 +35137,15 @@ }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"iMG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/east, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "iMH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -36719,6 +36744,19 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"jgg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "jgl" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ @@ -39130,6 +39168,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/cargo/lobby) +"jJX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Fore"; + name = "engineering camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "jKb" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -40562,13 +40616,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) -"kbQ" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/bot, -/obj/structure/sign/clock/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "kbT" = ( /obj/machinery/camera/directional/south{ c_tag = "Central Hallway - Center Port"; @@ -42902,6 +42949,13 @@ /obj/item/pen, /turf/open/floor/iron, /area/station/service/hydroponics) +"kGu" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "kGA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, @@ -45108,13 +45162,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"ljO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "ljP" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -47900,6 +47947,17 @@ "lTv" = ( /turf/closed/wall, /area/station/security/prison/safe) +"lTw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) "lTx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -49167,23 +49225,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/main) -"mnh" = ( -/obj/structure/table/reinforced, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/storage/box/coffeepack{ - pixel_x = -13; - pixel_y = 7 - }, -/turf/open/floor/wood, -/area/station/engineering/break_room) "mnz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -50135,18 +50176,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"mzO" = ( -/obj/structure/table/reinforced, -/obj/machinery/newscaster/directional/north, -/obj/item/clipboard, -/obj/item/toy/figure/engineer{ - pixel_x = -6 - }, -/obj/item/toy/figure/atmos{ - pixel_x = 6 - }, -/turf/open/floor/wood, -/area/station/engineering/break_room) "mzV" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/bot, @@ -59879,6 +59908,15 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"pdE" = ( +/obj/structure/sign/poster/random/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/commons/lounge) "pdF" = ( /obj/structure/closet/crate/preopen, /obj/structure/sign/nanotrasen{ @@ -65403,26 +65441,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"qsI" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/right/directional/west{ - name = "Supply Storage"; - req_access = list("medical") - }, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/gun/syringe, -/obj/item/gun/syringe, -/obj/structure/table/reinforced, -/obj/structure/sign/clock/directional/east, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/medical/storage) "qsN" = ( /obj/structure/chair{ dir = 4 @@ -68933,6 +68951,25 @@ /obj/structure/sign/poster/contraband/free_drone/directional/north, /turf/open/floor/iron, /area/station/science/research/abandoned) +"rmR" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/window/right/directional/west{ + name = "Supply Storage"; + req_access = list("medical") + }, +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/gun/syringe, +/obj/item/gun/syringe, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/storage) "rmV" = ( /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/bot, @@ -73912,6 +73949,18 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) +"sAM" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/toy/figure/engineer{ + pixel_x = -6 + }, +/obj/item/toy/figure/atmos{ + pixel_x = 6 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/wood, +/area/station/engineering/break_room) "sAU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -76861,12 +76910,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"tou" = ( -/obj/structure/sign/delamination_counter/directional/west, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/engine_access, -/turf/open/floor/engine, -/area/station/engineering/supermatter) "toy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -79873,14 +79916,6 @@ }, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"tYY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/east, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "tZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80193,25 +80228,6 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/large, /area/station/security/processing) -"ucM" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/science/research) "ucW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -81383,22 +81399,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"usV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research) "utj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -81623,6 +81623,17 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical/medsci) +"uwB" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/medical/storage) "uwJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83855,6 +83866,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"uYZ" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/obj/item/kirbyplants/random, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/station/commons/dorms) "uZf" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/flora/bush/lavendergrass, @@ -84858,6 +84877,15 @@ "vmt" = ( /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) +"vmE" = ( +/obj/machinery/rnd/production/protolathe/department/science, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/sign/departments/science/alt/directional/east, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/science/lab) "vmK" = ( /obj/effect/turf_decal/siding/yellow, /obj/structure/table, @@ -85420,6 +85448,17 @@ /obj/structure/chair/office, /turf/open/floor/carpet/orange, /area/station/commons/dorms) +"vtG" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "vtM" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -85482,14 +85521,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"vuy" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/item/kirbyplants/random, -/obj/structure/sign/clock/directional/north, -/turf/open/floor/wood, -/area/station/commons/dorms) "vuG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86828,14 +86859,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vKY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) "vLd" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/secure_closet/brig{ @@ -90010,15 +90033,6 @@ }, /turf/open/floor/plating, /area/station/command/bridge) -"wyJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/delamination_counter/directional/north, -/turf/open/floor/iron, -/area/station/engineering/break_room) "wyN" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 10 @@ -95708,6 +95722,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) +"xXE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/break_room) "xXI" = ( /obj/structure/table/reinforced, /obj/item/storage/box/bodybags{ @@ -116968,7 +116991,7 @@ glb dRK wcP yeO -nbZ +aWt nCi kmS fCk @@ -117226,7 +117249,7 @@ vrs qJI iQV nbZ -akM +nCi cOx uGn axu @@ -118759,7 +118782,7 @@ eHy qJs cxp sHT -tou +aqb tsa bPI sHT @@ -119013,7 +119036,7 @@ lkN cwp ubM gAw -eNt +eyb ehD sHT sHT @@ -119247,7 +119270,7 @@ tsB sch cKK vQj -mzO +sAM agA hHJ tgl @@ -119270,7 +119293,7 @@ jZV jZV gAw gAw -ljO +qJs okr bWa nrP @@ -119504,7 +119527,7 @@ lKe nZW qAz vQj -mnh +hlb agA uzb jLx @@ -120021,7 +120044,7 @@ vQj uCa uCa leE -wyJ +xXE kyW jzU bAR @@ -120298,7 +120321,7 @@ kGe kGe gtj gAw -tYY +iMG mTo pjN ckC @@ -121833,7 +121856,7 @@ wxd iBR iBR tqo -eYu +lTw bfX cui maI @@ -122089,8 +122112,8 @@ elK jyz xbD kgP -lDV -bVI +tqo +jJX vvH oks fSG @@ -123118,7 +123141,7 @@ slp slp slp bJI -vKY +vtG mgk cui kpD @@ -129829,11 +129852,11 @@ mUt utj tQt xaS -ucM +cNk qAG kzT alT -ucM +cNk tWa kSR pba @@ -130343,11 +130366,11 @@ oPE flF oqJ saz -usV +hFR nHB mHq qLE -usV +hFR eAO ban jqx @@ -132046,7 +132069,7 @@ aaa aaa aaa sjt -kEn +gAx kJd wTn sjt @@ -132657,7 +132680,7 @@ pXk hXQ lfz fvi -dKp +vmE qvK jFP veR @@ -133364,7 +133387,7 @@ pri qkA nWI rbk -ffN +pdE vnU bTy eex @@ -138071,8 +138094,8 @@ ako nFO tqw pIR -qsI -gtA +rmR +uwB ako ako gMX @@ -142662,7 +142685,7 @@ cBN tXa nXo iVq -lRk +jgg crR iee iYi @@ -144979,7 +145002,7 @@ oOx nVB xCF mgX -kbQ +kGu oCP tTM nMG @@ -147551,7 +147574,7 @@ vbH gYS lQt oCP -vuy +uYZ obO nNq aRZ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index b94b8c84c7f..0836135ea3d 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -688,16 +688,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"anI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "anK" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -1249,6 +1239,13 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining_station, /turf/open/floor/plating, /area/mine/eva) +"auC" = ( +/obj/machinery/suit_storage_unit/ce, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/white/textured, +/area/station/command/heads_quarters/ce) "auJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -7728,6 +7725,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"csF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "csR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -16475,6 +16480,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"feW" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white, +/area/station/science/research) "ffe" = ( /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) @@ -18254,6 +18271,16 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/project) +"fKt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/mess) "fKv" = ( /obj/structure/fluff/tram_rail{ pixel_y = 17 @@ -19773,6 +19800,12 @@ /obj/structure/chair, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) +"gjZ" = ( +/obj/effect/turf_decal/siding/white, +/obj/machinery/light/directional/south, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white/smooth_large, +/area/station/service/kitchen/diner) "gka" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) @@ -20346,6 +20379,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/service/kitchen/coldroom) +"gtb" = ( +/obj/machinery/light/directional/north, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/cargo/lobby) "gtc" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -21396,6 +21434,14 @@ /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"gLT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "gLZ" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -24859,17 +24905,6 @@ /obj/item/crowbar, /turf/open/floor/iron, /area/station/command/teleporter) -"hVc" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "hopqueue"; - name = "HoP Queue Shutters" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "hVo" = ( /obj/effect/spawner/random/maintenance, /obj/structure/table, @@ -29672,14 +29707,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"jyh" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "jyz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -45914,6 +45941,10 @@ }, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"oCq" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, +/area/station/command/bridge) "oCs" = ( /obj/structure/table, /obj/item/toy/figure/virologist{ @@ -47577,6 +47608,14 @@ dir = 1 }, /area/station/security/prison) +"peD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "peV" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, @@ -49731,11 +49770,6 @@ dir = 1 }, /area/station/engineering/lobby) -"pNV" = ( -/obj/effect/turf_decal/siding/white, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white/smooth_large, -/area/station/service/kitchen/diner) "pNY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -52178,17 +52212,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"qEZ" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/turf/open/floor/iron/white, -/area/station/science/research) "qFn" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Cabins" @@ -52955,15 +52978,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"qQs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "qQt" = ( /obj/machinery/light/small/directional/west, /turf/open/misc/asteroid/snow/icemoon, @@ -55071,10 +55085,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) -"rzS" = ( -/obj/structure/sign/departments/chemistry/pharmacy/directional/west, -/turf/open/openspace, -/area/station/medical/medbay/lobby) "rAr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56663,6 +56673,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"rZO" = ( +/obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/obj/machinery/digital_clock/directional/south, +/turf/open/openspace, +/area/station/medical/medbay/lobby) "rZR" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/landmark/start/chief_medical_officer, @@ -59173,6 +59188,18 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"sOv" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "hopqueue"; + name = "HoP Queue Shutters" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "sOz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59859,6 +59886,10 @@ /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/station/service/hydroponics) +"tbO" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room) "tbQ" = ( /turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) @@ -63105,6 +63136,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/open/floor/iron/white, /area/station/medical/virology) +"ueG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "ueP" = ( /obj/structure/table, /obj/structure/reagent_dispensers/servingdish, @@ -65617,6 +65657,14 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"uWG" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/security/prison/rec) "uWW" = ( /obj/structure/closet/cardboard, /obj/effect/spawner/random/maintenance, @@ -66445,14 +66493,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"vkz" = ( -/obj/machinery/suit_storage_unit/ce, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/sign/delamination_counter/directional/north, -/turf/open/floor/iron/white/textured, -/area/station/command/heads_quarters/ce) "vkD" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -68011,6 +68051,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) +"vKe" = ( +/obj/machinery/computer/security, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/command/bridge) "vKn" = ( /obj/item/radio/intercom/directional/north, /obj/structure/table/wood, @@ -68259,10 +68305,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/mine/storage) -"vPh" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/cargo/lobby) "vPi" = ( /obj/structure/table/wood, /obj/effect/spawner/random/maintenance/four, @@ -68768,6 +68810,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vXi" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/research{ + name = "Research Division Access" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white, +/area/station/science/research) "vXn" = ( /obj/structure/table, /obj/item/food/pie/cream, @@ -71185,13 +71240,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"wJa" = ( -/obj/machinery/light/warm/directional/north, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 5 - }, -/turf/open/floor/iron/dark/textured, -/area/station/security/prison/rec) "wJd" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -71532,6 +71580,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/security/processing) +"wOj" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) "wOn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -72648,18 +72705,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/engineering/storage_shared) -"xfd" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/research{ - name = "Research Division Access" - }, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/turf/open/floor/iron/white, -/area/station/science/research) "xfn" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -74097,11 +74142,6 @@ "xCl" = ( /turf/open/floor/iron, /area/station/science/robotics/lab) -"xCv" = ( -/obj/machinery/computer/security, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/command/bridge) "xCz" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -74321,15 +74361,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"xFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/sign/delamination_counter/directional/north, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "xFU" = ( /obj/structure/barricade/wooden, /obj/structure/sign/warning/gas_mask/directional/south{ @@ -101687,7 +101718,7 @@ uOb lBR lBR lBR -wJa +uWG jRu kzr khb @@ -103498,7 +103529,7 @@ ldH ldH ldH ldH -fTb +fKt iKw iZs sOT @@ -179609,7 +179640,7 @@ pOJ bIW vLx hkl -jyh +wOj dMS dEB dMS @@ -231025,7 +231056,7 @@ dBZ dBZ wcV rCC -vPh +gtb vQQ vQQ sve @@ -232573,7 +232604,7 @@ rcE rcE rcE rcE -hVc +sOv jII dnq ylU @@ -234351,7 +234382,7 @@ utR pAZ dYP qWZ -xCv +vKe vWL nci tPC @@ -234937,7 +234968,7 @@ wCZ azg azg pJy -qQs +csF ban wdL dso @@ -235441,7 +235472,7 @@ gTK gTK myX sSJ -gka +tbO eEh fab eDC @@ -235452,7 +235483,7 @@ agm fNN esE wuo -cSH +gLT oyz mLV fDn @@ -235709,7 +235740,7 @@ spv dwy spv wuo -xFM +pry kUz mLV gka @@ -236717,7 +236748,7 @@ djO hOc bID qnC -vkz +auC uoF pcg deD @@ -236994,7 +237025,7 @@ esE fNN esE wuo -cSH +peD iam mLV fDn @@ -237507,7 +237538,7 @@ gVr cll shB yeD -anI +ueG iCg kql oNO @@ -237948,7 +237979,7 @@ xwC utR pAZ bln -qWZ +oCq oxe vmj aqB @@ -243873,7 +243904,7 @@ hgh czS fVo qbd -rzS +rZO hgh pLt mcW @@ -245140,7 +245171,7 @@ fRI mdZ fWr ggD -pNV +gjZ cpY pxF iYi @@ -253379,11 +253410,11 @@ emp dEV voH thM -xfd +vXi pJV mZG mZG -qEZ +feW axc dFW aYJ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 00099147d94..e31e71d007e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -194,15 +194,16 @@ "aeq" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) -"aet" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants/organic/plant16, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 +"aeu" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/item/kirbyplants/organic/plant20{ + pixel_y = 3 + }, +/obj/effect/turf_decal/bot{ + dir = 1 }, /turf/open/floor/iron, -/area/station/hallway/primary/central) +/area/station/engineering/main) "aev" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1410,13 +1411,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) -"aCy" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/commons/storage/tools) "aCE" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; @@ -3679,6 +3673,12 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood, /area/station/service/library) +"bpG" = ( +/obj/machinery/firealarm/directional/east, +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "bpY" = ( /obj/machinery/light/small/directional/west, /obj/item/clothing/mask/animal/horsehead, @@ -4842,14 +4842,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"bOn" = ( -/obj/machinery/airalarm/directional/north, -/obj/item/kirbyplants/organic/applebush, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "bOr" = ( /obj/structure/lattice/catwalk, /obj/item/stack/rods, @@ -6111,14 +6103,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/port/aft) -"cql" = ( -/obj/item/kirbyplants/organic/plant10, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "cqm" = ( /obj/item/disk/data{ pixel_x = 9; @@ -7056,6 +7040,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"cJm" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "cJv" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/chem_heater/withbuffer, @@ -8471,16 +8462,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"diQ" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/item/kirbyplants/organic/plant20{ - pixel_y = 3 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "diX" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, @@ -9579,11 +9560,6 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "dHg" = ( -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, /obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -9776,10 +9752,10 @@ "dKL" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random/directional/north, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark/corner{ dir = 1 }, @@ -10815,14 +10791,6 @@ /obj/structure/cable, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"eci" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants/organic/applebush, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "ecp" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/turf_decal/bot, @@ -12351,12 +12319,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"eDi" = ( -/obj/machinery/firealarm/directional/east, -/obj/item/kirbyplants/organic/plant10, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "eDC" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/deck, @@ -14391,6 +14353,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"fsb" = ( +/obj/item/kirbyplants/organic/plant18, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "fsh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14569,17 +14538,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"fxR" = ( -/obj/item/kirbyplants/organic/plant11, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "fxT" = ( /obj/machinery/door/airlock/wood{ doorClose = 'sound/effects/doorcreaky.ogg'; @@ -17175,18 +17133,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/service/janitor) -"guP" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Departure Lounge - Port Fore" - }, -/obj/item/kirbyplants/organic/plant24, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "guR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18217,6 +18163,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"gOr" = ( +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "gOv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/holopad, @@ -18476,11 +18430,6 @@ /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gUF" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/kirbyplants/organic/plant14, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) "gUP" = ( /obj/structure/chair{ dir = 1 @@ -20128,6 +20077,10 @@ /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics) +"hxB" = ( +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) "hxD" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue{ @@ -20825,6 +20778,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"hLj" = ( +/obj/machinery/light/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants/organic/plant3, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) "hLs" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/burnt_floor, @@ -21007,15 +20969,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white/smooth_large, /area/station/medical/chemistry) -"hNW" = ( -/obj/item/kirbyplants/organic/plant21, -/obj/structure/sign/departments/botany/directional/east, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "hOd" = ( /obj/structure/table, /obj/machinery/microwave, @@ -21290,13 +21243,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"hSM" = ( -/obj/item/kirbyplants/organic/plant18, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "hSO" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -22959,7 +22905,6 @@ name = "Engineering Security Doors" }, /obj/effect/turf_decal/caution/stand_clear, -/obj/structure/sign/delamination_counter/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/break_room) "iug" = ( @@ -25441,6 +25386,13 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"jjS" = ( +/obj/item/kirbyplants/organic/plant6, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jkj" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 @@ -26984,6 +26936,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"jKX" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jLb" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -28686,18 +28645,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"krq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Departure Lounge - Starboard Fore" - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants/organic/plant14, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "krL" = ( /turf/open/floor/wood, /area/station/command/corporate_showroom) @@ -29270,15 +29217,11 @@ /turf/open/floor/iron, /area/station/command/teleporter) "kCq" = ( -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, /obj/machinery/firealarm/directional/west, /obj/machinery/modular_computer/preset/engineering, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/main) "kCr" = ( @@ -29420,6 +29363,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/lab) +"kFT" = ( +/obj/item/kirbyplants/organic/plant13, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kGc" = ( /obj/machinery/computer/rdconsole, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -30139,6 +30089,15 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/iron/dark, /area/station/service/cafeteria) +"kSP" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/departments/botany/directional/east, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "kST" = ( /obj/machinery/shieldgen, /turf/open/floor/plating, @@ -30818,6 +30777,12 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"lfp" = ( +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/hangover, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "lfu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32266,6 +32231,15 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lKs" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) "lKu" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -33704,7 +33678,6 @@ dir = 4; name = "Gas to Chamber" }, -/obj/structure/sign/delamination_counter/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter) "mkO" = ( @@ -34303,10 +34276,10 @@ }, /obj/item/wrench, /obj/item/multitool, -/obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "mwj" = ( @@ -34949,6 +34922,18 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"mGA" = ( +/obj/machinery/light/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Fore" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants/organic/plant14, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "mGI" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -35245,15 +35230,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/cafeteria) -"mLK" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants/organic/plant3, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) "mLL" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -36252,6 +36228,13 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) +"ndI" = ( +/obj/item/kirbyplants/organic/plant20, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "ndN" = ( /obj/structure/rack, /obj/item/poster/random_contraband, @@ -36268,13 +36251,6 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"nev" = ( -/obj/item/kirbyplants/organic/plant5, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "neA" = ( /obj/machinery/computer/scan_consolenew{ dir = 4 @@ -37548,6 +37524,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"nzJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "nzP" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -38075,6 +38061,13 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"nKG" = ( +/obj/item/kirbyplants/organic/plant5, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nKI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38264,6 +38257,18 @@ }, /turf/open/floor/iron, /area/station/commons/locker) +"nOl" = ( +/obj/machinery/light/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Fore" + }, +/obj/item/kirbyplants/organic/plant24, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nOp" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -40298,6 +40303,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"oAa" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/organic/plant14, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "oAj" = ( /obj/structure/chair/sofa/corp/left, /obj/item/radio/intercom/directional/north, @@ -40599,13 +40609,6 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) -"oFO" = ( -/obj/item/kirbyplants/organic/plant20, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "oFR" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Cargo Bay Bridge Access" @@ -41363,12 +41366,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"oUB" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "oUE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41905,22 +41902,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) -"pfC" = ( -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = -32 - }, -/obj/item/kirbyplants/organic/plant3, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "pfK" = ( /obj/machinery/light/directional/north, /obj/structure/table, @@ -42371,6 +42352,15 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"pou" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/item/wallframe/digital_clock, +/obj/item/wallframe/digital_clock, +/turf/open/floor/iron, +/area/station/commons/storage/tools) "poJ" = ( /obj/machinery/telecomms/hub/preset, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -42969,6 +42959,15 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"pzz" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "pzF" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron, @@ -43088,10 +43087,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/office) -"pBV" = ( -/obj/item/kirbyplants/organic/plant21, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) "pCa" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, @@ -43447,13 +43442,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"pIu" = ( -/obj/item/kirbyplants/organic/plant13, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "pIv" = ( /obj/item/radio/intercom/directional/west, /obj/structure/closet/secure_closet/security/science, @@ -43650,15 +43638,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"pMa" = ( -/obj/item/kirbyplants/organic/plant21, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) "pMd" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, @@ -46103,6 +46082,11 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"qIc" = ( +/obj/structure/cable, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/wood, +/area/station/service/library) "qIl" = ( /turf/closed/wall, /area/station/hallway/secondary/command) @@ -46828,6 +46812,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"qTJ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Aft" + }, +/obj/machinery/light/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants/organic/plant4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "qTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -47537,6 +47533,10 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"rhS" = ( +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/station/service/library) "rhU" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/spawner/random/structure/crate, @@ -48014,18 +48014,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"rtf" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Departure Lounge - Starboard Aft" - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/item/kirbyplants/organic/plant16, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "rtj" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -48589,6 +48577,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rCJ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Aft" + }, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "rDf" = ( /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) @@ -52293,6 +52293,15 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"sRJ" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants/organic/plant16, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "sRT" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -52727,10 +52736,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"sXE" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) "sXF" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -54403,13 +54408,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"tCx" = ( -/obj/item/kirbyplants/organic/plant21, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "tCC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -57753,6 +57751,12 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/locker) +"uJL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/incident_display/delam/directional/south, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "uKa" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 6 @@ -58145,6 +58149,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) +"uRA" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "uRJ" = ( /obj/machinery/door/window/right/directional/west{ dir = 1; @@ -59443,6 +59455,22 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) +"vpM" = ( +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-right-MS"; + pixel_y = -32 + }, +/obj/item/kirbyplants/organic/plant3, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "vpP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59738,6 +59766,14 @@ /obj/item/clothing/mask/cigarette/pipe, /turf/open/floor/plating, /area/station/maintenance/port) +"vwn" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "vwp" = ( /obj/machinery/door/airlock{ id_tag = "FitnessShower"; @@ -59799,15 +59835,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/dorms) -"vxE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "vxJ" = ( /obj/machinery/power/emitter/welded{ dir = 1 @@ -62944,18 +62971,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/sorting) -"wCU" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Departure Lounge - Port Aft" - }, -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants/organic/plant4, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "wDq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -64019,14 +64034,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"wYn" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "wYo" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/light/directional/south, @@ -64583,6 +64590,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"xiv" = ( +/obj/item/kirbyplants/organic/plant11, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "xiL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) @@ -65963,13 +65981,6 @@ /obj/machinery/atmospherics/components/trinary/filter/flipped/critical, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"xIa" = ( -/obj/item/kirbyplants/organic/plant6, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "xIx" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -66962,6 +66973,7 @@ "ybl" = ( /obj/structure/closet/secure_closet/engineering_personal, /obj/effect/turf_decal/delivery, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron, /area/station/engineering/main) "ybn" = ( @@ -76916,7 +76928,7 @@ aaa wdr vvW mtL -pIu +kFT nDP qEt lMJ @@ -76931,7 +76943,7 @@ aaa aaa lMJ qEt -oFO +ndI nDP qEt aox @@ -76940,7 +76952,7 @@ aox oPS aox qEt -xIa +jjS nDP qEt qEt @@ -80516,7 +80528,7 @@ dhb aDb dIP nPf -nev +nKG qEt lMJ aaa @@ -80528,7 +80540,7 @@ aaa aaa lMJ qEt -hSM +fsb lWa eQT nRr @@ -80796,7 +80808,7 @@ sxd uvx slD nyF -pfC +vpM pOa twj xyM @@ -86964,7 +86976,7 @@ mjr tbK fZa eXA -sXE +qIc sVY mjr kUZ @@ -87994,7 +88006,7 @@ mjr nxz ueD sVY -mjr +rhS rSx pEH pEH @@ -91098,7 +91110,7 @@ duu pKP lTP rQd -tCx +cJm jGw dra vPO @@ -91309,7 +91321,7 @@ iBq mFi iBq iBq -vxE +nzJ kON fDc oIa @@ -91582,7 +91594,7 @@ iiE rGj rJr pJR -oUB +lfp qRI urA nIR @@ -92369,7 +92381,7 @@ gBD iun htd ebM -eci +uRA mTk yhm rbs @@ -92668,13 +92680,13 @@ aID iUm qKS vke -guP +nOl jay mRy wBW eje hTE -wCU +qTJ eAe mGy sou @@ -93621,7 +93633,7 @@ uGb aJS aaa ihq -bOn +gOr hZZ rng uoe @@ -93659,7 +93671,7 @@ mTk noD aNf aNa -fxR +xiv dwZ cJv oHG @@ -95238,13 +95250,13 @@ kSD vGN wpr obV -krq +mGA xMC izG tDU vkj vPq -rtf +rCJ awF oIW sou @@ -96191,7 +96203,7 @@ wwY wwY pXh olw -aet +sRJ wEG htd qBC @@ -96203,7 +96215,7 @@ tqI gkD nXm wNh -veO +jKX duI duI duI @@ -97509,7 +97521,7 @@ tvE kQq htd saU -eDi +bpG ghk ulX suW @@ -98243,7 +98255,7 @@ stk daC xVY xNU -mLK +hLj usP spd usP @@ -99008,7 +99020,7 @@ aKa fGC lLG ilh -pMa +pzz jAO vtX jAO @@ -100332,7 +100344,7 @@ eQE eQE hOp bau -hNW +kSP fCt uDr uDr @@ -100577,7 +100589,7 @@ hkG xEJ yjc crf -cql +vwn lyR dDz dfp @@ -101353,7 +101365,7 @@ pof owi nxA hyX -wYn +lKs eQE eEf rOM @@ -101593,7 +101605,7 @@ wzK qXB mNj wlL -aCy +pou dZm wAA fRS @@ -102581,7 +102593,7 @@ cLa qWm bSr cfy -gUF +oAa peF liO sSs @@ -106455,7 +106467,7 @@ qXB gHE kYn tCS -diQ +aeu kSB gon rux @@ -110324,7 +110336,7 @@ fec rHn fJP tYc -mdk +uJL fJy bDW bDW @@ -122164,7 +122176,7 @@ giA lJj pKv dfC -pBV +hxB hJJ hJJ hJJ diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index e971843f3b0..f73edc4d13f 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -244,15 +244,6 @@ }, /turf/open/space/openspace, /area/space) -"acr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) "act" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured_large, @@ -447,15 +438,6 @@ /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) -"aeS" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/table/reinforced/rglass, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "aeW" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, @@ -651,6 +633,11 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"ahS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "ahT" = ( /obj/machinery/camera/directional/west, /turf/open/floor/wood, @@ -3111,11 +3098,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"aMX" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/hollow/reinforced/directional, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "aNk" = ( /obj/structure/table, /obj/effect/turf_decal/stripes/white/line{ @@ -4348,13 +4330,6 @@ dir = 4 }, /area/station/science/robotics/mechbay) -"baZ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "bbb" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 6 @@ -5916,31 +5891,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"btf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "viro-inner"; - name = "Inner Virology Lockdown"; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-outer"; - name = "Outer Virology Lockdown"; - pixel_y = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-iso"; - name = "Isolation Bolts"; - normaldoorcontrol = 1; - pixel_x = -36; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "bto" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 10 @@ -7915,6 +7865,12 @@ dir = 8 }, /area/station/hallway/floor1/aft) +"bSE" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor1/fore) "bSH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8075,12 +8031,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"bUM" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners, -/turf/open/floor/iron/white, -/area/station/medical/virology) "bUO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/machinery/camera{ @@ -8661,6 +8611,12 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"cdc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/floor2/aft) "cdf" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9194,6 +9150,7 @@ /obj/structure/chair/sofa/right/brown{ dir = 1 }, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/carpet, /area/station/medical/psychology) "ciW" = ( @@ -9313,6 +9270,7 @@ /area/station/service/abandoned_gambling_den) "ckP" = ( /obj/machinery/smartfridge/extract/preloaded, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/science/xenobiology) "ckQ" = ( @@ -9402,8 +9360,8 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) "clP" = ( -/obj/machinery/airalarm/directional/north, /obj/machinery/chem_master, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) "clT" = ( @@ -11857,6 +11815,18 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/atmos) +"cTJ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/warning{ + dir = 10 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "cTV" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -11917,6 +11887,15 @@ /obj/machinery/disposal/bin, /turf/open/floor/wood, /area/station/hallway/secondary/entry) +"cUK" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "cUL" = ( /turf/closed/wall, /area/station/cargo/storage) @@ -13180,6 +13159,19 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"dnJ" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/warning{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "dnM" = ( /obj/structure/chair{ dir = 1 @@ -13617,6 +13609,15 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) +"dtJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/floor2/aft) "dtM" = ( /obj/effect/turf_decal/tile/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15671,6 +15672,16 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"dUU" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/green/warning{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "dUW" = ( /obj/effect/turf_decal/trimline/white/arrow_ccw{ dir = 4 @@ -15848,6 +15859,24 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/floor/grass, /area/station/hallway/floor4/fore) +"dWT" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_exterior"; + name = "Virology Exterior Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/medical/virology, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "viro" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "dWZ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -19729,6 +19758,18 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"fcz" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/green/warning{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "fcC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19983,6 +20024,19 @@ /obj/effect/landmark/blobstart, /turf/open/floor/fakebasalt, /area/station/maintenance/floor3/port) +"fhy" = ( +/obj/effect/turf_decal/trimline/white/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/effect/turf_decal/caution/white{ + pixel_y = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "fhA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -21125,14 +21179,6 @@ dir = 1 }, /area/station/service/chapel) -"fxc" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/mannequin/skeleton, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "fxd" = ( /obj/structure/closet/firecloset, /obj/effect/decal/cleanable/dirt, @@ -21871,6 +21917,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"fHd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/floor2/aft) "fHe" = ( /obj/machinery/door/airlock/science/glass{ name = "Research and Development" @@ -22203,6 +22255,14 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, /turf/open/floor/plating, /area/station/science/server) +"fLx" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/space/openspace, +/area/space/nearstation) "fLz" = ( /obj/effect/turf_decal/stripes/end, /obj/effect/turf_decal/stripes/white/end, @@ -23635,6 +23695,16 @@ /obj/effect/landmark/navigate_destination/disposals, /turf/open/floor/iron/smooth_large, /area/station/maintenance/disposal) +"geb" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/floor2/starboard) "gec" = ( /turf/open/floor/iron/dark/side{ dir = 9 @@ -24292,6 +24362,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/checkpoint/second) +"gns" = ( +/obj/effect/turf_decal/trimline/green/warning, +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "gnx" = ( /obj/machinery/door/airlock/highsecurity{ name = "Atmos Access" @@ -26808,6 +26887,7 @@ dir = 8 }, /obj/machinery/recharge_station, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) "gVw" = ( @@ -26982,11 +27062,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) -"gXZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "gYa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27078,14 +27153,6 @@ "gYS" = ( /turf/closed/wall/r_wall, /area/station/hallway/floor4/fore) -"gZa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "gZf" = ( /obj/machinery/camera/autoname/directional/west, /obj/structure/table, @@ -28390,6 +28457,11 @@ dir = 8 }, /area/station/hallway/secondary/exit) +"hpz" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "hpF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -29260,12 +29332,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/cargo/warehouse) -"hBS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) "hBT" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -30130,9 +30196,7 @@ }, /area/station/command/gateway) "hOP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/cable, -/obj/structure/sign/delamination_counter/directional/east, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "hOR" = ( @@ -30235,6 +30299,24 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"hQE" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_interior"; + name = "Virology Interior Airlock" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/any/medical/virology, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "viro" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "hQK" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/structure/disposalpipe/segment, @@ -30787,15 +30869,6 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"hYB" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table/reinforced/rglass, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "hYN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -30946,29 +31019,6 @@ }, /turf/open/floor/iron/dark/smooth_half, /area/station/hallway/floor4/fore) -"ibj" = ( -/obj/machinery/door_buttons/access_button{ - idDoor = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Button"; - pixel_x = -26; - pixel_y = 26; - req_access = list("virology") - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 8 - }, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "ibk" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -32183,6 +32233,15 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"irX" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "isd" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 4 @@ -33683,10 +33742,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/black, /area/station/hallway/secondary/service) -"iNy" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "iNz" = ( /obj/structure/sign/directions/upload/directional/east, /obj/structure/sign/directions/medical/directional/east{ @@ -34625,16 +34680,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/office) -"iZe" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "iZh" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -34919,9 +34964,9 @@ /obj/effect/turf_decal/stripes{ dir = 4 }, -/obj/machinery/airalarm/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/light/cold/no_nightlight/directional/north, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology) "jcN" = ( @@ -36267,12 +36312,6 @@ dir = 8 }, /area/station/security/brig) -"jwJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) "jwP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38293,19 +38332,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"jXV" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "jXX" = ( /obj/machinery/camera/directional/north{ c_tag = "Holodeck - Fore"; @@ -42047,11 +42073,11 @@ /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) "kWD" = ( -/obj/structure/fireaxecabinet/directional/north, /obj/machinery/keycard_auth/directional/north{ pixel_x = -22 }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) "kWM" = ( @@ -42517,17 +42543,6 @@ /obj/effect/landmark/carpspawn, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"lcW" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/structure/girder/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "viro-inner"; - name = "Virology Inner Shutters" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "lcZ" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/airalarm/directional/east, @@ -44512,14 +44527,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) -"lEc" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/space/openspace, -/area/space/nearstation) "lEg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46299,14 +46306,12 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard) -"mad" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/structure/noticeboard/directional/north, +"lZS" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/dark, -/area/station/medical/virology) +/area/station/hallway/floor2/fore) "map" = ( /obj/structure/door_assembly/door_assembly_med, /obj/machinery/door/firedoor, @@ -46838,14 +46843,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) -"mfZ" = ( -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "mge" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 4 @@ -47424,6 +47421,29 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"mnM" = ( +/obj/machinery/door_buttons/access_button{ + idDoor = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_x = -26; + pixel_y = 26; + req_access = list("virology") + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/filled/corner{ + dir = 8 + }, +/obj/structure/sign/warning/biohazard{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "mnQ" = ( /turf/open/floor/iron/smooth, /area/station/hallway/floor1/fore) @@ -47565,6 +47585,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"mqc" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/girder/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "viro-inner"; + name = "Virology Inner Shutters" + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "mqd" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -49763,6 +49794,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mRQ" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) "mSa" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/trashcart/filled, @@ -51892,6 +51931,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"nrL" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "nrM" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -53044,6 +53087,7 @@ /area/station/service/chapel) "nGm" = ( /obj/structure/cable/multilayer/multiz, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/floor3/fore) "nGx" = ( @@ -53482,18 +53526,6 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"nLt" = ( -/obj/effect/turf_decal/trimline/green/warning{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "nLx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54107,6 +54139,7 @@ "nTJ" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/dark, /area/station/command/gateway) "nTO" = ( @@ -54311,16 +54344,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/medical/psychology) -"nWv" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "nWz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56405,18 +56428,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) -"ozd" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 10 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "ozn" = ( /obj/structure/railing{ dir = 9 @@ -58188,24 +58199,6 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/space/nearstation) -"oXq" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_interior"; - name = "Virology Interior Airlock" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/medical/virology, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro" - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "oXN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/white{ @@ -59037,19 +59030,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/work) -"pkY" = ( -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/effect/turf_decal/caution/white{ - pixel_y = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/virology) "pld" = ( /obj/structure/chair/comfy, /turf/open/floor/iron/dark, @@ -59456,6 +59436,12 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"pqo" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "pqy" = ( /obj/machinery/camera{ c_tag = "Power Storage"; @@ -62593,13 +62579,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"qhR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "qia" = ( /obj/structure/railing, /turf/open/misc/beach/sand, @@ -63081,6 +63060,14 @@ /obj/structure/foamedmetal, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"qpo" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/mannequin/skeleton, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "qpp" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ name = "Waste Release" @@ -64642,6 +64629,16 @@ /obj/structure/firelock_frame/heavy, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) +"qGa" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "qGb" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -64688,6 +64685,7 @@ /obj/machinery/recharger, /obj/effect/turf_decal/tile/purple/fourcorners, /obj/item/multitool, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) "qGV" = ( @@ -65022,6 +65020,13 @@ /obj/structure/displaycase/trophy, /turf/open/floor/carpet/royalblack, /area/station/service/library) +"qNw" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "qNx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -65680,6 +65685,7 @@ /area/station/hallway/floor1/aft) "qWe" = ( /obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) "qWi" = ( @@ -66094,16 +66100,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"rbL" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/floor2/starboard) "rbQ" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -66299,6 +66295,7 @@ dir = 4 }, /obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/wood, /area/station/service/bar/atrium) "rdV" = ( @@ -69382,6 +69379,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor1/port) +"rYq" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor3/fore) "rYw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -71179,6 +71182,7 @@ /obj/item/stock_parts/cell/high, /obj/machinery/cell_charger, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/fireaxecabinet/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) "sAa" = ( @@ -72302,6 +72306,31 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/fore) +"sPp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/button/door/directional/west{ + id = "viro-inner"; + name = "Inner Virology Lockdown"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-outer"; + name = "Outer Virology Lockdown"; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-iso"; + name = "Isolation Bolts"; + normaldoorcontrol = 1; + pixel_x = -36; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "sPs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -73463,6 +73492,21 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) +"tdA" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/warning{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/red/dim/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "tdB" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73864,6 +73908,16 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) +"tjV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "tkb" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -75167,21 +75221,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/station/service/theater) -"tBp" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/red/dim/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "tBr" = ( /obj/machinery/camera/autoname/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -75360,6 +75399,12 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/textured, /area/station/medical/paramedic) +"tEh" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor/heavy, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/floor4/aft) "tEi" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, @@ -75833,6 +75878,14 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) +"tKr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "tKs" = ( /obj/structure/curtain, /obj/structure/fans/tiny{ @@ -77331,24 +77384,6 @@ "uhx" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"uhy" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_exterior"; - name = "Virology Exterior Airlock" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/medical/virology, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro" - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "uhB" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 8 @@ -77860,12 +77895,6 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/atmos/pumproom) -"uoZ" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "uph" = ( /obj/machinery/door/airlock/hatch{ name = "Elevator Shaft Access" @@ -78135,6 +78164,14 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"utl" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "utm" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/structure/girder/reinforced, @@ -78512,15 +78549,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"uyY" = ( -/obj/effect/turf_decal/trimline/green/warning, -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "uza" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 8 @@ -79356,6 +79384,7 @@ /area/station/maintenance/floor1/port) "uKt" = ( /obj/structure/cable/multilayer/multiz, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/catwalk_floor, /area/station/hallway/floor1/fore) "uKz" = ( @@ -79944,9 +79973,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/engine_smes) -"uSe" = ( -/turf/open/floor/iron/dark/textured, -/area/station/hallway/floor2/aft) "uSm" = ( /obj/machinery/holopad, /obj/effect/turf_decal/trimline/blue, @@ -82236,6 +82262,9 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/starboard/aft) +"vwQ" = ( +/turf/open/floor/iron/dark/textured, +/area/station/hallway/floor2/aft) "vwW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -85417,13 +85446,6 @@ /obj/effect/turf_decal/tile/dark_red/fourcorners, /turf/open/floor/iron, /area/station/security/brig) -"wmN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wmQ" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -86086,6 +86108,11 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"wvg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "wvq" = ( /turf/open/floor/iron/dark, /area/station/command/teleporter) @@ -86748,6 +86775,16 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/dark, /area/station/security/brig) +"wDM" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced/rglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/digital_clock/directional/north, +/obj/item/storage/box/bodybags, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "wDS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -87647,18 +87684,6 @@ }, /turf/open/floor/plating, /area/station/security/brig) -"wOb" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/green/warning{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "wOd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/tank_holder, @@ -88852,6 +88877,18 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office/private_investigators_office) +"xeM" = ( +/obj/effect/turf_decal/trimline/green/warning{ + dir = 1 + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "xeO" = ( /turf/open/floor/iron, /area/station/engineering/atmos) @@ -91343,6 +91380,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) +"xNy" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/tile/green/opposingcorners, +/turf/open/floor/iron/white, +/area/station/medical/virology) "xND" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -91669,6 +91712,7 @@ dir = 4 }, /obj/structure/chair/sofa/bench/left, +/obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/cargo/lobby) "xSb" = ( @@ -92057,6 +92101,13 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"xXF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "xXK" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/wood/large, @@ -92700,6 +92751,7 @@ "yhO" = ( /obj/machinery/suit_storage_unit/engine, /obj/structure/window/spawner/directional/east, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron/dark/textured_corner{ dir = 1 }, @@ -123182,7 +123234,7 @@ vni mnQ rMq kyR -vOK +bSE hVG bBx jnp @@ -138347,7 +138399,7 @@ oqA bNR klY klY -hOP +klY nHv cAf klY @@ -138598,7 +138650,7 @@ oIy bIW oIy oIy -pso +tjV xgW xgW pUf @@ -139126,7 +139178,7 @@ uyD uyD fws wOm -xgW +unW dEc dEc dEc @@ -139383,7 +139435,7 @@ jjt mVf mVF wOm -unW +hOP dEc mSe uov @@ -188204,7 +188256,7 @@ qlQ feX gPH fNT -fqo +lZS idn shi miF @@ -190013,7 +190065,7 @@ qRy cht sYb kUO -pDS +hpz kKr hPX wyE @@ -193834,8 +193886,8 @@ ucA ucA ucA ucA -uoZ -iNy +pqo +nrL wJI vnK vnK @@ -194097,16 +194149,16 @@ wJI ndL vnK vaC -nWv -tBp -jXV -ozd -gXZ -lcW -mfZ +dUU +tdA +dnJ +cTJ +wvg +mqc +mRQ dVV -bUM -btf +xNy +sPp mcI rPC sJn @@ -194347,14 +194399,14 @@ ucA ucA ucA ucA -lEc -baZ -aMX -qhR -nLt -rbL -uyY -wOb +fLx +qNw +ahS +xXF +xeM +geb +gns +fcz wGl wGl xZl @@ -194605,8 +194657,8 @@ ucA ucA ucA ucA -uoZ -iNy +pqo +nrL wJI vnK vnK @@ -194617,10 +194669,10 @@ wGl gIa whL iOA -mad +utl doh gJz -gZa +tKr hwQ piz aWO @@ -195119,8 +195171,8 @@ ucA ucA ucA ucA -uoZ -iNy +pqo +nrL wJI vnK lCR @@ -195134,7 +195186,7 @@ iOA dfU pZm wJy -gZa +tKr dVV bLm yhv @@ -195905,7 +195957,7 @@ iOA iOA iOA iOA -oXq +hQE aBK aBK rdH @@ -196162,7 +196214,7 @@ dVf dVf dVf iOA -ibj +mnM fWa aBK vvX @@ -196419,15 +196471,15 @@ vnK vnK dVf iOA -iZe -pkY -uhy -acr -hBS -hBS -hBS -jwJ -uSe +qGa +fhy +dWT +dtJ +cdc +cdc +cdc +fHd +vwQ aNm fXr xYM @@ -197213,7 +197265,7 @@ fou eAV hrw jRO -hYB +wDM bKs gCw slI @@ -197470,7 +197522,7 @@ dQH jdx cnK jRO -aeS +cUK rlB wLV uMK @@ -197727,7 +197779,7 @@ jSW nrX mkE gQx -fxc +irX xWy pfd fQH @@ -197984,7 +198036,7 @@ hbj cle bWz jRO -wmN +qpo qAh rAu lVE @@ -254254,7 +254306,7 @@ bvB oZx iQG eDe -ybQ +rYq nKn wdb qcd @@ -319276,7 +319328,7 @@ niF vRO qbg nWW -uIk +tEh bVy vVu vOE diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 87803e58d85..aa370d48cf8 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -6317,6 +6317,10 @@ "bTo" = ( /turf/closed/wall, /area/station/commons/storage/primary) +"bTq" = ( +/obj/machinery/digital_clock, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/qm) "bTF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/status_display/ai/directional/south, @@ -9689,6 +9693,13 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/hallway/primary/fore) +"cWB" = ( +/obj/machinery/digital_clock{ + pixel_y = 7; + pixel_x = -1 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/room) "cWH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -12601,13 +12612,7 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/port/central) "dLz" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/dark_red{ - dir = 4 - }, +/obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) "dLE" = ( @@ -16766,6 +16771,7 @@ /obj/item/statuebust/hippocratic{ pixel_y = 8 }, +/obj/machinery/digital_clock/directional/west, /turf/open/floor/carpet/green, /area/command/heads_quarters/captain/private/nt_rep) "eRt" = ( @@ -18035,15 +18041,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, /area/station/medical/coldroom) -"flJ" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/warden) "flP" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 8 @@ -18077,12 +18074,14 @@ "fmC" = ( /obj/machinery/computer/shuttle/labor, /obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/tile/dark_red/half{ dir = 4 }, /obj/effect/turf_decal/bot, /obj/machinery/light/cold/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 36 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) "fmD" = ( @@ -18911,7 +18910,6 @@ dir = 1 }, /obj/effect/turf_decal/siding/wood, -/obj/structure/sign/clock/directional/south, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/qm) @@ -19945,9 +19943,6 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet) "fRm" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -19957,6 +19952,9 @@ /obj/machinery/light/warm/directional/east, /obj/machinery/light_switch/directional/east, /obj/effect/landmark/start/paramedic, +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/medical/break_room) "fRq" = ( @@ -20566,12 +20564,7 @@ /area/station/security/brig) "gaJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, +/obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) "gaQ" = ( @@ -21388,7 +21381,7 @@ /turf/open/floor/noslip, /area/station/service/janitor) "glp" = ( -/obj/structure/sign/clock, +/obj/machinery/digital_clock, /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) "glq" = ( @@ -23231,7 +23224,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/airalarm/directional/north, +/obj/machinery/airalarm/directional/north{ + pixel_y = 21 + }, /obj/structure/rack, /obj/item/stack/sheet/iron/fifty, /obj/item/analyzer, @@ -23654,7 +23649,6 @@ }, /area/station/hallway/primary/fore) "gSK" = ( -/obj/machinery/status_display/ai/directional/east, /obj/effect/turf_decal/siding/dark_blue{ dir = 4 }, @@ -23716,6 +23710,12 @@ /obj/effect/turf_decal/tile/blue/diagonal_centre, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/central) +"gTg" = ( +/obj/machinery/digital_clock{ + pixel_y = 5 + }, +/turf/closed/wall/r_wall, +/area/blueshield) "gTJ" = ( /obj/effect/mapping_helpers/airlock/unres{ dir = 1 @@ -24351,12 +24351,11 @@ }, /area/station/hallway/primary/fore) "hcw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/digital_clock{ + pixel_y = 5 }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/starboard/aft) +/turf/closed/wall, +/area/station/engineering/main) "hcD" = ( /obj/effect/turf_decal/bot, /obj/structure/sign/warning/electric_shock/directional/east, @@ -25207,7 +25206,7 @@ /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "hqf" = ( -/obj/structure/sign/clock, +/obj/machinery/digital_clock, /turf/closed/wall/r_wall, /area/station/security/warden) "hqm" = ( @@ -27232,6 +27231,19 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/iron/smooth, /area/station/maintenance/aft/upper) +"hTN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/closet/firecloset/wall{ + pixel_y = -32 + }, +/obj/effect/turf_decal/trimline/white/end{ + dir = 1 + }, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, +/area/station/hallway/secondary/entry) "hTP" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -28196,8 +28208,8 @@ pixel_x = 1; pixel_y = 19 }, -/obj/structure/sign/clock/directional/south, /obj/structure/aquarium/prefilled, +/obj/machinery/digital_clock/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain) "ikp" = ( @@ -28696,7 +28708,7 @@ /turf/open/floor/iron/white/smooth_large, /area/station/science/lab) "iqx" = ( -/obj/structure/sign/clock, +/obj/machinery/digital_clock, /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) "iqD" = ( @@ -32681,9 +32693,6 @@ }, /area/station/engineering/main) "jvf" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -32691,6 +32700,9 @@ dir = 4 }, /obj/effect/landmark/start/orderly, +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/medical/break_room) "jvg" = ( @@ -33618,6 +33630,13 @@ pixel_x = -2; pixel_y = 5 }, +/obj/machinery/requests_console/directional/south{ + department = "Engineering"; + name = "Engineering Requests Console"; + dir = 4; + pixel_y = 0; + pixel_x = 30 + }, /turf/open/floor/iron/smooth, /area/station/engineering/lobby) "jGT" = ( @@ -33706,9 +33725,17 @@ /turf/open/floor/iron/smooth, /area/station/hallway/primary/aft) "jHI" = ( -/obj/structure/sign/clock, -/turf/closed/wall, -/area/station/commons/vacant_room) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 1 + }, +/area/station/hallway/secondary/command) "jHT" = ( /obj/machinery/smartfridge/extract/preloaded, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -34556,7 +34583,6 @@ /obj/machinery/modular_computer/preset/command, /obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/bot, -/obj/structure/sign/clock/directional/east, /turf/open/floor/carpet/cyan, /area/blueshield) "jVx" = ( @@ -35511,8 +35537,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/structure/sign/clock/directional/north, /obj/machinery/light/cold/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /turf/open/floor/engine, /area/station/ai_monitored/security/armory) "kjL" = ( @@ -35529,7 +35557,6 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/sign/delamination_counter/directional/east, /obj/machinery/light/cold/directional/east, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -36281,7 +36308,6 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/science/robotics/lab) "kvT" = ( -/obj/structure/sign/clock/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, @@ -39789,9 +39815,9 @@ /obj/structure/rack, /obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet, -/obj/item/melee/hammer, -/obj/item/melee/hammer, -/obj/item/melee/hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, /obj/effect/turf_decal/tile/dark_red/half, /obj/machinery/camera/directional/south{ c_tag = "Armory - Interior" @@ -40459,9 +40485,11 @@ /area/space/nearstation) "lAT" = ( /obj/machinery/computer/prisoner/management, -/obj/structure/sign/clock/directional/north, /obj/effect/turf_decal/bot, /obj/machinery/light/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /turf/open/floor/carpet/royalblack, /area/station/command/heads_quarters/hos) "lBb" = ( @@ -41656,11 +41684,6 @@ dir = 4 }, /area/station/engineering/gravity_generator) -"lQU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/evidence, -/turf/open/floor/iron/dark, -/area/station/security/warden) "lQX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -46882,6 +46905,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth_large, /area/station/security/checkpoint/supply) +"npK" = ( +/obj/machinery/digital_clock{ + pixel_y = 5 + }, +/turf/closed/wall/r_wall, +/area/command/heads_quarters/captain/private/nt_rep) "npP" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -46975,7 +47004,8 @@ dir = 6 }, /obj/machinery/light_switch/directional/east{ - pixel_x = 21 + pixel_x = 21; + pixel_y = -7 }, /obj/structure/closet/secure_closet/courtroom, /obj/item/megaphone{ @@ -49388,6 +49418,7 @@ pixel_x = -32; pixel_y = 27 }, +/obj/machinery/incident_display/delam/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/command/bridge) "nYj" = ( @@ -49493,7 +49524,6 @@ /obj/structure/sign/plaques/kiddie/perfect_man{ pixel_y = 32 }, -/obj/structure/sign/clock/directional/east, /turf/open/floor/wood/large, /area/command/heads_quarters/captain/private/nt_rep) "oaD" = ( @@ -49681,17 +49711,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/science/research) -"oei" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/dark_red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/warden) "oej" = ( /obj/effect/turf_decal/weather/sand{ dir = 4 @@ -51977,7 +51996,9 @@ layer = 2.9 }, /obj/machinery/status_display/evac/directional/west, -/obj/structure/sign/clock/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /obj/effect/turf_decal/trimline/dark_blue/filled, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner, /obj/effect/turf_decal/trimline/dark_blue/filled/mid_joiner{ @@ -52872,7 +52893,9 @@ /obj/item/toy/figure/captain{ pixel_y = 12 }, -/obj/structure/sign/clock/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/captain/private) "oXQ" = ( @@ -53297,6 +53320,10 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/lab) +"pdj" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, +/area/station/security/checkpoint/engineering) "pdt" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/box, @@ -53427,7 +53454,6 @@ /obj/structure/closet{ name = "Evidence Closet" }, -/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/warden) "peM" = ( @@ -54380,11 +54406,13 @@ /obj/item/toy/figure/lawyer{ pixel_y = 18 }, -/obj/structure/sign/clock/directional/north, /obj/effect/turf_decal/siding/wood{ dir = 5 }, /obj/effect/turf_decal/bot, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /turf/open/floor/wood, /area/station/service/lawoffice) "psA" = ( @@ -56190,10 +56218,10 @@ }, /area/station/engineering/break_room) "pTK" = ( -/obj/structure/table/reinforced, /obj/item/mmi, /obj/item/assembly/prox_sensor, /obj/effect/decal/cleanable/dirt, +/obj/structure/table, /turf/open/floor/iron/smooth, /area/station/science/research/abandoned) "pUe" = ( @@ -57704,10 +57732,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 10 }, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - name = "Engineering Requests Console" - }, /obj/effect/mapping_helpers/requests_console/supplies, /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/smooth, @@ -57902,6 +57926,12 @@ }, /turf/open/floor/iron/large, /area/station/service/kitchen) +"qoE" = ( +/obj/machinery/digital_clock{ + pixel_y = 5 + }, +/turf/closed/wall, +/area/station/security/interrogation) "qoG" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -59632,13 +59662,13 @@ /area/station/service/theater) "qNc" = ( /obj/machinery/vending/cart, -/obj/structure/sign/clock/directional/east, /obj/item/storage/lockbox/loyalty{ pixel_x = 2; pixel_y = 18 }, /obj/effect/turf_decal/bot, /obj/structure/sign/calendar/directional/south, +/obj/machinery/digital_clock/directional/east, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "qNd" = ( @@ -61103,7 +61133,6 @@ /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) "rju" = ( -/obj/structure/sign/clock/directional/east, /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, /obj/effect/turf_decal/siding/dark_blue{ @@ -63503,7 +63532,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/status_display/ai/directional/west, /obj/structure/cable, /obj/machinery/light/cold/directional/west, /turf/open/floor/engine, @@ -64634,7 +64662,7 @@ dir = 1 }, /obj/machinery/newscaster/directional/north{ - pixel_x = 11 + pixel_x = 9 }, /turf/open/floor/wood/large, /area/station/science/research) @@ -65678,10 +65706,9 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/aft/greater) "sCG" = ( -/obj/structure/closet/firecloset/wall{ - pixel_y = 32 +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 }, -/obj/effect/turf_decal/trimline/white/end, /turf/open/floor/iron/smooth_edge, /area/station/hallway/secondary/entry) "sCH" = ( @@ -65772,6 +65799,7 @@ /area/station/engineering/atmos) "sCX" = ( /obj/effect/turf_decal/trimline/white/mid_joiner, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/smooth_edge, /area/station/hallway/secondary/entry) "sCZ" = ( @@ -68203,6 +68231,7 @@ "the" = ( /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/box, +/obj/machinery/incident_display/delam/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage) "thf" = ( @@ -69030,7 +69059,6 @@ /turf/open/floor/iron/diagonal, /area/station/hallway/secondary/service) "tsb" = ( -/obj/structure/chair/sofa/bench, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, @@ -69039,6 +69067,7 @@ pixel_y = 32 }, /obj/effect/landmark/start/assistant, +/obj/structure/chair/sofa/bench/right, /turf/open/floor/iron/white/smooth_edge, /area/station/medical/medbay/lobby) "tsi" = ( @@ -69212,8 +69241,8 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/sign/delamination_counter/directional/west, /obj/machinery/light/cold/directional/west, +/obj/machinery/status_display/ai/directional/west, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "tuF" = ( @@ -69422,7 +69451,9 @@ /turf/open/floor/iron/large, /area/station/commons/fitness/recreation/entertainment) "twZ" = ( -/obj/structure/sign/clock, +/obj/machinery/digital_clock{ + pixel_y = 6 + }, /turf/closed/wall/r_wall, /area/station/security/office) "txh" = ( @@ -70488,7 +70519,9 @@ icon_state = "original" }, /obj/item/toy/cattoy, -/obj/structure/sign/clock/directional/north, +/obj/machinery/digital_clock/directional/north{ + pixel_y = 37 + }, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/cmo) "tLN" = ( @@ -72707,6 +72740,9 @@ /obj/machinery/firealarm/directional/south, /obj/structure/filingcabinet, /obj/effect/turf_decal/bot, +/obj/machinery/digital_clock/directional/south{ + pixel_y = -39 + }, /turf/open/floor/iron/smooth_edge{ dir = 1 }, @@ -78172,6 +78208,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, /area/station/cargo/sorting) +"vUB" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter) "vUC" = ( /obj/structure/chair/pew/left, /turf/open/floor/iron/chapel{ @@ -79130,6 +79170,7 @@ /area/station/maintenance/port/fore) "whY" = ( /obj/structure/closet/secure_closet/evidence, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/security/warden) "wia" = ( @@ -79346,6 +79387,10 @@ /obj/structure/fluff/beach_umbrella/syndi, /turf/open/floor/iron/white/small, /area/station/common/pool) +"wlh" = ( +/obj/machinery/incident_display/delam, +/turf/closed/wall, +/area/station/engineering/main) "wlj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -83921,7 +83966,6 @@ /area/station/security/warden) "xBW" = ( /obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random/directional/north, /obj/machinery/camera/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/main) @@ -85517,12 +85561,7 @@ /area/station/maintenance/port/aft) "yaH" = ( /obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, +/obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) "ybj" = ( @@ -107958,11 +107997,11 @@ lkj ttw qjA bgi -qjA +iTA rQj atf -rUz -qjA +hTN +iTA bgi qjA ttw @@ -117665,7 +117704,7 @@ doJ doJ doJ cmH -cmH +gTg cmH eUl cmH @@ -118040,7 +118079,7 @@ qTC hcL wEV jgd -xnw +pdj lFP rfv uyT @@ -118833,7 +118872,7 @@ vuq adx afy qat -bZi +vUB jrj aaH jko @@ -118963,8 +119002,8 @@ hca nEb mzb hEA -hvK jHI +imR eEN cDV ibV @@ -120369,7 +120408,7 @@ rAU cge mxk jQq -oCl +cWB gME tUK nYt @@ -120636,7 +120675,7 @@ bZi rfD dAY mhx -bZi +vUB cmr fsX ejY @@ -121130,7 +121169,7 @@ lVG nDn hAj enY -rAU +hcw nFx iPJ iRb @@ -121387,7 +121426,7 @@ fdG mhY vsS qlQ -rAU +wlh xBW iPJ vgy @@ -122577,8 +122616,8 @@ cAy aDR yaH dLz -oei -flJ +gaJ +dLz gaJ aDR bzs @@ -122833,7 +122872,7 @@ tpZ uLY aDR wWQ -lQU +whY whY aDR kIV @@ -123059,7 +123098,7 @@ usB jxu usB xlE -xlE +npK xlE iGu xlE @@ -123191,7 +123230,7 @@ fAJ iAF iAF owb -hcw +tTt vlh the eLf @@ -125413,7 +125452,7 @@ ueZ oae qKi xPP -qRF +qoE kvT fVF gwF @@ -125732,7 +125771,7 @@ iWQ gnh koK fyT -onP +bTq uRm pNh nMh diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 1b9ac6d11f1..8a80993c6e1 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -1626,6 +1626,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"aex" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "aey" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -4604,13 +4618,13 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/machinery/airalarm/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/structure/fireaxecabinet/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "aAE" = ( @@ -6221,7 +6235,7 @@ /area/station/commons/fitness/recreation) "aMY" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /turf/open/openspace, /area/station/hallway/primary/tram/center) "aNa" = ( @@ -8019,10 +8033,10 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/structure/sign/clock/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Command - Bridge North" }, +/obj/machinery/incident_display/dual/directional/north, /turf/open/floor/iron, /area/station/command/bridge) "bsW" = ( @@ -9044,6 +9058,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) +"bLq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "bLr" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -12819,12 +12840,15 @@ /turf/open/floor/iron/checker, /area/station/service/kitchen) "cZo" = ( -/obj/structure/sign/collision_counter{ - pixel_x = -4; - pixel_y = 2 +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/closed/wall, -/area/station/medical/medbay/lobby) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/incident_display/dual/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "cZz" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -16057,6 +16081,13 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation/entertainment) +"elu" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/security/prison) "elB" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -16302,7 +16333,6 @@ }, /obj/machinery/newscaster/directional/south, /obj/structure/reagent_dispensers/water_cooler, -/obj/structure/sign/delamination_counter/directional/west, /turf/open/floor/iron, /area/station/engineering/break_room) "eqJ" = ( @@ -16507,12 +16537,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/warden) -"etQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom/holding) "euC" = ( /turf/open/floor/wood/parquet, /area/station/medical/psychology) @@ -18723,7 +18747,7 @@ /area/station/science/ordnance/testlab) "fnl" = ( /obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, +/obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark/side{ dir = 1 }, @@ -19731,13 +19755,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) -"fGS" = ( -/obj/machinery/modular_computer/preset/id{ - dir = 1 - }, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/cafeteria, -/area/station/command/heads_quarters/rd) "fGZ" = ( /obj/structure/table, /obj/item/razor{ @@ -20083,6 +20100,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"fNS" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 0 + }, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "fNV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21385,7 +21412,6 @@ dir = 10; network = list("ss13","engine","engineering") }, -/obj/structure/sign/delamination_counter/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter) "gpD" = ( @@ -21743,14 +21769,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/cargo/miningdock) -"gxA" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 8 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "gxO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 @@ -23867,6 +23885,12 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/wood/large, /area/station/service/library) +"hnK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/station/commons/vacant_room) "hnP" = ( /obj/effect/turf_decal/trimline/dark_green/filled/corner{ dir = 4 @@ -24221,6 +24245,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "hvJ" = ( @@ -24929,6 +24954,7 @@ c_tag = "Civilian - Recreational Area North-West" }, /obj/item/toy/plush/lizard_plushie/space/green, +/obj/machinery/incident_display/dual/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) "hMs" = ( @@ -25241,6 +25267,7 @@ /obj/item/storage/toolbox/emergency, /obj/item/wrench, /obj/item/assembly/signaler, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/command/bridge) "hSs" = ( @@ -28099,9 +28126,6 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "iWm" = ( -/obj/structure/sign/collision_counter{ - pixel_x = -32 - }, /obj/structure/table/reinforced, /obj/item/storage/medkit/regular{ pixel_x = -5; @@ -28111,6 +28135,7 @@ pixel_x = 8; pixel_y = 4 }, +/obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/command/bridge) "iWz" = ( @@ -29187,16 +29212,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jpw" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/structure/sign/clock/directional/south, -/obj/machinery/conveyor_switch/oneway{ - id = "engineeringchute"; - name = "Shipment Delivery Chute Activator"; - pixel_x = -11 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "jpC" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -29431,6 +29446,13 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"jtP" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/white, +/area/station/science/lobby) "jud" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, @@ -30608,6 +30630,16 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"jRq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/conveyor_switch/oneway{ + id = "engineeringchute"; + name = "Shipment Delivery Chute Activator"; + pixel_x = -11 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "jRy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -31830,6 +31862,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"knX" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/security/office) "koj" = ( /obj/machinery/vending/wardrobe/jani_wardrobe, /obj/structure/extinguisher_cabinet/directional/north, @@ -32156,7 +32196,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, -/obj/structure/fireaxecabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -33899,7 +33938,7 @@ /area/station/science/explab) "kYp" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/machinery/destination_sign/south{ pixel_y = -11 }, @@ -34186,9 +34225,6 @@ /obj/structure/disposalpipe/trunk{ dir = 2 }, -/obj/structure/sign/collision_counter{ - pixel_x = 32 - }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "lcn" = ( @@ -36309,12 +36345,6 @@ /obj/item/cultivator, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"lQC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "lQE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, @@ -37773,6 +37803,13 @@ name = "hyper-reinforced wall" }, /area/station/science/ordnance/bomb) +"mpO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "mpX" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table/wood, @@ -38993,6 +39030,18 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"mPu" = ( +/obj/item/paper{ + default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; + name = "initiation paperwork" + }, +/obj/machinery/computer/records/medical/syndie{ + dir = 1; + req_access = list("syndicate") + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/commons/vacant_room) "mPN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -39219,6 +39268,16 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"mWy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "mWK" = ( /obj/structure/chair/stool/directional/south, /obj/effect/landmark/start/hangover, @@ -41353,7 +41412,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 }, -/obj/machinery/newscaster/directional/north, /obj/item/pai_card, /turf/open/floor/iron, /area/station/commons/fitness/recreation) @@ -41390,7 +41448,7 @@ /area/station/hallway/secondary/command) "nKp" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/structure/chair/sofa/bench/tram/right{ dir = 8 }, @@ -41734,7 +41792,7 @@ /area/station/engineering/main) "nQc" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/machinery/destination_sign/north{ pixel_y = 10 }, @@ -42177,20 +42235,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) -"nXd" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table/glass, -/obj/item/reagent_containers/dropper, -/obj/structure/sign/clock/directional/north, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "nXh" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -42244,21 +42288,6 @@ /obj/item/stamp/head/cmo, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"nXN" = ( -/obj/item/kirbyplants/organic/plant21, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "nXP" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43056,7 +43085,10 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/incident_display/tram/directional/north{ + name = "darwin award counter"; + desc = "A display that indicates how many dents that'll need fixed after the shift is over." + }, /turf/open/floor/iron, /area/station/maintenance/port/central) "onW" = ( @@ -43094,7 +43126,7 @@ /obj/machinery/destination_sign/north{ pixel_y = 10 }, -/obj/structure/window/reinforced/tram/left/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /obj/structure/chair/sofa/bench/tram/right{ dir = 8 }, @@ -44019,6 +44051,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/brig) +"oII" = ( +/obj/machinery/modular_computer/preset/id{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/command/heads_quarters/rd) "oIU" = ( /turf/open/floor/iron/white, /area/station/medical/treatment_center) @@ -44383,6 +44422,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/maintenance/port/central) "oRV" = ( @@ -45218,11 +45258,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"piT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark/herringbone, -/area/station/commons/vacant_room) "piX" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -45525,16 +45560,6 @@ dir = 1 }, /area/station/service/kitchen) -"pnz" = ( -/obj/structure/sign/clock/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "pnF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating, @@ -49334,11 +49359,6 @@ /obj/structure/table, /obj/item/storage/toolbox/emergency, /obj/item/crowbar, -/obj/structure/sign/collision_counter{ - desc = "A display that indicates how many dents that'll need fixed after the shift is over."; - name = "darwin award counter"; - pixel_x = 32 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/central) @@ -51842,12 +51862,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) -"rAZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) "rBb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -53031,7 +53045,7 @@ /area/station/security/warden) "rZD" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/left/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/structure/chair/sofa/bench/tram/right{ dir = 4 }, @@ -53421,14 +53435,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) -"sgt" = ( -/obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/right/directional/south, -/obj/structure/chair/sofa/bench/tram/right{ - dir = 4 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/center) "sgA" = ( /obj/structure/table, /obj/machinery/light/small/directional/west, @@ -54719,6 +54725,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/disposal) +"sCp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/incident_display/delam/directional/north, +/turf/open/floor/engine, +/area/station/engineering/supermatter/room) "sCv" = ( /obj/structure/table/wood, /obj/machinery/light/dim/directional/north, @@ -55072,17 +55086,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sJp" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 0 - }, -/obj/structure/sign/clock/directional/south, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "sJx" = ( /obj/structure/chair{ dir = 1 @@ -55975,6 +55978,21 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/asteroid) +"sYh" = ( +/obj/item/kirbyplants/organic/plant21, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "sYk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -57107,17 +57125,6 @@ /obj/structure/chair, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"tsR" = ( -/obj/item/paper{ - default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; - name = "initiation paperwork" - }, -/obj/machinery/computer/records/medical/syndie{ - dir = 1; - req_access = list("syndicate") - }, -/turf/open/floor/iron/dark/small, -/area/station/commons/vacant_room) "tsV" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/shower/directional/east, @@ -58390,10 +58397,10 @@ /turf/closed/wall, /area/station/hallway/secondary/entry) "tPV" = ( -/obj/machinery/status_display/evac/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, +/obj/machinery/incident_display/dual/directional/north, /turf/open/floor/iron, /area/station/engineering/main) "tPW" = ( @@ -60908,7 +60915,7 @@ /obj/machinery/destination_sign/south{ pixel_y = -11 }, -/obj/structure/window/reinforced/tram/left/directional/south, +/obj/structure/window/reinforced/tram/directional/south, /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench/tram/left{ dir = 8 @@ -61616,14 +61623,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"uSU" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/sign/clock/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) "uSV" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/chem_heater/withbuffer, @@ -64378,13 +64377,6 @@ }, /turf/open/floor/carpet, /area/station/command/meeting_room) -"vNd" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/item/kirbyplants/organic/plant10, -/turf/open/floor/iron/white, -/area/station/science/lobby) "vNe" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -68126,6 +68118,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/dorms) +"xmv" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/light/directional/south, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom/holding) "xmE" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -69797,7 +69795,7 @@ /area/station/engineering/supermatter) "xVH" = ( /obj/structure/industrial_lift/tram, -/obj/structure/window/reinforced/tram/mid/directional/north, +/obj/structure/window/reinforced/tram/directional/north, /turf/open/openspace, /area/station/hallway/primary/tram/center) "xVJ" = ( @@ -76061,7 +76059,7 @@ fTI agz agz agz -piT +hnK gcp aaa aaa @@ -87763,7 +87761,7 @@ wkk fZX jLj gvI -rAZ +elu kHT mIN ezb @@ -99399,7 +99397,7 @@ pwX hJd aYn hJd -jpw +jRq qHs qHs qHs @@ -102228,7 +102226,7 @@ sHH sHH cjy qHs -vqH +sCp fuj xEy miU @@ -141597,7 +141595,7 @@ exv gNy krT aBI -sJp +fNS gcp aaa aaa @@ -141854,7 +141852,7 @@ exv gNy ydj jap -tsR +mPu gcp aaa aaa @@ -149988,7 +149986,7 @@ kaD qYj ceW oca -lQC +bLq dDi mtX tPE @@ -152313,7 +152311,7 @@ jvf ook mGQ yiM -fpg +mpO heY ddh mQp @@ -157662,7 +157660,7 @@ avn fAg oUx wbH -uSU +knX jKq jKq jKq @@ -161269,7 +161267,7 @@ oXb hzV drh uMg -etQ +xmv omm abM abM @@ -166474,7 +166472,7 @@ qfg qOY iae qeL -nXN +sYh nXK wdj oGJ @@ -168495,11 +168493,11 @@ aEk rOu umT ykP -gxA +nKp hio rPq aEq -sgt +rZD ykP lej pxC @@ -169016,8 +169014,8 @@ gUF rlO ykP lej -fxs -lDt +cZo +wyd mJc kin juV @@ -169046,7 +169044,7 @@ adM obH aQk jYS -nXd +aex lVC xiP jYS @@ -169274,7 +169272,7 @@ uGM qwI lej fxs -cZo +wyd wyd rks rks @@ -169301,7 +169299,7 @@ vdX wGF isM gUH -pnz +mWy jYS qrR tMg @@ -181118,7 +181116,7 @@ izy tPu ldG pof -fGS +oII pbH uvU umu @@ -182639,7 +182637,7 @@ dfx cey stt lfQ -vNd +jtP nBM sPQ ezL diff --git a/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm b/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm index d73bbe538ff..7ccc791d718 100644 --- a/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm +++ b/_maps/skyrat/automapper/templates/metastation/metastation_armory.dmm @@ -117,9 +117,9 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, -/obj/item/melee/hammer, -/obj/item/melee/hammer, -/obj/item/melee/hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "u" = ( diff --git a/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm b/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm index 05c1c9e5d58..80ba797d148 100644 --- a/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm +++ b/_maps/skyrat/automapper/templates/tramstation/tramstation_armory.dmm @@ -39,10 +39,10 @@ /obj/item/gun/energy/e_gun/dragnet, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/melee/hammer, -/obj/item/melee/hammer, -/obj/item/melee/hammer, -/obj/item/melee/hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, +/obj/item/melee/breaching_hammer, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) "Mj" = ( diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index 2c6d71d2529..4bfb579d38e 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -50,5 +50,9 @@ #define COMSIG_ATOM_ATTACK_ROBOT "atom_attack_robot" /// from base of atom/attack_robot_secondary(): (mob/user) #define COMSIG_ATOM_ATTACK_ROBOT_SECONDARY "atom_attack_robot_secondary" -///from relay_attackers element: (atom/attacker) +///from relay_attackers element: (atom/attacker, attack_flags) #define COMSIG_ATOM_WAS_ATTACKED "atom_was_attacked" + ///The damage type of the weapon projectile is non-lethal stamina + #define ATTACKER_STAMINA_ATTACK (1<<0) + ///the attacker is shoving the source + #define ATTACKER_SHOVING (1<<1) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 2a6e3f266d1..1e973eb2174 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -224,6 +224,9 @@ ///called when getting the item's exact ratio for cargo's profit, without selling the item. #define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry" +/// Called on component/uplink/OnAttackBy(..) +#define COMSIG_ITEM_ATTEMPT_TC_REIMBURSE "item_attempt_tc_reimburse" + // /obj/item/clothing signals ///from [/mob/living/carbon/human/Move]: () diff --git a/code/__DEFINES/fonts.dm b/code/__DEFINES/fonts.dm index 3b2ec46b178..eab28820c41 100644 --- a/code/__DEFINES/fonts.dm +++ b/code/__DEFINES/fonts.dm @@ -14,3 +14,11 @@ /// Emoji icon set #define EMOJI_SET 'modular_skyrat/master_files/icons/emoji.dmi' // SKYRAT EDIT - ORIGINAL: 'icons/ui_icons/emoji/emoji.dmi' + +// Font metrics bitfield +/// Include leading A width and trailing C width in GetWidth() or in DrawText() +#define INCLUDE_AC (1<<0) + +DEFINE_BITFIELD(font_flags, list( + "INCLUDE_AC" = INCLUDE_AC, +)) diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index b1b145a0eb4..66769f07c6c 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -11,6 +11,11 @@ #define SMOOTH_QUEUED (1<<4) /// Smooths with objects, and will thus need to scan turfs for contents. #define SMOOTH_OBJ (1<<5) +/// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction +/// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in +/// it represents the sides of our directional border object that have a neighbor +/// Is incompatible with SMOOTH_CORNERS because border objects don't have corners +#define SMOOTH_BORDER_OBJECT (1<<6) DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_CORNERS" = SMOOTH_CORNERS, @@ -19,6 +24,7 @@ DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_QUEUED" = SMOOTH_QUEUED, "SMOOTH_OBJ" = SMOOTH_OBJ, + "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, )) @@ -146,6 +152,8 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM S_OBJ(24) ///turf/closed/indestructible/opsglass, /obj/structure/window/reinforced/plasma/plastitanium #define SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE S_OBJ(25) ///obj/structure/window/reinforced/shuttle +#define SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM S_OBJ(26) ///obj/structure/window/reinforced/tram + #define SMOOTH_GROUP_LATTICE S_OBJ(31) ///obj/structure/lattice #define SMOOTH_GROUP_CATWALK S_OBJ(32) ///obj/structure/lattice/catwalk diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 6b33c29bccc..dde4369c4cc 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -437,6 +437,7 @@ #define OFFSET_NECK "neck" #define OFFSET_HELD "held" #define OFFSET_ACCESSORY "accessory" // Skyrat edit - addition +#define OFFSET_HAIR "hair" // Skyrat edit - addition - Akulas //MINOR TWEAKS/MISC //#define AGE_MIN 17 //youngest a character can be //ORIGINAL @@ -613,6 +614,26 @@ #define AI_EMOTION_BLUE_GLOW "Blue Glow" #define AI_EMOTION_RED_GLOW "Red Glow" +///Defines for AI hologram preferences +#define AI_HOLOGRAM_BEAR "Bear" +#define AI_HOLOGRAM_CARP "Carp" +#define AI_HOLOGRAM_CAT "Cat" +#define AI_HOLOGRAM_CAT_2 "Cat Alternate" +#define AI_HOLOGRAM_CHICKEN "Chicken" +#define AI_HOLOGRAM_CORGI "Corgi" +#define AI_HOLOGRAM_COW "Cow" +#define AI_HOLOGRAM_CRAB "Crab" +#define AI_HOLOGRAM_DEFAULT "Default" +#define AI_HOLOGRAM_FACE "Floating Face" +#define AI_HOLOGRAM_FOX "Fox" +#define AI_HOLOGRAM_GOAT "Goat" +#define AI_HOLOGRAM_NARSIE "Narsie" +#define AI_HOLOGRAM_PARROT "Parrot" +#define AI_HOLOGRAM_PUG "Pug" +#define AI_HOLOGRAM_RATVAR "Ratvar" +#define AI_HOLOGRAM_SPIDER "Spider" +#define AI_HOLOGRAM_XENO "Xeno Queen" + /// Icon state to use for ai displays that just turns them off #define AI_DISPLAY_DONT_GLOW "ai_off" /// Throw modes, defines whether or not to turn off throw mode after @@ -663,47 +684,48 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// Total number of layers for mob overlays /// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK /// Also consider updating layers_to_offset -#define TOTAL_LAYERS 39 // SKYRAT EDIT CHANGE - ORIGINAL: #define TOTAL_LAYERS 33 - +#define TOTAL_LAYERS 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34 /// Mutations layer - Tk headglows, cold resistance glow, etc -#define MUTATIONS_LAYER 39 // SKYRAT EDIT CHANGE - ORIGINAL: 33 +#define MUTATIONS_LAYER 40 // SKYRAT EDIT CHANGE - ORIGINAL: 34 /// Mutantrace features (tail when looking south) that must appear behind the body parts -#define BODY_BEHIND_LAYER 38 // SKYRAT EDIT CHANGE - ORIGINAL: 32 +#define BODY_BEHIND_LAYER 39 // SKYRAT EDIT CHANGE - ORIGINAL: 33 /// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST -#define BODYPARTS_LOW_LAYER 37 // SKYRAT EDIT CHANGE - ORIGINAL: 31 +#define BODYPARTS_LOW_LAYER 38 // SKYRAT EDIT CHANGE - ORIGINAL: 32 /// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER -#define BODYPARTS_LAYER 36 // SKYRAT EDIT CHANGE - ORIGINAL: 30 +#define BODYPARTS_LAYER 37 // SKYRAT EDIT CHANGE - ORIGINAL: 31 /// Mutantrace features (snout, body markings) that must appear above the body parts -#define BODY_ADJ_LAYER 35 // SKYRAT EDIT CHANGE - ORIGINAL: 29 +#define BODY_ADJ_LAYER 36 // SKYRAT EDIT CHANGE - ORIGINAL: 30 /// Underwear, undershirts, socks, eyes, lips(makeup) -#define BODY_LAYER 34 // SKYRAT EDIT CHANGE - ORIGINAL: 28 +#define BODY_LAYER 35 // SKYRAT EDIT CHANGE - ORIGINAL: 29 /// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define FRONT_MUTATIONS_LAYER 33 // SKYRAT EDIT CHANGE - ORIGINAL: 27 +#define FRONT_MUTATIONS_LAYER 34 // SKYRAT EDIT CHANGE - ORIGINAL: 28 /// Damage indicators (cuts and burns) -#define DAMAGE_LAYER 32 // SKYRAT EDIT CHANGE - ORIGINAL: 26 -// SKYRAT EDIT ADDITION BEGIN. +#define DAMAGE_LAYER 33 // SKYRAT EDIT CHANGE - ORIGINAL: 27 +// SKYRAT EDIT ADDITION START /// This layer is used for things that shouldn't be over clothes, but should be over mutations -#define BODY_FRONT_UNDER_CLOTHES 31 +#define BODY_FRONT_UNDER_CLOTHES 32 // SKYRAT EDIT ADDITION END /// Jumpsuit clothing layer -#define UNIFORM_LAYER 30 // SKYRAT EDIT CHANGE - ORIGINAL: 25 +#define UNIFORM_LAYER 31 // SKYRAT EDIT CHANGE - ORIGINAL: 26 // SKYRAT EDIT ADDITION BEGIN - cursed layers under clothing -#define ANUS_LAYER 29 -#define VAGINA_LAYER 28 -#define PENIS_LAYER 27 -#define NIPPLES_LAYER 26 -#define BANDAGE_LAYER 25 +#define ANUS_LAYER 30 +#define VAGINA_LAYER 29 +#define PENIS_LAYER 28 +#define NIPPLES_LAYER 27 +#define BANDAGE_LAYER 26 //SKYRAT EDIT ADDITION END /// ID card layer -#define ID_LAYER 24 +#define ID_LAYER 25 /// ID card layer (might be deprecated) -#define ID_CARD_LAYER 23 +#define ID_CARD_LAYER 24 /// Layer for bodyparts that should appear above every other bodypart - Currently only used for hands -#define BODYPARTS_HIGH_LAYER 22 +#define BODYPARTS_HIGH_LAYER 23 /// Gloves layer -#define GLOVES_LAYER 21 +#define GLOVES_LAYER 22 /// Shoes layer -#define SHOES_LAYER 20 +#define SHOES_LAYER 21 +/// Layer for masks that are worn below ears and eyes (like Balaclavas) (layers below hair, use flagsinv=HIDEHAIR as needed) +#define LOW_FACEMASK_LAYER 20 /// Ears layer (Spessmen have ears? Wow) #define EARS_LAYER 19 /// Suit layer (armor, coats, etc.) @@ -770,6 +792,7 @@ GLOBAL_LIST_INIT(layers_to_offset, list( "[ID_CARD_LAYER]" = UPPER_BODY, // unused "[ID_LAYER]" = UPPER_BODY, "[FACEMASK_LAYER]" = UPPER_BODY, + "[LOW_FACEMASK_LAYER]" = UPPER_BODY, // These two are cached, and have their appearance shared(?), so it's safer to just not touch it "[MUTATIONS_LAYER]" = NO_MODIFY, "[FRONT_MUTATIONS_LAYER]" = NO_MODIFY, @@ -798,6 +821,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list( #define EXTERNAL_FRONT_UNDER_CLOTHES (1 << 4) /// Draws organ on the ABOVE_BODY_FRONT_HEAD_LAYER #define EXTERNAL_FRONT_OVER (1 << 5) +/// Draws organ on the HEAD_LAYER, for things that need to be above hair but below hats. +#define EXTERNAL_FRONT_ABOVE_HAIR (1 << 6) // SKYRAT EDIT END (not touching what comes next because we don't actually have to (nor want to)) /// Draws organ on all EXTERNAL layers #define ALL_EXTERNAL_OVERLAYS EXTERNAL_FRONT | EXTERNAL_ADJACENT | EXTERNAL_BEHIND diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 69cec5262a2..419b0c1176e 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -54,7 +54,11 @@ #define QDELETED(X) (isnull(X) || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) -#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE) +// This is a bit hacky, we do it to avoid people relying on a return value for the macro +// If you need that you should use QDEL_IN_STOPPABLE instead +#define QDEL_IN(item, time) ; \ + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time); +#define QDEL_IN_STOPPABLE(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE) #define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME) #define QDEL_NULL(item) qdel(item); item = null #define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 7bee2b1040b..e874b68f02b 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -146,11 +146,11 @@ #define MAX_ADDICTION_POINTS 1000 ///Addiction start/ends -#define WITHDRAWAL_STAGE1_START_CYCLE 61 -#define WITHDRAWAL_STAGE1_END_CYCLE 120 -#define WITHDRAWAL_STAGE2_START_CYCLE 121 -#define WITHDRAWAL_STAGE2_END_CYCLE 180 -#define WITHDRAWAL_STAGE3_START_CYCLE 181 +#define WITHDRAWAL_STAGE1_START_CYCLE 121 // SKYRAT EDIT CHANGE - Original 61 +#define WITHDRAWAL_STAGE1_END_CYCLE 240 // SKYRAT EDIT CHANGE - Original 120 +#define WITHDRAWAL_STAGE2_START_CYCLE 241 // SKYRAT EDIT CHANGE - Original 121 +#define WITHDRAWAL_STAGE2_END_CYCLE 360 // SKYRAT EDIT CHANGE - Original 180 +#define WITHDRAWAL_STAGE3_START_CYCLE 361 // SKYRAT EDIT CHANGE - Original 181 ///reagent tags - used to look up reagents for specific effects. Feel free to add to but comment it /// This reagent does brute effects (BOTH damaging and healing) diff --git a/code/__DEFINES/text.dm b/code/__DEFINES/text.dm index df891b4c5a8..33314003a51 100644 --- a/code/__DEFINES/text.dm +++ b/code/__DEFINES/text.dm @@ -4,9 +4,18 @@ /// Prepares a text to be used for maptext. Use this so it doesn't look hideous. #define MAPTEXT(text) {"[##text]"} -/// Prepares a text to be used for maptext, using a font that can handle larger text better. +/// Prepares a text to be used for maptext, using a variable size font. +/// Variable size font. More flexible but doesn't scale pixel perfect to BYOND icon resolutions. (May be blurry.) Can use any size in pt or px. #define MAPTEXT_VCR_OSD_MONO(text) {"[##text]"} +/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices. +/// Standard size (ie: normal runechat) Use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing +#define MAPTEXT_GRAND9K(text) {"[##text]"} + +/// Prepares a text to be used for maptext using a pixel font. Cleaner but less size choices. +/// Small size. (ie: whisper runechat) Use only size pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +#define MAPTEXT_TINY_UNICODE(text) {"[##text]"} + /// Macro from Lummox used to get height from a MeasureText proc. /// resolves the MeasureText() return value once, then resolves the height, then sets return_var to that. #define WXH_TO_HEIGHT(measurement, return_var) \ diff --git a/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm b/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm new file mode 100644 index 00000000000..cbe4c508686 --- /dev/null +++ b/code/__DEFINES/~skyrat_defines/_HELPERS/offset_index.dm @@ -0,0 +1,3 @@ +/// The axis of the `offset_features` list in the species datum +#define INDEX_X 1 +#define INDEX_Y 2 diff --git a/code/__DEFINES/~skyrat_defines/combat.dm b/code/__DEFINES/~skyrat_defines/combat.dm index ba26996625c..1451b99381f 100644 --- a/code/__DEFINES/~skyrat_defines/combat.dm +++ b/code/__DEFINES/~skyrat_defines/combat.dm @@ -19,6 +19,9 @@ //Grab breakout odds #define OVERSIZED_GRAB_RESIST_BONUS 0 // BUBBER EDIT- With this oversized are just as good at grabs as anyone else. +//Grab breakout bonus for akulas when at 10+ wet_stacks +#define AKULA_GRAB_RESIST_BONUS 10 + // Damage modifiers #define OVERSIZED_HARM_DAMAGE_BONUS 5 /// Those with the oversized trait do 5 more damage. diff --git a/code/__DEFINES/~skyrat_defines/mobs.dm b/code/__DEFINES/~skyrat_defines/mobs.dm index 8fde92fb39d..469f332bbfc 100644 --- a/code/__DEFINES/~skyrat_defines/mobs.dm +++ b/code/__DEFINES/~skyrat_defines/mobs.dm @@ -16,6 +16,7 @@ #define BODYPART_ICON_HUMAN 'modular_skyrat/modules/bodyparts/icons/human_parts_greyscale.dmi' #define BODYPART_ICON_MAMMAL 'modular_skyrat/modules/bodyparts/icons/mammal_parts_greyscale.dmi' #define BODYPART_ICON_AKULA 'modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi' +#define BODYPART_ICON_AQUATIC 'modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi' #define BODYPART_ICON_GHOUL 'modular_skyrat/modules/bodyparts/icons/ghoul_bodyparts.dmi' #define BODYPART_ICON_INSECT 'modular_skyrat/modules/bodyparts/icons/insect_parts_greyscale.dmi' #define BODYPART_ICON_LIZARD 'modular_skyrat/modules/bodyparts/icons/lizard_parts_greyscale.dmi' diff --git a/code/__DEFINES/~skyrat_defines/signals.dm b/code/__DEFINES/~skyrat_defines/signals.dm index 414f68c1f26..1645b301f65 100644 --- a/code/__DEFINES/~skyrat_defines/signals.dm +++ b/code/__DEFINES/~skyrat_defines/signals.dm @@ -20,7 +20,7 @@ ///The gun needs to update the gun hud! #define COMSIG_UPDATE_AMMO_HUD "update_ammo_hud" -/// Used by /obj/item/melee/hammer +/// Used by /obj/item/melee/breaching_hammer #define COMSIG_BREACHING "breaching_signal_woop_woop" ///The gun has jammed. #define COMSIG_GUN_JAMMED "gun_jammed" @@ -59,6 +59,9 @@ ///from base of /obj/effect/abstract/liquid_turf/Initialize() (/obj/effect/abstract/liquid_turf/liquids) #define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation" +/// listens to wet_stacks, if wetting a mob above 10 stacks it will signal the akula race trait to apply its buffs and nerfs +#define COMSIG_MOB_TRIGGER_WET_SKIN "mob_trigger_wet_skin" + //when someone casts their fishing rod #define COMSIG_START_FISHING "start_fishing" //when someone pulls back their fishing rod diff --git a/code/__DEFINES/~skyrat_defines/traits.dm b/code/__DEFINES/~skyrat_defines/traits.dm index f949db61027..f6bfc4fa6f3 100644 --- a/code/__DEFINES/~skyrat_defines/traits.dm +++ b/code/__DEFINES/~skyrat_defines/traits.dm @@ -33,6 +33,15 @@ /// One can breath under water, you get me? #define TRAIT_WATER_BREATHING "water_breathing" +/// The trait which Akulas inherit, for their species mechanic revolving around wet_stacks +#define TRAIT_SLICK_SKIN "slick_skin" +/// The trait which is applied when a `slick skin` trait haver actually gets wet_stacks +#define TRAIT_SLIPPERY "slippery" +/// The minimum amount of tiles a TRAIT_SLIPPERY haver will slide on slip +#define SLIPPERY_MIN 5 +/// The maximum amount of tiles a TRAIT_SLIPPERY haver will slide on slip +#define SLIPPERY_MAX 9 + /// Under the effect of a numbling agent, such as morphine, for surgery. #define TRAIT_NUMBED "numbed" diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 2ad8e2a4121..6fa6903be2e 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -45,11 +45,87 @@ DEFINE_BITFIELD(smoothing_junction, list( "NORTHWEST_JUNCTION" = NORTHWEST_JUNCTION, )) - #define NO_ADJ_FOUND 0 #define ADJ_FOUND 1 #define NULLTURF_BORDER 2 +GLOBAL_LIST_INIT(adjacent_direction_lookup, generate_adjacent_directions()) + +/* Attempting to mirror the below + * Each 3x3 grid is a tile, with each X representing a direction a border object could be in IN said grid + * Directions marked with A are acceptable smoothing targets, M is the example direction + * The example given here is of a northfacing border object +xxx xxx xxx +xxx AxA xxx +xxx xAx xxx + +xAx xMx xAx +xxx AxA xxx +xxx xxx xxx + +xxx xxx xxx +xxx xxx xxx +xxx xxx xxx +*/ +/// Encodes connectivity between border objects +/// Returns a list accessable by a border object's dir, the direction between it and a target, and a target +/// Said list will return the direction the two objects connect, if any exists (if the target isn't a border object and the direction is fine, return the inverse of the direction in use) +/proc/generate_adjacent_directions() + // Have to hold all conventional dir pairs, so we size to the largest + // We don't HAVE diagonal border objects, so I'm gonna pretend they'll never exist + + // You might be like, lemon, can't we use GLOB.cardinals/GLOB.alldirs here + // No, they aren't loaded yet. life is pain + var/list/cardinals = list(NORTH, SOUTH, EAST, WEST) + var/list/alldirs = cardinals + list(NORTH|EAST, SOUTH|EAST, NORTH|WEST, SOUTH|WEST) + var/largest_cardinal = max(cardinals) + var/largest_dir = max(alldirs) + + var/list/direction_map = new /list(largest_cardinal) + for(var/dir in cardinals) + var/left = turn(dir, 90) + var/right = turn(dir, -90) + var/opposite = turn(dir, 180) + // Need to encode diagonals here because it's possible, even if it is always false + var/list/acceptable_adjacents = new /list(largest_dir) + // Alright, what directions are acceptable to us + for(var/connectable_dir in (cardinals + NONE)) + // And what border objects INSIDE those directions are alright + var/list/smoothable_dirs = new /list(largest_cardinal + 1) // + 1 because we need to provide space for NONE to be a valid index + // None is fine, we want to smooth with things on our own turf + // We'll do the two dirs to our left and right + // They connect.. "below" us and on their side + if(connectable_dir == NONE) + smoothable_dirs[left] = opposite | left + smoothable_dirs[right] = opposite | right + // If it's to our right or left we'll include just the dir matching ours + // Left edge touches only our left side, and so on + else if (connectable_dir == left) + smoothable_dirs[dir] = left + else if (connectable_dir == right) + smoothable_dirs[dir] = right + // If it's straight on we'll include all cardinals but us, since all 3 bits would touch us + // Turf opposite gets just our dir as the connection, the other two get our dir + theirs + // Since they touch the edges + else if(connectable_dir == dir) + smoothable_dirs[opposite] = dir + smoothable_dirs[left] = dir | left + smoothable_dirs[right] = dir | right + // otherwise, go HOME, I don't want to encode anything for you + else + continue + acceptable_adjacents[connectable_dir + 1] = smoothable_dirs + direction_map[dir] = acceptable_adjacents + return direction_map + +/// Are two atoms border adjacent, takes a border object, something to compare against, and the direction between A and B +/// Returns the way in which the first thing is adjacent to the second +#define CAN_DIAGONAL_SMOOTH(border_obj, target, direction) (\ + (target.smoothing_flags & SMOOTH_BORDER_OBJECT) ? \ + GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]?[target.dir] : \ + (GLOB.adjacent_direction_lookup[border_obj.dir][direction + 1]) ? turn(direction, 180) : NONE \ + ) + #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" @@ -298,44 +374,82 @@ DEFINE_BITFIELD(smoothing_junction, list( var/smooth_border = (smoothing_flags & SMOOTH_BORDER) var/smooth_obj = (smoothing_flags & SMOOTH_OBJ) + var/border_object_smoothing = (smoothing_flags & SMOOTH_BORDER_OBJECT) - #define SET_ADJ_IN_DIR(direction, direction_flag) \ - set_adj_in_dir: { \ - do { \ - var/turf/neighbor = get_step(src, direction); \ - if(neighbor) { \ - var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ - if(neighbor_smoothing_groups) { \ + // Did you know you can pass defines into other defines? very handy, lets take advantage of it here to allow 0 cost variation + #define SEARCH_ADJ_IN_DIR(direction, direction_flag, ADJ_FOUND, WORLD_BORDER, BORDER_CHECK) \ + do { \ + var/turf/neighbor = get_step(src, direction); \ + if(neighbor && ##BORDER_CHECK(neighbor, direction)) { \ + var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ + if(neighbor_smoothing_groups) { \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ + ##ADJ_FOUND(neighbor, direction, direction_flag); \ + } \ + } \ + } \ + if(smooth_obj) { \ + for(var/atom/movable/thing as anything in neighbor) { \ + var/thing_smoothing_groups = thing.smoothing_groups; \ + if(!thing.anchored || isnull(thing_smoothing_groups) || !##BORDER_CHECK(thing, direction)) { \ + continue; \ + }; \ for(var/target in canSmoothWith) { \ - if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ - new_junction |= direction_flag; \ - break set_adj_in_dir; \ - }; \ - }; \ - }; \ - if(smooth_obj) { \ - for(var/atom/movable/thing as anything in neighbor) { \ - var/thing_smoothing_groups = thing.smoothing_groups; \ - if(!thing.anchored || isnull(thing_smoothing_groups)) { \ - continue; \ - }; \ - for(var/target in canSmoothWith) { \ - if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ - new_junction |= direction_flag; \ - break set_adj_in_dir; \ - }; \ - }; \ - }; \ - }; \ - } else if (smooth_border) { \ - new_junction |= direction_flag; \ - }; \ - } while(FALSE) \ - } + if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ + ##ADJ_FOUND(thing, direction, direction_flag); \ + } \ + } \ + } \ + } \ + } else if (smooth_border) { \ + ##WORLD_BORDER(null, direction, direction_flag); \ + } \ + } while(FALSE) \ - for(var/direction in GLOB.cardinals) //Cardinal case first. - SET_ADJ_IN_DIR(direction, direction) + #define BITMASK_FOUND(target, direction, direction_flag) \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + /// Check that non border objects use to smooth against border objects + /// Returns true if the smooth is acceptable, FALSE otherwise + #define BITMASK_ON_BORDER_CHECK(target, direction) (!(target.smoothing_flags & SMOOTH_BORDER_OBJECT) || CAN_DIAGONAL_SMOOTH(target, src, turn(direction, 180))) + #define BORDER_FOUND(target, direction, direction_flag) new_junction |= CAN_DIAGONAL_SMOOTH(src, target, direction) + // Border objects require an object as context, so we need a dummy. I'm sorry + #define WORLD_BORDER_FOUND(target, direction, direction_flag) \ + var/static/atom/dummy; \ + if(!dummy) { \ + dummy = new(); \ + dummy.smoothing_flags &= ~SMOOTH_BORDER_OBJECT; \ + } \ + BORDER_FOUND(dummy, direction, direction_flag); + // Handle handle border on border checks. no-op, we handle this check inside CAN_DIAGONAL_SMOOTH + #define BORDER_ON_BORDER_CHECK(target, direction) (TRUE) + + // We're building 2 different types of smoothing searches here + // One for standard bitmask smoothing (We provide a label so our macro can eary exit, as it wants to do) + #define SET_ADJ_IN_DIR(direction, direction_flag) do { set_adj_in_dir: { SEARCH_ADJ_IN_DIR(direction, direction_flag, BITMASK_FOUND, BITMASK_FOUND, BITMASK_ON_BORDER_CHECK) }} while(FALSE) + // and another for border object work (Doesn't early exit because we can hit more then one direction by checking the same turf) + #define SET_BORDER_ADJ_IN_DIR(direction) SEARCH_ADJ_IN_DIR(direction, direction, BORDER_FOUND, WORLD_BORDER_FOUND, BORDER_ON_BORDER_CHECK) + + // Let's go over all our cardinals + if(border_object_smoothing) + SET_BORDER_ADJ_IN_DIR(NORTH) + SET_BORDER_ADJ_IN_DIR(SOUTH) + SET_BORDER_ADJ_IN_DIR(EAST) + SET_BORDER_ADJ_IN_DIR(WEST) + // We want to check against stuff in our own turf + SET_BORDER_ADJ_IN_DIR(NONE) + // Border objects don't do diagonals, so GO HOME + set_smoothed_icon_state(new_junction) + return + + SET_ADJ_IN_DIR(NORTH, NORTH) + SET_ADJ_IN_DIR(SOUTH, SOUTH) + SET_ADJ_IN_DIR(EAST, EAST) + SET_ADJ_IN_DIR(WEST, WEST) + + // If there's nothing going on already if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) set_smoothed_icon_state(new_junction) return @@ -356,10 +470,16 @@ DEFINE_BITFIELD(smoothing_junction, list( set_smoothed_icon_state(new_junction) + #undef SET_BORDER_ADJ_IN_DIR #undef SET_ADJ_IN_DIR + #undef BORDER_ON_BORDER_CHECK + #undef WORLD_BORDER_FOUND + #undef BORDER_FOUND + #undef BITMASK_ON_BORDER_CHECK + #undef BITMASK_FOUND + #undef SEARCH_ADJ_IN_DIR - -///Changes the icon state based on the new junction bitmask. Returns the old junction value. +///Changes the icon state based on the new junction bitmask /atom/proc/set_smoothed_icon_state(new_junction) . = smoothing_junction smoothing_junction = new_junction @@ -368,12 +488,12 @@ DEFINE_BITFIELD(smoothing_junction, list( /turf/closed/set_smoothed_icon_state(new_junction) // Avoid calling ..() here to avoid setting icon_state twice, which is expensive given how hot this proc is - . = smoothing_junction + var/old_junction = smoothing_junction smoothing_junction = new_junction if (!(smoothing_flags & SMOOTH_DIAGONAL_CORNERS)) icon_state = "[base_icon_state]-[smoothing_junction]" - return . + return switch(new_junction) if( @@ -387,8 +507,8 @@ DEFINE_BITFIELD(smoothing_junction, list( SOUTH_JUNCTION|EAST_JUNCTION|SOUTHEAST_JUNCTION, ) icon_state = "[base_icon_state]-[smoothing_junction]-d" - if(new_junction == . || fixed_underlay) // Mutable underlays? - return . + if(new_junction == old_junction || fixed_underlay) // Mutable underlays? + return var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) @@ -537,3 +657,4 @@ DEFINE_BITFIELD(smoothing_junction, list( #undef DEFAULT_UNDERLAY_ICON #undef DEFAULT_UNDERLAY_ICON_STATE +#undef CAN_DIAGONAL_SMOOTH diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 9353bc79eeb..2a4854c37b8 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -69,6 +69,10 @@ // We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/ // #define USE_BYOND_TRACY +// If defined, we will compile with FULL timer debug info, rather then a limited scope +// Be warned, this increases timer creation cost by 5x +// #define TIMER_DEBUG + // If defined, we will NOT defer asset generation till later in the game, and will instead do it all at once, during initiialize //#define DO_NOT_DEFER_ASSETS @@ -94,7 +98,7 @@ #endif #ifndef PRELOAD_RSC //set to: -#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; +#define PRELOAD_RSC 1 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; @@ -124,6 +128,8 @@ #define GC_FAILURE_HARD_LOOKUP //Ensures all early assets can actually load early #define DO_NOT_DEFER_ASSETS +//Test at full capacity, the extra cost doesn't matter +#define TIMER_DEBUG #endif #ifdef TGS diff --git a/code/_globalvars/lists/ambience.dm b/code/_globalvars/lists/ambience.dm index 386b863d435..640306fa5a2 100644 --- a/code/_globalvars/lists/ambience.dm +++ b/code/_globalvars/lists/ambience.dm @@ -102,6 +102,7 @@ GLOBAL_LIST_INIT(space_ambience,list( 'sound/ambience/ambispace2.ogg', 'sound/ambience/ambispace3.ogg', 'sound/ambience/ambispace4.ogg', + 'sound/ambience/ambispace5.ogg', 'sound/ambience/title2.ogg', )) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index efa6b6b5aa7..7b4c4ff64d9 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -127,68 +127,6 @@ GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list( )) //stores the ghost forms that support hair and other such things -GLOBAL_LIST_INIT(ai_core_display_screens, sort_list(list( - ":thinking:", - "Alien", - "Angel", - "Banned", - "Bliss", - "Blue", - "Clown", - "Database", - "Dorf", - "Firewall", - "Fuzzy", - "Gentoo", - "Glitchman", - "Gondola", - "Goon", - "Hades", - "HAL 9000", - "Heartline", - "Helios", - "House", - "Inverted", - "Matrix", - "Monochrome", - "Murica", - "Nanotrasen", - "Not Malf", - "Portrait", - "President", - "Rainbow", - "Random", - "Red October", - "Red", - "Static", - "Syndicat Meow", - "Text", - "Too Deep", - "Triumvirate-M", - "Triumvirate", - "Weird", -))) - -/// A form of resolve_ai_icon that is guaranteed to never sleep. -/// Not always accurate, but always synchronous. -/proc/resolve_ai_icon_sync(input) - SHOULD_NOT_SLEEP(TRUE) - - if(!input || !(input in GLOB.ai_core_display_screens)) - return "ai" - else - if(input == "Random") - input = pick(GLOB.ai_core_display_screens - "Random") - return "ai-[lowertext(input)]" - -/proc/resolve_ai_icon(input) - if (input == "Portrait") - var/datum/portrait_picker/tgui = new(usr)//create the datum - tgui.ui_interact(usr)//datum has a tgui component, here we open the window - return "ai-portrait" //just take this until they decide - - return resolve_ai_icon_sync(input) - GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list( SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 13a6befbd04..14e58869389 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,11 +1,13 @@ +#define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS flags = SS_NO_FIRE - var/old_initialized - /// A count of how many initalize changes we've made. We want to prevent old_initialize being overriden by some other value, breaking init code - var/initialized_changed = 0 + /// A stack of list(source, desired initialized state) + /// We read the source of init changes from the last entry, and assert that all changes will come with a reset + var/list/initialized_state = list() + var/base_initialized var/list/late_loaders = list() @@ -39,11 +41,11 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK CreateAtoms(atoms, atoms_to_return) - clear_tracked_initalize() + clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -158,35 +160,43 @@ SUBSYSTEM_DEF(atoms) return qdeleted || QDELING(A) -/datum/controller/subsystem/atoms/proc/map_loader_begin() - set_tracked_initalized(INITIALIZATION_INSSATOMS) +/datum/controller/subsystem/atoms/proc/map_loader_begin(source) + set_tracked_initalized(INITIALIZATION_INSSATOMS, source) -/datum/controller/subsystem/atoms/proc/map_loader_stop() - clear_tracked_initalize() +/datum/controller/subsystem/atoms/proc/map_loader_stop(source) + clear_tracked_initalize(source) -/// Use this to set initialized to prevent error states where old_initialized is overriden. It keeps happening and it's cheesing me off -/datum/controller/subsystem/atoms/proc/set_tracked_initalized(value) - if(!initialized_changed) - old_initialized = initialized - initialized = value - else - stack_trace("We started maploading while we were already maploading. You doing something odd?") - initialized_changed += 1 +/// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context +/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially +/datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) + if(!length(initialized_state)) + base_initialized = initialized + initialized_state += list(list(source, state)) + initialized = state -/datum/controller/subsystem/atoms/proc/clear_tracked_initalize() - initialized_changed -= 1 - if(!initialized_changed) - initialized = old_initialized +/datum/controller/subsystem/atoms/proc/clear_tracked_initalize(source) + if(!length(initialized_state)) + return + for(var/i in length(initialized_state) to 1 step -1) + if(initialized_state[i][1] == source) + initialized_state.Cut(i, i+1) + break + + if(!length(initialized_state)) + initialized = base_initialized + base_initialized = INITIALIZATION_INNEW_REGULAR + return + initialized = initialized_state[length(initialized_state)][2] /// Returns TRUE if anything is currently being initialized /datum/controller/subsystem/atoms/proc/initializing_something() - return initialized_changed > 0 + return length(initialized_state) > 1 /datum/controller/subsystem/atoms/Recover() initialized = SSatoms.initialized if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() - old_initialized = SSatoms.old_initialized + initialized_state = SSatoms.initialized_state BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() @@ -238,3 +248,5 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") + +#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 025914a428f..6945dc643f6 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -22,6 +22,9 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums var/rounds_since_engine_exploded = 0 + var/delam_highscore = 0 + var/tram_hits_this_round = 0 + var/tram_hits_last_round = 0 /datum/controller/subsystem/persistence/Initialize() load_poly() @@ -33,8 +36,8 @@ SUBSYSTEM_DEF(persistence) load_randomized_recipes() load_custom_outfits() load_delamination_counter() + load_tram_counter() load_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER - load_adventures() return SS_INIT_SUCCESS @@ -50,6 +53,8 @@ SUBSYSTEM_DEF(persistence) save_modular_persistence() // SKYRAT EDIT ADDITION - MODULAR_PERSISTENCE save_custom_outfits() save_delamination_counter() + if(SStramprocess.can_fire) + save_tram_counter() save_panic_bunker() //SKYRAT EDIT ADDITION - PANICBUNKER ///Loads up Poly's speech buffer. @@ -534,19 +539,35 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(file, json_encode(data)) -/// Location where we save the information about how many rounds it has been since the engine blew up +/// Location where we save the information about how many rounds it has been since the engine blew up/tram hits #define DELAMINATION_COUNT_FILEPATH "data/rounds_since_delamination.txt" +#define DELAMINATION_HIGHSCORE_FILEPATH "data/delamination_highscore.txt" +#define TRAM_COUNT_FILEPATH "data/tram_hits_last_round.txt" /datum/controller/subsystem/persistence/proc/load_delamination_counter() if (!fexists(DELAMINATION_COUNT_FILEPATH)) return rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH)) - for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) - sign.update_count(rounds_since_engine_exploded) + if (fexists(DELAMINATION_HIGHSCORE_FILEPATH)) + delam_highscore = text2num(file2text(DELAMINATION_HIGHSCORE_FILEPATH)) + for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + sign.update_delam_count(rounds_since_engine_exploded, delam_highscore) /datum/controller/subsystem/persistence/proc/save_delamination_counter() rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_COUNT_FILEPATH) + if((rounds_since_engine_exploded + 1) > delam_highscore) + rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_HIGHSCORE_FILEPATH) + +/datum/controller/subsystem/persistence/proc/load_tram_counter() + if(!fexists(TRAM_COUNT_FILEPATH)) + return + tram_hits_last_round = text2num(file2text(TRAM_COUNT_FILEPATH)) + +/datum/controller/subsystem/persistence/proc/save_tram_counter() + rustg_file_write("[tram_hits_this_round]", TRAM_COUNT_FILEPATH) #undef DELAMINATION_COUNT_FILEPATH +#undef DELAMINATION_HIGHSCORE_FILEPATH +#undef TRAM_COUNT_FILEPATH #undef FILE_RECENT_MAPS #undef KEEP_ROUNDS_MAP diff --git a/code/controllers/subsystem/processing/digital_clock.dm b/code/controllers/subsystem/processing/digital_clock.dm new file mode 100644 index 00000000000..5ca22f58beb --- /dev/null +++ b/code/controllers/subsystem/processing/digital_clock.dm @@ -0,0 +1,5 @@ +/// The subsystem used to tick digital clocks +PROCESSING_SUBSYSTEM_DEF(digital_clock) + name = "digital_clock" + flags = SS_NO_INIT|SS_BACKGROUND|SS_KEEP_TIMING + wait = 1 SECONDS diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index af6f346cd76..9bd56294c69 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -503,11 +503,18 @@ SUBSYSTEM_DEF(timer) * If the timed event is tracking client time, it will be added to a special bucket. */ /datum/timedevent/proc/bucketJoin() - // Generate debug-friendly name for timer +#if defined(TIMER_DEBUG) + // Generate debug-friendly name for timer, more complex but also more expensive var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [jointext(bitfield_to_list(flags, bitfield_flags), ", ")], \ callBack: [text_ref(callBack)], callBack.object: [callBack.object][text_ref(callBack.object)]([getcallingtype()]), \ callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""]), source: [source]" +#else + // Generate a debuggable name for the timer, simpler but wayyyy cheaper, string generation is a bitch and this saves a LOT of time + name = "Timer: [id] ([text_ref(src)]), TTR: [timeToRun], wait:[wait] Flags: [flags], \ + callBack: [text_ref(callBack)], callBack.object: [callBack.object]([getcallingtype()]), \ + callBack.delegate:[callBack.delegate], source: [source]" +#endif if (bucket_joined) stack_trace("Bucket already joined! [name]") diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index e6155262325..188d5705974 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -44,7 +44,7 @@ SUBSYSTEM_DEF(tts) return ..() /datum/controller/subsystem/tts/stat_entry(msg) - msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages.L)]|Avg:[average_tts_messages_time]" + msg = "Active:[length(in_process_http_messages)]|Standby:[length(queued_http_messages?.L)]|Avg:[average_tts_messages_time]" return ..() /proc/cmp_word_length_asc(datum/tts_request/a, datum/tts_request/b) diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index 468e498e959..7866e0831ca 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -285,6 +285,7 @@ name = "Titan's Finale" desc = "A single-use ability that shoots a large amount of projectiles around you." cooldown_time = 2.5 SECONDS + projectile_type = /obj/projectile/colossus /datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/Activate(atom/target_atom) . = ..() diff --git a/code/datums/bodypart_overlays/bodypart_overlay.dm b/code/datums/bodypart_overlays/bodypart_overlay.dm index 2eb9bcb017b..5b6232fd303 100644 --- a/code/datums/bodypart_overlays/bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/bodypart_overlay.dm @@ -4,7 +4,7 @@ ///Sometimes we need multiple layers, for like the back, middle and front of the person (EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) var/layers ///List of all possible layers. Used for looping through in drawing - var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER) // SKYRAT EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) + var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND, EXTERNAL_FRONT_UNDER_CLOTHES, EXTERNAL_FRONT_OVER, EXTERNAL_FRONT_ABOVE_HAIR) // SKYRAT EDIT - Customization - ORIGINAL: var/static/list/all_layers = list(EXTERNAL_FRONT, EXTERNAL_ADJACENT, EXTERNAL_BEHIND) ///Key of the icon states of all the sprite_datums for easy caching var/cache_key = "" @@ -51,6 +51,8 @@ return "FRONT_UNDER" if(-ABOVE_BODY_FRONT_HEAD_LAYER) return "FRONT_OVER" + if(-HEAD_LAYER) + return "FRONT_OVER_HAIR" //SKYRAT EDIT ADDITION END ///Converts a bitflag to the right layer. I'd love to make this a static index list, but byond made an attempt on my life when i did @@ -67,6 +69,8 @@ return -BODY_FRONT_UNDER_CLOTHES if(EXTERNAL_FRONT_OVER) return -ABOVE_BODY_FRONT_HEAD_LAYER + if(EXTERNAL_FRONT_ABOVE_HAIR) + return -HEAD_LAYER //SKYRAT EDIT ADDITION END ///Check whether we can draw the overlays. You generally don't want lizard snouts to draw over an EVA suit diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index d0be9df52b4..65eb5d31ceb 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -45,7 +45,7 @@ message = pick_list_replacements(BRAIN_DAMAGE_FILE, "god_neutral") playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) - voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name) + voice_of_god(message, owner, list("colossus","yell"), 2.5, include_owner, name, TRUE) /datum/brain_trauma/special/bluespace_prophet name = "Bluespace Prophecy" diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 3debadbda70..83494ef5361 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -13,7 +13,7 @@ /// Approximate height in pixels of an 'average' line, used for height decay #define CHAT_MESSAGE_APPROX_LHEIGHT 11 /// Max width of chat message in pixels -#define CHAT_MESSAGE_WIDTH 96 +#define CHAT_MESSAGE_WIDTH 112 /// The dimensions of the chat message icons #define CHAT_MESSAGE_ICON_SIZE 9 @@ -145,6 +145,10 @@ if (!ismob(target)) extra_classes |= "small" + // Why are you yelling? + if(copytext_char(text, -2) == "!!") + extra_classes |= SPAN_YELL + var/list/prefixes // Append radio icon if from a virtual speaker @@ -171,7 +175,7 @@ var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color // Approximate text height - var/complete_text = "[owner.say_emphasis(text)]" + var/complete_text = "[owner.say_emphasis(text)]" var/mheight WXH_TO_HEIGHT(owned_by.MeasureText(complete_text, null, CHAT_MESSAGE_WIDTH), mheight) diff --git a/code/datums/components/crafting/atmospheric.dm b/code/datums/components/crafting/atmospheric.dm index 29600769f37..955c9704abd 100644 --- a/code/datums/components/crafting/atmospheric.dm +++ b/code/datums/components/crafting/atmospheric.dm @@ -29,6 +29,15 @@ time = 2 SECONDS category = CAT_ATMOSPHERIC +/datum/crafting_recipe/air_sensor + name = "Monitored Air Sensor" + result = /obj/item/air_sensor + reqs = list( + /obj/item/analyzer = 1, + /obj/item/stack/sheet/iron = 1, + ) + blacklist = list(/obj/item/analyzer/ranged) + /datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result) var/obj/item/pipe/crafted_pipe = result crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 35392298990..428f6c5e881 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -122,23 +122,19 @@ if(isstack(item)) var/obj/item/stack/stack = item .["other"][item.type] += stack.amount - else if(item.tool_behaviour) - .["tool_behaviour"] += item.tool_behaviour - .["other"][item.type] += 1 - else - if(is_reagent_container(item)) - var/obj/item/reagent_containers/container = item - if(container.is_drainable()) - for(var/datum/reagent/reagent in container.reagents.reagent_list) - .["other"][reagent.type] += reagent.volume + else if(is_reagent_container(item) && item.is_drainable() && length(item.reagents.reagent_list)) //some container that has some reagents inside it that can be drained + var/obj/item/reagent_containers/container = item + for(var/datum/reagent/reagent as anything in container.reagents.reagent_list) + .["other"][reagent.type] += reagent.volume + else //a reagent container that is empty can also be used as a tool. e.g. glass bottle can be used as a rolling pin + if(item.tool_behaviour) + .["tool_behaviour"] += item.tool_behaviour .["other"][item.type] += 1 else if (ismachinery(object)) LAZYADDASSOCLIST(.["machinery"], object.type, object) else if (isstructure(object)) LAZYADDASSOCLIST(.["structures"], object.type, object) - - /// Returns a boolean on whether the tool requirements of the input recipe are satisfied by the input source and surroundings. /datum/component/personal_crafting/proc/check_tools(atom/source, datum/crafting_recipe/recipe, list/surroundings) if(!length(recipe.tool_behaviors) && !length(recipe.tool_paths)) diff --git a/code/datums/components/food_storage.dm b/code/datums/components/food_storage.dm index 5ef93a206a8..60fc3f6c486 100644 --- a/code/datums/components/food_storage.dm +++ b/code/datums/components/food_storage.dm @@ -18,9 +18,11 @@ /datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(try_inserting_item)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY_SECONDARY, PROC_REF(try_inserting_item)) RegisterSignal(parent, COMSIG_CLICK_CTRL, PROC_REF(try_removing_item)) RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) + var/atom/food = parent initial_volume = food.reagents.total_volume @@ -29,6 +31,8 @@ bad_chance_of_discovery = _bad_chance good_chance_of_discovery = _good_chance + food.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 + /datum/component/food_storage/Destroy(force, silent) if(stored_item) stored_item.forceMove(stored_item.drop_location()) @@ -199,3 +203,26 @@ //if there's nothing else in the food, or we found nothing valid stored_item = null return FALSE + +/** + * Adds context sensitivy directly to the processable file for screentips + * Arguments: + * * source - refers to item that will display its screentip + * * context - refers to, in this case, an item that can be inserted into another item + * * held_item - refers to item in user's hand, typically the one that will be inserted into the food item + * * user - refers to user who will see the screentip when the proper context and tool are there + */ + +/datum/component/food_storage/proc/on_requesting_context_from_item(datum/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + . = NONE + + if(isnull(held_item) || held_item == source) + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Remove embedded item (if any)" + . = CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item) && held_item.w_class <= WEIGHT_CLASS_SMALL && held_item != source && !IS_EDIBLE(held_item)) + context[SCREENTIP_CONTEXT_RMB] = "Embed item" + . = CONTEXTUAL_SCREENTIP_SET + + return . diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index 044619d594a..d02f090ae20 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -62,10 +62,8 @@ if(autofire_stat == AUTOFIRE_STAT_FIRING) stop_autofiring() //Let's stop shooting to avoid issues. return - if(iscarbon(user)) - var/mob/living/carbon/arizona_ranger = user - if(arizona_ranger.is_holding(parent)) - autofire_on(arizona_ranger.client) + if(user.is_holding(parent)) + autofire_on(user.client) // There is a gun and there is a user wielding it. The component now waits for the mouse click. /datum/component/automatic_fire/proc/autofire_on(client/usercli) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 404b2e99709..19b9548076c 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -139,28 +139,58 @@ //don't attack the machine if(!(mat_container_flags & MATCONTAINER_ANY_INTENT) && user.combat_mode) return + //can't allow abstract, hologram items + if((held_item.item_flags & ABSTRACT) || (held_item.flags_1 & HOLOGRAM_1)) + return + //untouchable + if(held_item.resistance_flags & INDESTRUCTIBLE) + return //user defined conditions if(precondition && !precondition.Invoke(user)) return - //loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children + //get all contents of this item reccursively var/list/contents = held_item.get_all_contents_type(/obj/item) + //anything that isn't a stack cannot be split so find out if we have enough space, we don't want to consume half the contents of an object & leave it in a broken state + if(!isstack(held_item)) + var/total_amount = 0 + for(var/obj/item/weapon in contents) + total_amount += get_item_material_amount(weapon, breakdown_flags) + if(!has_space(total_amount)) + to_chat(user, span_warning("[parent] doesn't have enough space for [held_item] [contents.len > 1 ? "And it's contents" : ""]!")) + return + + /** + * to reduce chat spams we group all messages and print them after everything is over + * usefull when we are trying to insert all stock parts of an RPED into the autolathe for example + */ + var/list/inserts = list() + var/list/errors = list() + + //loop through all contents inside this atom and salvage their material as well but in reverse so we don't delete parents before processing their children for(var/i = length(contents); i >= 1 ; i--) var/obj/item/target = contents[i] - //not a solid sub type - if(target.item_flags & ABSTRACT) + //not a solid subtype or an hologram + if((target.item_flags & ABSTRACT) || (target.flags_1 & HOLOGRAM_1)) if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it user.put_in_active_hand(target) continue - //item is either not real, not allowed for redemption, not in the allowed types - if((target.flags_1 & HOLOGRAM_1) || (target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache))) + + //item is either not allowed for redemption, not in the allowed types + if((target.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target, allowed_item_typecache))) if(!(mat_container_flags & MATCONTAINER_SILENT)) to_chat(user, span_warning("[parent] won't accept [target]!")) if(target == active_held) //was this the original item in the players hand? put it back because we coudn't salvage it user.put_in_active_hand(target) continue + //untouchable, move it out the way, code copied from recycler + if(target.resistance_flags & INDESTRUCTIBLE) + if(!isturf(target.loc) && !isliving(target.loc)) + target.forceMove(get_turf(parent)) + continue + //if stack, check if we want to read precise amount of sheets to insert var/obj/item/stack/item_stack = null if(isstack(target) && precise_insertion) @@ -187,9 +217,11 @@ return //insert the item + var/item_name = target.name var/inserted = insert_item(target, breakdown_flags = mat_container_flags) if(inserted > 0) . += inserted + var/message = null //stack was either split by the container(!QDELETED(target) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand if((!QDELETED(target) || was_stack_split)) @@ -203,16 +235,27 @@ //was this the original item in the players hand? put what's left back in the player's hand if(!isnull(original_item)) user.put_in_active_hand(original_item) + message = "Only [inserted] amount of [item_name] was consumed by [parent]." - to_chat(user, span_notice("You insert a material total of [inserted] into [parent].")) + //collect all messages to print later + if(!message) + message = "[item_name] worth [inserted] material was consumed by [parent]." + if(inserts[message]) + inserts[message] += 1 + else + inserts[message] = 1 else - //decode the error & print it var/error_msg if(inserted == -2) - error_msg = "[parent] has insufficient space to accept the [target]" + error_msg = "[parent] has insufficient space to accept [target]" else error_msg = "[target] has insufficient materials to be accepted by [parent]" - to_chat(user, span_warning(error_msg)) + + //collect all messages to print later + if(errors[error_msg]) + errors[error_msg] += 1 + else + errors[error_msg] = 1 //player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original if(!isnull(item_stack) && was_stack_split) @@ -224,6 +267,18 @@ if(!isnull(original_item)) user.put_in_active_hand(original_item) + //print successfull inserts + for(var/success_msg in inserts) + var/count = inserts[success_msg] + for(var/i in 1 to count) + to_chat(user, span_notice(success_msg)) + + //print errors last + for(var/error_msg in errors) + var/count = errors[error_msg] + for(var/i in 1 to count) + to_chat(user, span_warning(error_msg)) + /** * Splits a stack. we don't use /obj/item/stack/proc/split_stack because Byond complains that should only be called asynchronously. * This proc is also more faster because it doesn't deal with mobs, copying evidences or refreshing atom storages @@ -521,6 +576,11 @@ mat = GET_MATERIAL_REF(mat) return materials[mat] +/datum/component/material_container/ui_static_data(mob/user) + var/list/data = list() + data["SHEET_MATERIAL_AMOUNT"] = SHEET_MATERIAL_AMOUNT + return data + /// List format is list(material_name = list(amount = ..., ref = ..., etc.)) /datum/component/material_container/ui_data(mob/user) var/list/data = list() diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 7e8b21c5345..7a499484ea8 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -268,7 +268,7 @@ var/datum/component/mind_linker/linker = target var/mob/living/linker_parent = linker.parent - var/message = sanitize(tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy")) + var/message = tgui_input_text(owner, "Enter a message to transmit.", "[linker.network_name] Telepathy") if(!message || QDELETED(src) || QDELETED(owner) || owner.stat == DEAD) return diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 02156f69aa7..e4ae35dad26 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -48,6 +48,7 @@ has_progression = FALSE, datum/uplink_handler/uplink_handler_override, ) + if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -119,6 +120,7 @@ /// Sets the telecrystals of the uplink. It is bad practice to use this outside of the component itself. /datum/component/uplink/proc/set_telecrystals(new_telecrystal_amount) uplink_handler.telecrystals = new_telecrystal_amount + uplink_handler.on_update() /datum/component/uplink/InheritComponent(datum/component/uplink/uplink) lockable |= uplink.lockable @@ -145,6 +147,11 @@ if(istype(item, /obj/item/stack/telecrystal)) load_tc(user, item) + if(!istype(item)) + return + + SEND_SIGNAL(item, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, user, src) + /datum/component/uplink/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index f5a716befb3..8f14f9edef7 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -9,106 +9,177 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE spreading_modifier = 0.75 - desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition." + desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. \ + Subjects affected show the signs of brain damage, yelling obscure sentences or total gibberish. \ + On late stages subjects sometime express the feelings of inner power, and cite \ + 'the ability to control the forces of cosmos themselves!' \ + A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition. \ + A form of magical grounding can help, too, but will not cure it on its own." severity = DISEASE_SEVERITY_HARMFUL required_organs = list(/obj/item/bodypart/head) -/* -BIRUZ BENNAR -SCYAR NILA - teleport -NEC CANTIO - dis techno -EI NATH - shocking grasp -AULIE OXIN FIERA - knock -TARCOL MINTI ZHERI - forcewall -STI KALY - blind -*/ + /// List of random non-targeted spells to pick from to cast + var/list/datum/action/cooldown/spell/random_spells = list() + /// List of random targeted spells to pick from to cast + var/list/datum/action/cooldown/spell/random_targeted_spells = list() + + /// The hat type to give the infected + var/hat_type + /// The robe type to give the infected + var/robe_type + +/datum/disease/wizarditis/after_add() + switch(pick("blue", "red", "yellow")) + if("blue") + hat_type = /obj/item/clothing/head/wizard + robe_type = /obj/item/clothing/suit/wizrobe + if("red") + hat_type = /obj/item/clothing/head/wizard/red + robe_type = /obj/item/clothing/suit/wizrobe/red + if("yellow") + hat_type = /obj/item/clothing/head/wizard/yellow + robe_type = /obj/item/clothing/suit/wizrobe/yellow + + init_spells() + +/datum/disease/wizarditis/Destroy() + QDEL_LIST(random_spells) + QDEL_LIST(random_targeted_spells) + return ..() /datum/disease/wizarditis/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) return + if(affected_mob.can_block_magic(charge_cost = 0)) + update_stage(1) + return + + if(stage >= 3 && SPT_PROB(0.15 * stage, seconds_per_tick)) + var/datum/action/cooldown/spell/picked = pick(random_spells) + if(!picked.try_invoke(affected_mob, feedback = FALSE)) + to_chat(affected_mob, span_danger("You feel something building up inside... but the feeling passes.")) + return + + picked.spell_feedback(affected_mob) + return + + if(stage <= 3 && SPT_PROB(0.33 * stage, seconds_per_tick)) + affected_mob.manual_emote("sniffles.") + switch(stage) if(2) - if(SPT_PROB(0.25, seconds_per_tick)) - affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"), forced = "wizarditis") - if(SPT_PROB(0.25, seconds_per_tick)) + if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].")) - if(3) - if(SPT_PROB(0.25, seconds_per_tick)) - affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"), forced = "wizarditis") - if(SPT_PROB(0.25, seconds_per_tick)) - to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].")) - if(4) - if(SPT_PROB(0.5, seconds_per_tick)) - affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis") - return - if(SPT_PROB(0.25, seconds_per_tick)) - to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].")) - spawn_wizard_clothes(50) - if(SPT_PROB(0.005, seconds_per_tick)) - teleport() + if(3) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(affected_mob, span_danger("You feel [pick("the magic bubbling in your veins", "that this location gives you a +1 to INT", "an urge to summon familiar")].")) + spawn_wizard_clothes(10) + + if(4) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(affected_mob, span_danger("You feel [pick("the tidal wave of raw power building inside", "that this location gives you a +2 to INT and +1 to WIS", "an urge to teleport")].")) + spawn_wizard_clothes(50) + + if(SPT_PROB(0.2, seconds_per_tick)) + if(prob(15)) + var/list/targets = list() + var/datum/action/cooldown/spell/target_picked = pick(random_targeted_spells) + for(var/mob/living/potential_target in view(affected_mob)) + if(potential_target == affected_mob) + continue + targets += potential_target + + if(length(targets)) + target_picked.Activate(pick(targets)) + affected_mob.emote("cough") + return + + var/datum/action/cooldown/spell/picked = pick(random_spells) + picked.Activate(affected_mob) + affected_mob.emote("sneeze") + return /datum/disease/wizarditis/proc/spawn_wizard_clothes(chance = 0) - if(ishuman(affected_mob)) - var/mob/living/carbon/human/H = affected_mob - if(prob(chance)) - if(!istype(H.head, /obj/item/clothing/head/wizard)) - if(!H.dropItemToGround(H.head)) - qdel(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD) - return - if(prob(chance)) - if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) - if(!H.dropItemToGround(H.wear_suit)) - qdel(H.wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING) - return - if(prob(chance)) - if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) - if(!H.dropItemToGround(H.shoes)) - qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET) - return - else - var/mob/living/carbon/H = affected_mob - if(prob(chance)) - var/obj/item/staff/S = new(H) - if(!H.put_in_hands(S)) - qdel(S) + if(prob(chance) && affected_mob.usable_hands >= 1) + var/obj/item/staff/funny_staff = new(affected_mob) + if(!affected_mob.put_in_hands(funny_staff)) + qdel(funny_staff) - -/datum/disease/wizarditis/proc/teleport() - var/list/theareas = get_areas_in_range(80, affected_mob) - for(var/area/space/S in theareas) - theareas -= S - - if(!theareas || !theareas.len) + if(!ishuman(affected_mob)) return - var/area/thearea = pick(theareas) - var/list/L = list() - var/turf/mob_turf = get_turf(affected_mob) - for(var/turf/T in get_area_turfs(thearea.type)) - if(!is_valid_z_level(T, mob_turf)) - continue - if(T.name == "space") - continue - if(!T.density) - var/clear = 1 - for(var/obj/O in T) - if(O.density) - clear = 0 - break - if(clear) - L+=T + var/mob/living/carbon/human/human_mob = affected_mob + if(prob(chance) && !(human_mob.head?.item_flags & CASTING_CLOTHES)) + if(human_mob.dropItemToGround(human_mob.head)) + human_mob.equip_to_slot_or_del(new hat_type(human_mob), ITEM_SLOT_HEAD) - if(!L) - return + if(prob(chance) && !(human_mob.wear_suit?.item_flags & CASTING_CLOTHES)) + if(human_mob.dropItemToGround(human_mob.wear_suit)) + human_mob.equip_to_slot_or_del(new robe_type(human_mob), ITEM_SLOT_OCLOTHING) - affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport") - affected_mob.forceMove(pick(L)) + if(prob(chance) && !istype(human_mob.shoes, /obj/item/clothing/shoes/sandal/magic)) + if(human_mob.dropItemToGround(human_mob.shoes)) + human_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(human_mob), ITEM_SLOT_FEET) - return +/datum/disease/wizarditis/proc/init_spells() + // Some self cast spells + var/datum/action/cooldown/spell/teleport/area_teleport/wizard/sneeze_teleport = new(src) + sneeze_teleport.randomise_selection = TRUE + random_spells += sneeze_teleport + + var/datum/action/cooldown/spell/emp/disable_tech/sneeze_emp = new(src) + sneeze_emp.emp_heavy = 1 + sneeze_emp.emp_light = 2 + random_spells += sneeze_emp + + var/datum/action/cooldown/spell/apply_mutations/mutate/sneeze_mutate = new(src) + sneeze_mutate.mutation_duration = 3 SECONDS + random_spells += sneeze_mutate + + var/datum/action/cooldown/spell/aoe/knock/sneeze_knock = new(src) + random_spells += sneeze_knock + + var/datum/action/cooldown/spell/forcewall/sneeze_forcewall = new(src) + random_spells += sneeze_forcewall + + var/datum/action/cooldown/spell/teleport/radius_turf/blink/sneeze_blink = new(src) + sneeze_blink.inner_tele_radius = 1 + sneeze_blink.outer_tele_radius = 3 + random_spells += sneeze_blink + + var/datum/action/cooldown/spell/smoke/sneeze_smoke = new(src) + sneeze_smoke.smoke_amt = 2 + random_spells += sneeze_smoke + + var/datum/action/cooldown/spell/spacetime_dist/sneeze_spacetime = new(src) + sneeze_spacetime.scramble_radius = 2 + sneeze_spacetime.duration = 5 SECONDS + random_spells += sneeze_spacetime + + var/datum/action/cooldown/spell/timestop/sneeze_timestop = new(src) + sneeze_timestop.timestop_range = 1 // heh + sneeze_timestop.timestop_duration = 5 SECONDS + random_spells += sneeze_timestop + + var/datum/action/cooldown/spell/aoe/repulse/sneeze_repulse = new(src) + sneeze_repulse.aoe_radius = 2 + sneeze_repulse.max_throw = 3 + random_spells += sneeze_repulse + + // Some targeted spells + var/datum/action/cooldown/spell/pointed/blind/cough_blind = new(src) + cough_blind.eye_blind_duration = 2 SECONDS + cough_blind.eye_blur_duration = 10 SECONDS + random_targeted_spells += cough_blind + + var/datum/action/cooldown/spell/pointed/projectile/lightningbolt/cough_zap = new(src) + cough_zap.bolt_range /= 3 + cough_zap.bolt_power /= 3 + random_targeted_spells += cough_zap + + var/datum/action/cooldown/spell/pointed/swap/cough_swap = new(src) + random_targeted_spells += cough_swap diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 25476d04220..3b01e7e0935 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -397,10 +397,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len)) if(DNA_MUSHROOM_CAPS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len)) -*/ -//SKYRAT EDIT REMOVAL END if(DNA_POD_HAIR_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)) +*/ +//SKYRAT EDIT REMOVAL END //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/HM) diff --git a/code/datums/elements/cuffsnapping.dm b/code/datums/elements/cuffsnapping.dm index 19a59bd4c7c..c0dfdcf6091 100644 --- a/code/datums/elements/cuffsnapping.dm +++ b/code/datums/elements/cuffsnapping.dm @@ -68,6 +68,9 @@ /datum/element/cuffsnapping/proc/try_cuffsnap_target(obj/item/cutter, mob/living/carbon/target, mob/cutter_user, params) SIGNAL_HANDLER + if(!istype(target)) //we aren't the kind of mob that can even have cuffs, so we skip. + return + if(!target.handcuffed) return diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 23503bfbcc2..faf4122e27d 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -34,12 +34,13 @@ /datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker) SIGNAL_HANDLER if(weapon.force) - relay_attacker(target, attacker) + relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) /datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers) SIGNAL_HANDLER - if(attacker.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - relay_attacker(target, attacker) + var/shoving = LAZYACCESS(modifiers, RIGHT_CLICK) ? ATTACKER_SHOVING : NONE + if(attacker.combat_mode || shoving) + relay_attacker(target, attacker, shoving) /datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker) SIGNAL_HANDLER @@ -52,7 +53,7 @@ return if(!ismob(hit_projectile.firer)) return - relay_attacker(target, hit_projectile.firer) + relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) /datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) SIGNAL_HANDLER @@ -64,7 +65,7 @@ var/mob/thrown_by = hit_item.thrownby?.resolve() if(!ismob(thrown_by)) return - relay_attacker(target, thrown_by) + relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) /datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker) SIGNAL_HANDLER @@ -75,5 +76,5 @@ relay_attacker(target, mecha_attacker) /// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret) -/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker) - SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker) +/datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags) + SEND_SIGNAL(victim, COMSIG_ATOM_WAS_ATTACKED, attacker, attack_flags) diff --git a/code/datums/elements/uplink_reimburse.dm b/code/datums/elements/uplink_reimburse.dm new file mode 100644 index 00000000000..5387f245d8c --- /dev/null +++ b/code/datums/elements/uplink_reimburse.dm @@ -0,0 +1,49 @@ +/** + * Uplinik Reimburse element. + * When element is applied onto items, it allows them to be reimbursed if an user pokes an item with a uplink component with them. + * + * Element is only compatible with items. + */ + +/datum/element/uplink_reimburse + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 1 + /// TC to refund! + var/refundable_tc = 1 + +/datum/element/uplink_reimburse/Attach(datum/target, refundable_tc = 1) + . = ..() + + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.refundable_tc = refundable_tc + + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(target, COMSIG_ITEM_ATTEMPT_TC_REIMBURSE, PROC_REF(reimburse)) + +/datum/element/uplink_reimburse/Detach(datum/target) + UnregisterSignal(target, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE)) + + return ..() + +///signal called on parent being examined +/datum/element/uplink_reimburse/proc/on_examine(datum/target, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!IS_TRAITOR(user) && !IS_NUKE_OP(user)) + examine_list += span_warning("There's a label on the side, but it's written in indecipherable gibberish. You have no idea what it means!") + return + + examine_list += span_notice("There's a label written in codespeak on the side, saying that this item can be refunded for [refundable_tc] by applying it onto an uplink.") + +/datum/element/uplink_reimburse/proc/reimburse(obj/item/refund_item, mob/user, datum/component/uplink/uplink_comp) + SIGNAL_HANDLER + + if(!uplink_comp) + CRASH("No uplink component in arguments detected") + + to_chat(user, span_notice("You tap [uplink_comp.uplink_handler] with [refund_item], and a moment after [refund_item] disappears in a puff of red smoke!")) + do_sparks(2, source = uplink_comp.uplink_handler) + uplink_comp.add_telecrystals(refundable_tc) + qdel(refund_item) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index ee7901c5f8d..1fd94e5dbc8 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -370,23 +370,6 @@ mood_change = -1 timeout = 30 SECONDS -//SKYRAT EDIT START: Mainly surgery for now. -/datum/mood_event/mild_surgery - description = "Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!\n" - mood_change = -1 - timeout = 5 MINUTES - -/datum/mood_event/severe_surgery - description = "Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!\n" - mood_change = -4 - timeout = 15 MINUTES - -/datum/mood_event/robot_surgery - description = "Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!\n" - mood_change = -4 - timeout = 10 MINUTES -//SKYRAT EDIT END - /datum/mood_event/gamer_withdrawal description = "I wish I was gaming right now..." mood_change = -5 diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index f9ca6afd193..00b3465dd0f 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -1,10 +1,12 @@ +// SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) // Defines for the ballmer peak. -#define BALLMER_PEAK_LOW_END 12.9 -#define BALLMER_PEAK_HIGH_END 13.8 -#define BALLMER_PEAK_WINDOWS_ME 26 +#define BALLMER_PEAK_LOW_END 25.8 // Original 12.9 +#define BALLMER_PEAK_HIGH_END 27.6 // Original 13.8 +#define BALLMER_PEAK_WINDOWS_ME 37 // Original 26 /// The threshld which determine if someone is tipsy vs drunk -#define TIPSY_THRESHOLD 6 +#define TIPSY_THRESHOLD 21 // Original 6 +// SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS) /** * The drunk status effect. @@ -144,6 +146,8 @@ if(drunk_value > BALLMER_PEAK_WINDOWS_ME) // by this point you're into windows ME territory owner.say(pick_list_replacements(VISTA_FILE, "ballmer_windows_me_msg"), forced = "ballmer") + // SKYRAT EDIT CHANGE BEGIN (#21546 DRUNK EFFECTS) + /* ORIGINAL // Drunk slurring scales in intensity based on how drunk we are -at 16 you will likely not even notice it, // but when we start to scale up you definitely will if(drunk_value >= 16) @@ -171,6 +175,33 @@ // Over 71, we will constantly have blurry eyes if(drunk_value >= 71) owner.set_eye_blur_if_lower((drunk_value * 2 SECONDS) - 140 SECONDS) + */ + + // And drunk people will always lose jitteriness + owner.adjust_jitter(-6 SECONDS) + + // Over 41, we have a 10% chance to gain confusion and occasionally slur words, scaling with drunk_value + if(drunk_value >= 41) + if(prob(clamp(drunk_value - 8, 0, 100))) + owner.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/drunk, max_duration = 20 SECONDS) + if(prob(10)) + owner.adjust_confusion(4 SECONDS) + + // Over 61, we start to get blurred vision + if(drunk_value >= 61) + owner.set_dizzy_if_lower(45 SECONDS) + if(prob(15)) + owner.adjust_eye_blur_up_to(4 SECONDS, 20 SECONDS) + + // Over 71, we will constantly have blurry eyes, we might vomit + if(drunk_value >= 71) + owner.set_eye_blur_if_lower(20 SECONDS) + if(prob(3)) + owner.adjust_confusion(15 SECONDS) + if(iscarbon(owner)) + var/mob/living/carbon/carbon_owner = owner + carbon_owner.vomit() // Vomiting clears toxloss - consider this a blessing + // SKYRAT EDIT CHANGE END (#21546 DRUNK EFFECTS) // Over 81, we will gain constant toxloss if(drunk_value >= 81) diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index 4c2526f6cac..a66da9ba6ef 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -26,13 +26,13 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) * The first matching command (from a list of static datums) the listeners must obey, * and the return value of this proc the cooldown variable of the command dictates. (only relevant for things with cooldowns i guess) */ -/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null) +/proc/voice_of_god(message, mob/living/user, list/span_list, base_multiplier = 1, include_speaker = FALSE, forced = null, ignore_spam = FALSE) var/log_message = uppertext(message) var/is_cultie = IS_CULTIST(user) if(LAZYLEN(span_list) && is_cultie) span_list = list("narsiesmall") - if(!user.say(message, spans = span_list, sanitize = FALSE)) + if(!user.say(message, spans = span_list, sanitize = FALSE, ignore_spam = ignore_spam, forced = forced)) return message = lowertext(message) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 677b8371c1b..5772593f4cd 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1170,6 +1170,8 @@ SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir SEND_SIGNAL(src, COMSIG_ATOM_POST_DIR_CHANGE, dir, newdir) + if(smoothing_flags & SMOOTH_BORDER_OBJECT) + QUEUE_SMOOTH_NEIGHBORS(src) /** * Called when the atom log's in or out @@ -2062,7 +2064,7 @@ active_hud.screentip_text.maptext = "" return - active_hud.screentip_text.maptext_y = 0 + active_hud.screentip_text.maptext_y = 16 // 16px lines us up with the action buttons top left corner var/lmb_rmb_line = "" var/ctrl_lmb_ctrl_rmb_line = "" var/alt_lmb_alt_rmb_line = "" @@ -2129,15 +2131,15 @@ extra_lines++ if(extra_lines) - extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" - //first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place - active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9 + extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]" + //first extra line pushes atom name line up 11px, subsequent lines push it up 8px, this offsets that and keeps the first line in the same place + active_hud.screentip_text.maptext_y = 5 + (extra_lines - 1) * -8 if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "") active_hud.screentip_text.maptext = "" 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][extra_context]" + active_hud.screentip_text.maptext = "[name][extra_context]" /// Gets a merger datum representing the connected blob of objects in the allowed_types argument /atom/proc/GetMergeGroup(id, list/allowed_types) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 60fd0711426..5d2c7be48b2 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -341,7 +341,7 @@ . = ..() var/mat_capacity = 0 for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts) - mat_capacity += new_matter_bin.tier * 75000 + mat_capacity += new_matter_bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = mat_capacity diff --git a/code/game/machinery/computer/atmos_computers/__identifiers.dm b/code/game/machinery/computer/atmos_computers/__identifiers.dm index 2b007885cc7..653f0fbaa38 100644 --- a/code/game/machinery/computer/atmos_computers/__identifiers.dm +++ b/code/game/machinery/computer/atmos_computers/__identifiers.dm @@ -32,13 +32,14 @@ #define ATMOS_GAS_MONITOR_WASTE "waste" #define ATMOS_GAS_MONITOR_ENGINE "engine" -///maps a chamber id to its air sensor -#define CHAMBER_SENSOR_FROM_ID(chamber_id) ((chamber_id) + "_sensor") ///maps an air sensor's chamber id to its input valve[ i.e. outlet_injector] id #define CHAMBER_INPUT_FROM_ID(chamber_id) ((chamber_id) + "_in") ///maps an air sensor's chamber id to its output valve[i.e. vent pump] id #define CHAMBER_OUTPUT_FROM_ID(chamber_id) ((chamber_id) + "_out") +///list of all air sensor's created round start +GLOBAL_LIST_EMPTY(map_loaded_sensors) + // Human-readble names of these funny tags. GLOBAL_LIST_INIT(station_gas_chambers, list( ATMOS_GAS_MONITOR_O2 = "Oxygen Supply", diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index 45d705236d3..1436e1a9267 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -5,14 +5,26 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "gsensor1" resistance_flags = FIRE_PROOF - + power_channel = AREA_USAGE_ENVIRON + active_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 1.5 var/on = TRUE /// The unique string that represents which atmos chamber to associate with. var/chamber_id + /// The inlet[injector] controlled by this sensor + var/inlet_id + /// The outlet[vent pump] controlled by this sensor + var/outlet_id /obj/machinery/air_sensor/Initialize(mapload) - id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id) + id_tag = assign_random_name() + + //this global list of air sensors is available to all station monitering consoles round start and to new consoles made during the round + if(mapload) + GLOB.map_loaded_sensors[chamber_id] = id_tag + inlet_id = CHAMBER_INPUT_FROM_ID(chamber_id) + outlet_id = CHAMBER_OUTPUT_FROM_ID(chamber_id) + var/static/list/multitool_tips = list( TOOL_MULTITOOL = list( SCREENTIP_CONTEXT_LMB = "Link logged injectors/vents", @@ -27,21 +39,45 @@ reset() return ..() +/obj/machinery/air_sensor/return_air() + if(!on) + return + . = ..() + use_power(active_power_usage) //use power for analyzing gases + +/obj/machinery/air_sensor/process() + //update appearance according to power state + if(machine_stat & NOPOWER) + if(on) + on = FALSE + update_appearance() + else if(!on) + on = TRUE + update_appearance() + +/obj/machinery/air_sensor/examine(mob/user) + . = ..() + . += span_notice("Use multitool to link it to an injector/vent or reset it's ports") + . += span_notice("Click with hand to turn it off.") + +/obj/machinery/air_sensor/attack_hand(mob/living/user, list/modifiers) + . = ..() + + //switched off version of this air sensor but still anchored to the ground + var/obj/item/air_sensor/sensor = new(drop_location(), inlet_id, outlet_id) + sensor.set_anchored(TRUE) + sensor.balloon_alert(user, "sensor turned off") + + //delete self + qdel(src) + /obj/machinery/air_sensor/update_icon_state() icon_state = "gsensor[on]" return ..() /obj/machinery/air_sensor/proc/reset() - var/input_id = CHAMBER_INPUT_FROM_ID(chamber_id) - if(GLOB.objects_by_id_tag[input_id] != null) - var/obj/machinery/atmospherics/components/unary/outlet_injector/injector = GLOB.objects_by_id_tag[input_id] - injector.disconnect_chamber() - - var/output_id = CHAMBER_OUTPUT_FROM_ID(chamber_id) - if(GLOB.objects_by_id_tag[output_id] != null) - var/obj/machinery/atmospherics/components/unary/vent_pump/pump = GLOB.objects_by_id_tag[output_id] - pump.disconnect_chamber() - + inlet_id = null + outlet_id = null ///right click with multi tool to disconnect everything /obj/machinery/air_sensor/multitool_act_secondary(mob/living/user, obj/item/tool) @@ -50,16 +86,14 @@ return TRUE /obj/machinery/air_sensor/multitool_act(mob/living/user, obj/item/multitool/multi_tool) - .= ..() - - if (!istype(multi_tool)) - return . + . = ..() if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/outlet_injector)) var/obj/machinery/atmospherics/components/unary/outlet_injector/input = multi_tool.buffer - input.chamber_id = chamber_id - GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)] = input + inlet_id = input.id_tag + multi_tool.buffer = null balloon_alert(user, "connected to input") + else if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/vent_pump)) var/obj/machinery/atmospherics/components/unary/vent_pump/output = multi_tool.buffer //so its no longer controlled by air alarm @@ -69,11 +103,127 @@ output.pressure_checks = ATMOS_INTERNAL_BOUND output.internal_pressure_bound = 4000 output.external_pressure_bound = 0 - output.chamber_id = chamber_id - GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)] = output + //finally assign it to this sensor + outlet_id = output.id_tag + multi_tool.buffer = null balloon_alert(user, "connected to output") + else multi_tool.buffer = src balloon_alert(user, "added to multitool buffer") return TRUE + +/** + * A portable version of the /obj/machinery/air_sensor + * Wrenching it & turning it on will convert it back to /obj/machinery/air_sensor + * Unwelding /obj/machinery/air_sensor will turn it back to /obj/item/air_sensor + * The logic is same as meters + */ +/obj/item/air_sensor + name = "Air Sensor" + desc = "A device designed to detect gases and their concentration in an area." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "gsensor0" + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + /// The injector linked with this sensor + var/input_id + /// The vent pump linked with this sensor + var/output_id + +/obj/item/air_sensor/Initialize(mapload, inlet, outlet) + . = ..() + register_context() + input_id = inlet + output_id = outlet + +/obj/item/air_sensor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if(isnull(held_item)) + return NONE + + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unwrench" : "Wrench" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_WELDER && !anchored) + context[SCREENTIP_CONTEXT_LMB] = "Dismantle" + return CONTEXTUAL_SCREENTIP_SET + + return NONE + +/obj/item/air_sensor/examine(mob/user) + . = ..() + if(anchored) + . += span_notice("It's [EXAMINE_HINT("wrenched")] in place") + else + . += span_notice("It should be [EXAMINE_HINT("wrenched")] in place to turn it on.") + . += span_notice("It could be [EXAMINE_HINT("welded")] apart.") + . += span_notice("Click with hand to turn it on.") + +/obj/item/air_sensor/attack_hand(mob/user, list/modifiers) + . = ..() + if(!anchored) + return + + //List of air sensor's by name + var/list/available_sensors = list() + for(var/chamber_id in GLOB.station_gas_chambers) + //don't let it conflict with existing distro & waste moniter meter's + if(chamber_id == ATMOS_GAS_MONITOR_DISTRO) + continue + if(chamber_id == ATMOS_GAS_MONITOR_WASTE) + continue + available_sensors += GLOB.station_gas_chambers[chamber_id] + + //make the choice + var/chamber_name = tgui_input_list(user, "Select Sensor Purpose", "Select Sensor ID", available_sensors) + if(isnull(chamber_name)) + return + + //map chamber name back to id + var/target_chamber + for(var/chamber_id in GLOB.station_gas_chambers) + if(GLOB.station_gas_chambers[chamber_id] != chamber_name) + continue + target_chamber = chamber_id + break + + //build the sensor from the subtypes of sensor's available + var/static/list/chamber_subtypes = null + if(isnull(chamber_subtypes)) + chamber_subtypes = subtypesof(/obj/machinery/air_sensor) + for(var/obj/machinery/air_sensor/sensor as anything in chamber_subtypes) + if(initial(sensor.chamber_id) != target_chamber) + continue + + //make real air sensor in it's place + var/obj/machinery/air_sensor/new_sensor = new sensor(get_turf(src)) + new_sensor.inlet_id = input_id + new_sensor.outlet_id = output_id + new_sensor.balloon_alert(user, "sensor turned on") + qdel(src) + + break + +/obj/item/air_sensor/wrench_act(mob/living/user, obj/item/tool) + if(default_unfasten_wrench(user, tool) == SUCCESSFUL_UNFASTEN) + return TOOL_ACT_TOOLTYPE_SUCCESS + return + +/obj/item/air_sensor/welder_act(mob/living/user, obj/item/tool) + if(!tool.tool_start_check(user, amount = 1)) + return + + loc.balloon_alert(user, "dismantling sensor") + if(!tool.use_tool(src, user, 2 SECONDS, volume = 30, amount = 1)) + return + loc.balloon_alert(user, "sensor dismanteled") + + deconstruct(TRUE) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/item/air_sensor/deconstruct(disassembled) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/analyzer(loc) + new /obj/item/stack/sheet/iron(loc, 1) + return ..() diff --git a/code/game/machinery/computer/atmos_computers/_atmos_control.dm b/code/game/machinery/computer/atmos_computers/_atmos_control.dm index dd885e2c1dd..57403a27d3d 100644 --- a/code/game/machinery/computer/atmos_computers/_atmos_control.dm +++ b/code/game/machinery/computer/atmos_computers/_atmos_control.dm @@ -7,7 +7,7 @@ circuit = /obj/item/circuitboard/computer/atmos_control light_color = LIGHT_COLOR_CYAN - /// Which sensors/input/outlets do we want to listen to. + /// Which sensors do we want to listen to. /// Assoc of list[chamber_id] = readable_chamber_name var/list/atmos_chambers @@ -19,12 +19,33 @@ /// Whether we are allowed to reconnect. var/reconnecting = TRUE + /// Was this computer multitooled before. If so copy the list connected_sensors as it now mantain's it's own sensors independent of the map loaded one's + var/was_multi_tooled = FALSE + + /// list of all sensors[key is chamber id, value is id of air sensor linked to this chamber] monitered by this computer + var/list/connected_sensors + /obj/machinery/computer/atmos_control/Initialize(mapload, obj/item/circuitboard/C) . = ..() + + var/static/list/multitool_tips = list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Link Sensor", + ) + ) + AddElement(/datum/element/contextual_screentip_tools, multitool_tips) + + //all newly constructed/round start computers by default have access to this list + connected_sensors = GLOB.map_loaded_sensors + //special case for the station monitering console. We dont want to loose these chambers during reconnecting if(!control && !isnull(atmos_chambers)) always_displayed_chambers = atmos_chambers.Copy() +/obj/machinery/computer/atmos_control/examine(mob/user) + . = ..() + . += span_notice("Use a multitool to link a air sensor to this computer") + /// Reconnect only works for station based chambers. /obj/machinery/computer/atmos_control/proc/reconnect(mob/user) if(!reconnecting) @@ -33,16 +54,25 @@ // We only prompt the user with the sensors that are actually available. var/available_devices = list() - for (var/chamber_identifier in GLOB.station_gas_chambers) - if (!(CHAMBER_INPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag) && !(CHAMBER_OUTPUT_FROM_ID(chamber_identifier) in GLOB.objects_by_id_tag)) + for (var/chamber_identifier in connected_sensors) + //this sensor was destroyed at the time of reconnecting + var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_identifier]] + if(QDELETED(sensor)) + continue + + //non master computers don't have access to these station moniters. Only done to give master computer's special access to these chambers and make them feel special or something + if(chamber_identifier == ATMOS_GAS_MONITOR_DISTRO) + continue + if(chamber_identifier == ATMOS_GAS_MONITOR_WASTE) continue available_devices[GLOB.station_gas_chambers[chamber_identifier]] = chamber_identifier // As long as we dont put any funny chars in the strings it should match. var/new_name = tgui_input_list(user, "Select the device set", "Reconnect", available_devices) + if(isnull(new_name)) + return FALSE var/new_id = available_devices[new_name] - if(isnull(new_id)) return FALSE @@ -57,6 +87,22 @@ return TRUE +/obj/machinery/computer/atmos_control/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + . = ..() + + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + //computers reference a global map loaded list of sensor's but as soon a user attempt's to edit it, make a copy of that list so other computers aren't affected + if(!was_multi_tooled) + connected_sensors = connected_sensors.Copy() + was_multi_tooled = TRUE + //register the sensor's unique ID with it's assositated chamber + connected_sensors[sensor.chamber_id] = sensor.id_tag + user.balloon_alert(user, "sensor connected to [src]") + return TOOL_ACT_TOOLTYPE_SUCCESS + + return + /obj/machinery/computer/atmos_control/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -82,23 +128,26 @@ chamber_info["id"] = chamber_id chamber_info["name"] = atmos_chambers[chamber_id] - var/obj/machinery/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(chamber_id)] - if (!isnull(sensor)) + var/obj/machinery/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber_id]] + if(!QDELETED(sensor)) chamber_info["gasmix"] = gas_mixture_parser(sensor.return_air()) - var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber_id)] - if (!isnull(input)) - chamber_info["input_info"] = list( - "active" = input.on, - "amount" = input.volume_rate, - ) + if(istype(sensor, /obj/machinery/air_sensor)) //distro & waste loop are not air sensors and don't have these functions + var/obj/machinery/air_sensor/air_sensor = sensor - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber_id)] - if (!isnull(output)) - chamber_info["output_info"] = list( - "active" = output.on, - "amount" = output.internal_pressure_bound, - ) + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[air_sensor.inlet_id || ""] + if (!QDELETED(input)) + chamber_info["input_info"] = list( + "active" = input.on, + "amount" = input.volume_rate, + ) + + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[air_sensor.outlet_id || ""] + if (!QDELETED(output)) + chamber_info["output_info"] = list( + "active" = output.on, + "amount" = output.internal_pressure_bound, + ) data["chambers"] += list(chamber_info) return data @@ -115,37 +164,66 @@ if (!(chamber in atmos_chambers)) return TRUE - var/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)] - input?.on = !input.on + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""] + if(QDELETED(input)) + return TRUE + + input.on = !input.on input.update_appearance(UPDATE_ICON) if("toggle_output") if (!(chamber in atmos_chambers)) return TRUE - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)] - output?.on = !output.on + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""] + if(QDELETED(output)) + return TRUE + + output.on = !output.on output.update_appearance(UPDATE_ICON) if("adjust_input") if (!(chamber in atmos_chambers)) return TRUE + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[sensor.inlet_id || ""] + if(QDELETED(input)) + return TRUE + var/target = text2num(params["rate"]) if(isnull(target)) return TRUE target = clamp(target, 0, MAX_TRANSFER_RATE) - var/obj/machinery/atmospherics/components/unary/outlet_injector/input = GLOB.objects_by_id_tag[CHAMBER_INPUT_FROM_ID(chamber)] - input?.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE)) + input.volume_rate = clamp(target, 0, min(input.airs[1].volume, MAX_TRANSFER_RATE)) if("adjust_output") if (!(chamber in atmos_chambers)) return TRUE + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[connected_sensors[chamber]] + if(QDELETED(sensor)) + return TRUE + + var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[sensor.outlet_id || ""] + if(QDELETED(output)) + return TRUE + var/target = text2num(params["rate"]) if(isnull(target)) return TRUE + target = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE) - var/obj/machinery/atmospherics/components/unary/vent_pump/output = GLOB.objects_by_id_tag[CHAMBER_OUTPUT_FROM_ID(chamber)] - output?.internal_pressure_bound = clamp(target, 0, ATMOS_PUMP_MAX_PRESSURE) + output.internal_pressure_bound = target if("reconnect") reconnect(usr) diff --git a/code/game/machinery/computer/atmos_computers/inlets.dm b/code/game/machinery/computer/atmos_computers/inlets.dm index 5379a15c725..32de77cc632 100644 --- a/code/game/machinery/computer/atmos_computers/inlets.dm +++ b/code/game/machinery/computer/atmos_computers/inlets.dm @@ -1,6 +1,8 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored on = TRUE volume_rate = MAX_TRANSFER_RATE + /// The air sensor type this injector is linked to + var/chamber_id /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/Initialize(mapload) id_tag = CHAMBER_INPUT_FROM_ID(chamber_id) diff --git a/code/game/machinery/computer/atmos_computers/meters.dm b/code/game/machinery/computer/atmos_computers/meters.dm index 9ff6578852b..9cfe3072a69 100644 --- a/code/game/machinery/computer/atmos_computers/meters.dm +++ b/code/game/machinery/computer/atmos_computers/meters.dm @@ -3,7 +3,9 @@ var/chamber_id /obj/machinery/meter/monitored/Initialize(mapload, new_piping_layer) - id_tag = CHAMBER_SENSOR_FROM_ID(chamber_id) + id_tag = assign_random_name() + if(mapload) + GLOB.map_loaded_sensors[chamber_id] = id_tag . = ..() /obj/machinery/meter/monitored/layer2 diff --git a/code/game/machinery/digital_clock.dm b/code/game/machinery/digital_clock.dm new file mode 100644 index 00000000000..99cd1894725 --- /dev/null +++ b/code/game/machinery/digital_clock.dm @@ -0,0 +1,158 @@ +/obj/machinery/digital_clock + name = "digital clock" + desc = "An ultra-futuristic, sleek, advanced, next-gen normal digital clock that tells the time. Powered by bluespace. Despite supposedly being better in every way to classic clocks, it just doesn't feel the same. They just don't make them the way they used to..." + icon_state = "digital_clock_base" + icon = 'icons/obj/digital_clock.dmi' + verb_say = "beeps" + verb_ask = "bloops" + verb_exclaim = "blares" + density = FALSE + layer = ABOVE_WINDOW_LAYER + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) + +/obj/item/wallframe/digital_clock + name = "digital clock frame" + desc = "Used to build digital clocks, just secure to the wall." + icon_state = "digital_clock_base" + icon = 'icons/obj/digital_clock.dmi' + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) + result_path = /obj/machinery/digital_clock + pixel_shift = 28 + +/obj/machinery/digital_clock/wrench_act_secondary(mob/living/user, obj/item/tool) + . = ..() + balloon_alert(user, "[anchored ? "un" : ""]securing...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 6 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "[anchored ? "un" : ""]secured") + deconstruct() + return TRUE + +/obj/machinery/digital_clock/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return + if(atom_integrity >= max_integrity) + balloon_alert(user, "it doesn't need repairs!") + return TRUE + balloon_alert(user, "repairing display...") + if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50)) + return TRUE + balloon_alert(user, "repaired") + atom_integrity = max_integrity + set_machine_stat(machine_stat & ~BROKEN) + update_appearance() + return TRUE + +/obj/machinery/digital_clock/multitool_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return + if(!(obj_flags & EMAGGED)) + return + balloon_alert(user, "resetting...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 6 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE) + balloon_alert(user, "reset") + obj_flags &= ~EMAGGED + return TRUE + +/obj/machinery/digital_clock/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) + do_sparks(3, cardinal_only = FALSE, source = src) + obj_flags |= EMAGGED + +/obj/machinery/digital_clock/emp_act(severity) + . = ..() + emag_act() + +/obj/machinery/digital_clock/deconstruct(disassembled = TRUE) + if(flags_1 & NODECONSTRUCT_1) + return + if(disassembled) + new /obj/item/wallframe/digital_clock(drop_location()) + else + new /obj/item/stack/sheet/iron(drop_location(), 2) + new /obj/item/shard(drop_location()) + new /obj/item/shard(drop_location()) + qdel(src) + +/obj/machinery/digital_clock/Initialize(mapload) + . = ..() + START_PROCESSING(SSdigital_clock, src) + +/obj/machinery/digital_clock/Destroy() + STOP_PROCESSING(SSdigital_clock, src) + return ..() + +/obj/machinery/digital_clock/process(seconds_per_tick) + if(machine_stat & NOPOWER) + return + update_appearance() + + +/obj/machinery/digital_clock/update_appearance(updates=ALL) + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + set_light(0) + return + set_light(l_range = 1.5, l_power = 0.7, l_color = LIGHT_COLOR_BLUE) // blue light + +/obj/machinery/digital_clock/update_overlays() + . = ..() + + if(machine_stat & (NOPOWER|BROKEN)) + return + . += update_time() + return . + +/obj/machinery/digital_clock/proc/update_time() + var/station_minutes + if(obj_flags & EMAGGED) + station_minutes = rand(0, 99) + else + station_minutes = text2num(station_time_timestamp(format = "mm")) + + // tenth / the '3' in '31' / 31 -> 3.1 -> 3 + var/station_minute_tenth = station_minutes >= 10 ? round(station_minutes * 0.1) : 0 + // one / the '1' in '31' / 31 -> 31 - (3 * 10) -> 31 - 30 -> 1 + var/station_minute_one = station_minutes - (station_minute_tenth * 10) + + var/station_hours + + if(obj_flags & EMAGGED) + station_hours = rand(0, 99) + else + station_hours = text2num(station_time_timestamp(format = "hh")) + + // one / the '1' in '12' / 12 -> 1.2 -> 1 + var/station_hours_tenth = station_minutes >= 10 ? round(station_hours * 0.1) : 0 + // tenth / the '2' in '12' / 12 -> 12 - (1 * 10) -> 12 - 10 -> 2 + var/station_hours_one = station_hours - (station_hours_tenth * 10) + + var/return_overlays = list() + + var/mutable_appearance/minute_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_one]") + minute_one_overlay.pixel_w = 0 + return_overlays += minute_one_overlay + + var/mutable_appearance/minute_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_tenth]") + minute_tenth_overlay.pixel_w = -4 + return_overlays += minute_tenth_overlay + + var/mutable_appearance/separator = mutable_appearance('icons/obj/digital_clock.dmi', "+separator") + return_overlays += separator + + var/mutable_appearance/hour_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_one]") + hour_one_overlay.pixel_w = -10 + return_overlays += hour_one_overlay + + var/mutable_appearance/hour_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_tenth]") + hour_tenth_overlay.pixel_w = -14 + return_overlays += hour_tenth_overlay + + return return_overlays + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/digital_clock, 28) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b67be3847eb..6dad3c261c5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -156,11 +156,6 @@ /obj/machinery/door/airlock/Initialize(mapload) . = ..() - //SKYRAT EDIT ADDITION BEGIN - Door aesthetic overhaul - if(multi_tile) - SetBounds() - update_overlays() - //SKYRAT EDIT END wires = set_wires() if(glass) airlock_material = "glass" @@ -1212,10 +1207,12 @@ var/dangerous_close = !safe || force_crush if(!dangerous_close) - for(var/atom/movable/M in get_turf(src)) - if(M.density && M != src) //something is blocking the door - autoclose_in(DOOR_CLOSE_WAIT) - return FALSE + for(var/turf/checked_turf in get_turfs()) // SKYRAT EDIT ADD + //for(var/atom/movable/M in get_turf(src)) // Original + for(var/atom/movable/M in checked_turf) // SKYRAT EDIT CHANGE + if(M.density && M != src) //something is blocking the door + autoclose_in(DOOR_CLOSE_WAIT) + return FALSE if(!try_to_force_door_shut(forced)) return FALSE diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm new file mode 100644 index 00000000000..00da0ffa21a --- /dev/null +++ b/code/game/machinery/incident_display.dm @@ -0,0 +1,374 @@ +GLOBAL_LIST_EMPTY(map_delamination_counters) + +/// Display days since last delam on incident sign +#define DISPLAY_DELAM (1<<0) +/// Display current number of tram hits on incident sign +#define DISPLAY_TRAM (1<<1) + +DEFINE_BITFIELD(sign_features, list( + "DISPLAY_DELAM" = DISPLAY_DELAM, + "DISPLAY_TRAM" = DISPLAY_TRAM, +)) + +#define TREND_RISING "rising" +#define TREND_FALLING "falling" + +#define NAME_DUAL "safety incident display" +#define NAME_DELAM "delamination incident display" +#define NAME_TRAM "tram incident display" + +#define DESC_DUAL "A display that provides information on the station's safety record. Features an advert for SAFETY MOTH." +#define DESC_DELAM "A signs describe how long it's been since the last delamination incident. Features an advert for SAFETY MOTH." +#define DESC_TRAM "A display that provides the number of tram related safety incidents this shift. Features an advert for SAFETY MOTH." + +/** + * List of safety statistic signs on the map that have delam counting enabled. + * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. + */ + +/obj/machinery/incident_display + name = NAME_DELAM + desc = DESC_DELAM + icon = 'icons/obj/machines/incident_display.dmi' + icon_preview = "stat_display_delam" + icon_state = "stat_display_delam" + verb_say = "beeps" + verb_ask = "bloops" + verb_exclaim = "blares" + idle_power_usage = 450 + max_integrity = 150 + integrity_failure = 0.75 + custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, /datum/material/alloy/titaniumglass = SHEET_MATERIAL_AMOUNT * 4) + /// What statistics we want the sign to display + var/sign_features = DISPLAY_DELAM + /// Tram hits before hazard warning + var/hit_threshold = 0 + /// Tram hits + var/hit_count = 0 + /// Shifts without delam + var/last_delam = 0 + /// Delam record high-score + var/delam_record = 0 + +/obj/machinery/incident_display/dual + name = NAME_DUAL + desc = DESC_DUAL + icon_preview = "stat_display_dual" + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + +/obj/machinery/incident_display/delam + name = NAME_DELAM + desc = DESC_DELAM + icon_preview = "stat_display_delam" + icon_state = "stat_display_delam" + sign_features = DISPLAY_DELAM + +/obj/machinery/incident_display/tram + name = NAME_TRAM + desc = DESC_TRAM + icon_preview = "stat_display_tram" + icon_state = "stat_display_tram" + sign_features = DISPLAY_TRAM + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/delam, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/dual, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) + +/obj/machinery/incident_display/Initialize(mapload) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/incident_display/LateInitialize() + . = ..() + GLOB.map_delamination_counters += src + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts) + RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(update_tram_count)) + + update_appearance() + +/obj/machinery/incident_display/Destroy() + GLOB.map_delamination_counters -= src + return ..() + +/obj/machinery/incident_display/welder_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return FALSE + + if(atom_integrity >= max_integrity && !(machine_stat & BROKEN)) + balloon_alert(user, "it doesn't need repairs!") + return TRUE + + balloon_alert(user, "repairing display...") + if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50)) + return TRUE + + balloon_alert(user, "repaired") + atom_integrity = max_integrity + set_machine_stat(machine_stat & ~BROKEN) + update_appearance() + return TRUE + +// Switch modes with multitool +/obj/machinery/incident_display/multitool_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return FALSE + + if(sign_features == DISPLAY_TRAM) + tool.play_tool_sound(src) + balloon_alert(user, "set to dual") + name = NAME_DUAL + desc = DESC_DUAL + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + update_tram_count(src, SSpersistence.tram_hits_this_round) + update_appearance() + return TRUE + else if(sign_features == DISPLAY_DELAM) + tool.play_tool_sound(src) + balloon_alert(user, "set to tram") + name = NAME_TRAM + desc = DESC_TRAM + icon_state = "stat_display_tram" + sign_features = DISPLAY_TRAM + update_tram_count(src, SSpersistence.tram_hits_this_round) + update_appearance() + return TRUE + else if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) + tool.play_tool_sound(src) + balloon_alert(user, "set to delam") + name = NAME_DELAM + desc = DESC_DELAM + icon_state = "stat_display_delam" + sign_features = DISPLAY_DELAM + update_delam_count(SSpersistence.rounds_since_engine_exploded, SSpersistence.delam_highscore) + update_appearance() + return TRUE + +// EMP causes the display to display random numbers or outright break. +/obj/machinery/incident_display/emp_act(severity) + . = ..() + if(prob(50)) + set_machine_stat(machine_stat | BROKEN) + update_appearance() + return + name = NAME_DUAL + desc = DESC_DUAL + icon_state = "stat_display_dual" + sign_features = DISPLAY_DELAM | DISPLAY_TRAM + hit_threshold = rand(1,99) + hit_count = rand(1,99) + last_delam = rand(1,99) + delam_record = rand(1,99) + update_appearance() + +/obj/machinery/incident_display/deconstruct() + if(flags_1 & NODECONSTRUCT_1) + return + + new /obj/item/stack/sheet/mineral/titanium(drop_location(), 2) + new /obj/item/shard(drop_location()) + new /obj/item/shard(drop_location()) + + qdel(src) + +/obj/machinery/incident_display/proc/update_delam_count(new_count, record) + delam_record = record + last_delam = min(new_count, 199) + update_appearance() + +/obj/machinery/incident_display/proc/update_tram_count(source, tram_collisions) + SIGNAL_HANDLER + + hit_count = min(tram_collisions, 199) + update_appearance() + +/obj/machinery/incident_display/update_appearance(updates=ALL) + . = ..() + if(machine_stat & NOPOWER) + icon_state = "stat_display_blank" + set_light(0) + return + + if(machine_stat & BROKEN) + icon_state = "stat_display_broken" + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_DARK_BLUE) + return + + if(sign_features == (DISPLAY_DELAM + DISPLAY_TRAM)) + icon_state = "stat_display_dual" + else if(sign_features == DISPLAY_DELAM) + icon_state = "stat_display_delam" + else if(sign_features == DISPLAY_TRAM) + icon_state = "stat_display_tram" + + set_light(l_range = 1.7, l_power = 1.5, l_color = LIGHT_COLOR_FAINT_BLUE) + +/obj/machinery/incident_display/update_overlays() + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return + + var/mutable_appearance/moff_base_emissive = emissive_appearance(icon, "moff_base_emissive", src, alpha = src.alpha) + . += moff_base_emissive + + if(sign_features & DISPLAY_DELAM) + var/mutable_appearance/delam_base_emissive = emissive_appearance(icon, "delam_base_emissive", src, alpha = src.alpha) + var/delam_display_color + . += delam_base_emissive + if(!last_delam) + delam_display_color = LIGHT_COLOR_INTENSE_RED + else + delam_display_color = LIGHT_COLOR_HOLY_MAGIC + + var/delam_pos1 = last_delam % 10 + var/mutable_appearance/delam_pos1_overlay = mutable_appearance(icon, "num_[delam_pos1]") + var/mutable_appearance/delam_pos1_emissive = emissive_appearance(icon, "num_[delam_pos1]_e", src, alpha = src.alpha) + delam_pos1_overlay.color = delam_display_color + delam_pos1_overlay.pixel_w = 9 + delam_pos1_emissive.pixel_w = 9 + delam_pos1_overlay.pixel_z = 4 + delam_pos1_emissive.pixel_z = 4 + . += delam_pos1_overlay + . += delam_pos1_emissive + + var/delam_pos2 = (last_delam / 10) % 10 + var/mutable_appearance/delam_pos2_overlay = mutable_appearance(icon, "num_[delam_pos2]") + var/mutable_appearance/delam_pos2_emissive = emissive_appearance(icon, "num_[delam_pos2]_e", src, alpha = src.alpha) + delam_pos2_overlay.color = delam_display_color + delam_pos2_overlay.pixel_w = 4 + delam_pos2_emissive.pixel_w = 4 + delam_pos2_overlay.pixel_z = 4 + delam_pos2_emissive.pixel_z = 4 + . += delam_pos2_overlay + . += delam_pos2_emissive + + if(last_delam >= 100) + var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_red") + var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_red", src, alpha = src.alpha) + . += there_i_fixed_it_overlay + . += there_i_fixed_it_emissive + + if(last_delam == delam_record) + var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_RISING) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + delam_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN + delam_trend_overlay.pixel_w = 1 + delam_trend_emissive.pixel_w = 1 + delam_trend_overlay.pixel_z = 6 + delam_trend_emissive.pixel_z = 6 + . += delam_trend_overlay + . += delam_trend_emissive + else + var/mutable_appearance/delam_trend_overlay = mutable_appearance(icon, TREND_FALLING) + var/mutable_appearance/delam_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + delam_trend_overlay.color = LIGHT_COLOR_INTENSE_RED + delam_trend_overlay.pixel_w = 1 + delam_trend_emissive.pixel_w = 1 + delam_trend_overlay.pixel_z = 6 + delam_trend_emissive.pixel_z = 6 + . += delam_trend_overlay + . += delam_trend_emissive + + if(sign_features & DISPLAY_TRAM) + var/mutable_appearance/tram_base_emissive = emissive_appearance(icon, "tram_base_emissive", src, alpha = src.alpha) + var/tram_display_color = LIGHT_COLOR_BABY_BLUE + + var/tram_pos1 = hit_count % 10 + var/mutable_appearance/tram_pos1_overlay = mutable_appearance(icon, "num_[tram_pos1]") + var/mutable_appearance/tram_pos1_emissive = emissive_appearance(icon, "num_[tram_pos1]_e", src, alpha = src.alpha) + . += tram_base_emissive + tram_pos1_overlay.color = tram_display_color + tram_pos1_overlay.pixel_w = 9 + tram_pos1_emissive.pixel_w = 9 + tram_pos1_overlay.pixel_z = -6 + tram_pos1_emissive.pixel_z = -6 + . += tram_pos1_overlay + . += tram_pos1_emissive + + var/tram_pos2 = (hit_count / 10) % 10 + var/mutable_appearance/tram_pos2_overlay = mutable_appearance(icon, "num_[tram_pos2]") + var/mutable_appearance/tram_pos2_emissive = emissive_appearance(icon, "num_[tram_pos2]_e", src, alpha = src.alpha) + tram_pos2_overlay.color = tram_display_color + tram_pos2_overlay.pixel_w = 4 + tram_pos2_emissive.pixel_w = 4 + tram_pos2_overlay.pixel_z = -6 + tram_pos2_emissive.pixel_z = -6 + . += tram_pos2_overlay + . += tram_pos2_emissive + + if(hit_count >= 100) + var/mutable_appearance/there_i_fixed_it_overlay = mutable_appearance(icon, "num_100_blue") + var/mutable_appearance/there_i_fixed_it_emissive = emissive_appearance(icon, "num_100_blue", src, alpha = src.alpha) + . += there_i_fixed_it_overlay + . += there_i_fixed_it_emissive + + if(hit_count > SSpersistence.tram_hits_last_round) + var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_RISING) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_RISING]_e", src, alpha = src.alpha) + tram_trend_overlay.color = LIGHT_COLOR_INTENSE_RED + tram_trend_overlay.pixel_w = 1 + tram_trend_emissive.pixel_w = 1 + tram_trend_overlay.pixel_z = -4 + tram_trend_emissive.pixel_z = -4 + . += tram_trend_overlay + . += tram_trend_emissive + else + var/mutable_appearance/tram_trend_overlay = mutable_appearance(icon, TREND_FALLING) + var/mutable_appearance/tram_trend_emissive = emissive_appearance(icon, "[TREND_FALLING]_e", src, alpha = src.alpha) + tram_trend_overlay.color = LIGHT_COLOR_VIVID_GREEN + tram_trend_overlay.pixel_w = 1 + tram_trend_emissive.pixel_w = 1 + tram_trend_overlay.pixel_z = -4 + tram_trend_emissive.pixel_z = -4 + . += tram_trend_overlay + . += tram_trend_emissive + +/obj/machinery/incident_display/examine(mob/user) + . = ..() + + if(sign_features & DISPLAY_DELAM) + . += span_info("It has been [last_delam] shift\s since the last delamination event at this Nanotrasen facility.") + switch (last_delam) + if(0) + . += span_info("In case you didn't notice.
") + if(1) + . += span_info("Let's do better today.
") + if(2 to 5) + . += span_info("There's room for improvement.
") + if(6 to 10) + . += span_info("Good work!
") + if(69) + . += span_info("Nice.
") + else + . += span_info("Incredible!
") + + if(sign_features & DISPLAY_TRAM) + . += span_info("The station has had [hit_count] tram incident\s this shift.") + switch (hit_count) + if(0) + . += span_info("Fantastic! Champions of safety.
") + if(1) + . += span_info("Let's do better tomorrow.
") + if(2 to 5) + . += span_info("There's room for improvement.
") + if(6 to 10) + . += span_info("Good work! Nanotrasen's finest!
") + if(69) + . += span_info("Nice.
") + else + . += span_info("Incredible! You're probably reading this from medbay.
") + +#undef DISPLAY_DELAM +#undef DISPLAY_TRAM + +#undef NAME_DUAL +#undef NAME_DELAM +#undef NAME_TRAM + +#undef DESC_DUAL +#undef DESC_DELAM +#undef DESC_TRAM diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index bcae22d096f..c7b2889d884 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -185,7 +185,10 @@ use_power(power) flick("limbgrower_fill", src) icon_state = "limbgrower_idleon" - selected_category = params["active_tab"] + var/temp_category = params["active_tab"] + if( ! (temp_category in categories) ) + return FALSE //seriously come on + selected_category = temp_category addtimer(CALLBACK(src, PROC_REF(build_item), consumed_reagents_list), production_speed * production_coefficient) return TRUE diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 6d6b3897333..81aba0a347e 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -1,11 +1,15 @@ // Status display -// (formerly Countdown timer display) -#define MAX_STATIC_WIDTH 25 -#define FONT_STYLE "5pt 'Small Fonts'" +#define MAX_STATIC_WIDTH 22 +#define FONT_STYLE "12pt 'TinyUnicode'" #define SCROLL_RATE (0.04 SECONDS) // time per pixel -#define LINE1_Y -7 // SKYRAT EDIT CHANGE - AESTHETICS - originally -8 -#define LINE2_Y -14 // SKYRAT EDIT CHANGE - AESTHETICS - originally -15 +#define SCROLL_PADDING 2 // how many pixels we chop to make a smooth loop +#define LINE1_X 1 +#define LINE1_Y -4 +#define LINE2_X 1 +#define LINE2_Y -11 +#define STATUS_DISPLAY_FONT_DATUM /datum/font/tiny_unicode/size_12pt + /// Status display which can show images and scrolling text. /obj/machinery/status_display name = "status display" @@ -124,14 +128,14 @@ * * message - the new message text. * Returns new /obj/effect/overlay/status_display_text or null if unchanged. */ -/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset) +/obj/machinery/status_display/proc/update_message(obj/effect/overlay/status_display_text/overlay, line_y, message, x_offset, line_pair) if(overlay && message == overlay.message) return null if(overlay) qdel(overlay) - var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset) + var/obj/effect/overlay/status_display_text/new_status_display_text = new(src, line_y, message, text_color, header_text_color, x_offset, line_pair) // Draw our object visually "in front" of this display, taking advantage of sidemap new_status_display_text.pixel_y = -32 new_status_display_text.pixel_z = 32 @@ -149,7 +153,7 @@ return set_light(1.5, 0.7, LIGHT_COLOR_BLUE) // blue light -/obj/machinery/status_display/update_overlays() +/obj/machinery/status_display/update_overlays(updates) . = ..() if(machine_stat & (NOPOWER|BROKEN)) @@ -167,10 +171,18 @@ if(current_picture == AI_DISPLAY_DONT_GLOW) // If the thing's off, don't display the emissive yeah? return . else - var/overlay = update_message(message1_overlay, LINE1_Y, message1) + var/line1_metric + var/line2_metric + var/line_pair + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + line1_metric = display_font.get_metrics(message1) + line2_metric = display_font.get_metrics(message2) + line_pair = (line1_metric > line2_metric ? line1_metric : line2_metric) + + var/overlay = update_message(message1_overlay, LINE1_Y, message1, LINE1_X, line_pair) if(overlay) message1_overlay = overlay - overlay = update_message(message2_overlay, LINE2_Y, message2) + overlay = update_message(message2_overlay, LINE2_Y, message2, LINE2_X, line_pair) if(overlay) message2_overlay = overlay @@ -178,7 +190,7 @@ if(message1 == "" && message2 == "") return - . += emissive_appearance(icon, "outline", src, alpha = src.alpha) + . += emissive_appearance('modular_skyrat/modules/aesthetics/status_display/icons/status_display.dmi', "outline", src, alpha = src.alpha) // SKYRAT EDIT CHANGE - AESTHETICS // Timed process - performs nothing in the base class /obj/machinery/status_display/process() @@ -245,39 +257,23 @@ // If the line is short enough to not marquee, and it matches this, it's a header. var/static/regex/header_regex = regex("^-.*-$") - /// Width of each character, including kerning gap afterwards. - /// We don't use rich text or anything fancy, so we can bake these values. - var/static/list/char_widths = list( - // ! " # $ % & ' ( ) * + , - . / - 1, 2, 3, 5, 4, 5, 5, 2, 3, 3, 3, 4, 2, 3, 2, 3, - // 0 1 2 3 4 5 6 7 8 9 : ; < = > ? - 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 3, 3, 3, 3, - // @ A B C D E F G H I J K L M N O - 7, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // P Q R S T U V W X Y Z [ \ ] ^ _ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 3, 3, 4, 4, - // ` a b c d e f g h i j k l m n o - 3, 5, 5, 5, 5, 4, 4, 5, 5, 2, 4, 5, 4, 6, 5, 5, - // p q r s t u v w x y z { | } ~ - 5, 5, 5, 5, 4, 5, 4, 6, 4, 4, 4, 3, 2, 3, 4, - ) - -/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0) +/obj/effect/overlay/status_display_text/Initialize(mapload, yoffset, line, text_color, header_text_color, xoffset = 0, line_pair) . = ..() maptext_y = yoffset message = line - var/line_width = measure_width(line) + var/datum/font/display_font = new STATUS_DISPLAY_FONT_DATUM() + var/line_width = display_font.get_metrics(line) if(line_width > MAX_STATIC_WIDTH) // Marquee text - var/marquee_message = "[line] - [line] - [line]" + var/marquee_message = "[line] [line] [line]" // Width of full content. Must of these is never revealed unless the user inputted a single character. - var/full_marquee_width = measure_width(marquee_message) + var/full_marquee_width = display_font.get_metrics("[marquee_message] ") // We loop after only this much has passed. - var/looping_marquee_width = measure_width("[line] - ") + var/looping_marquee_width = (display_font.get_metrics("[line] ]") - SCROLL_PADDING) maptext = generate_text(marquee_message, center = FALSE, text_color = text_color) maptext_width = full_marquee_width @@ -287,45 +283,24 @@ add_filter("mask", 1, alpha_mask_filter(icon = icon(icon, "outline"))) // Scroll. - var/time = looping_marquee_width * SCROLL_RATE - animate(src, maptext_x = -looping_marquee_width, time = time, loop = -1) - animate(maptext_x = 0, time = 0) + var/time = line_pair * SCROLL_RATE + animate(src, maptext_x = (-looping_marquee_width) + MAX_STATIC_WIDTH, time = time, loop = -1) + animate(maptext_x = MAX_STATIC_WIDTH, time = 0) else // Centered text var/color = header_regex.Find(line) ? header_text_color : text_color maptext = generate_text(line, center = TRUE, text_color = color) maptext_x = xoffset //Defaults to 0, this would be centered unless overided -/** - * A hyper-streamlined version of MeasureText that doesn't support different fonts, rich formatting, or multiline. - * But it also doesn't require a client. - * - * Returns the width in pixels - * - * Arguments: - * * text - the text to measure - */ -/obj/effect/overlay/status_display_text/proc/measure_width(text) - var/width = 0 - for(var/text_idx in 1 to length(text)) - var/ascii = text2ascii(text, text_idx) - if(!(ascii in 0x20 to 0x7E)) - // So we can't possibly runtime, even though the input should be in range already. - width += 3 - continue - width += char_widths[ascii - 0x1F] - - return width - /** * Generate the actual maptext. * Arguments: * * text - the text to display - * * center - center the text if TRUE, otherwise left-align + * * center - center the text if TRUE, otherwise right-align (the direction the text is coming from) * * text_color - the text color */ /obj/effect/overlay/status_display_text/proc/generate_text(text, center, text_color) - return {"
[text]
"} + return {"
[text]
"} /// Evac display which shows shuttle timer or message set by Command. /obj/machinery/status_display/evac @@ -463,29 +438,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/evac, 32) name = "\improper AI display" desc = "A small screen which the AI can use to present itself." current_mode = SD_PICTURE - - var/emotion = AI_EMOTION_BLANK - - /// A mapping between AI_EMOTION_* string constants, which also double as user readable descriptions, and the name of the iconfile. - var/static/list/emotion_map = list( - AI_EMOTION_BLANK = AI_DISPLAY_DONT_GLOW, - AI_EMOTION_VERY_HAPPY = "ai_veryhappy", - AI_EMOTION_HAPPY = "ai_happy", - AI_EMOTION_NEUTRAL = "ai_neutral", - AI_EMOTION_UNSURE = "ai_unsure", - AI_EMOTION_CONFUSED = "ai_confused", - AI_EMOTION_SAD = "ai_sad", - AI_EMOTION_BSOD = "ai_bsod", - AI_EMOTION_PROBLEMS = "ai_trollface", - AI_EMOTION_AWESOME = "ai_awesome", - AI_EMOTION_DORFY = "ai_urist", - AI_EMOTION_THINKING = "ai_thinking", - AI_EMOTION_FACEPALM = "ai_facepalm", - AI_EMOTION_FRIEND_COMPUTER = "ai_friend", - AI_EMOTION_BLUE_GLOW = "ai_sal", - AI_EMOTION_RED_GLOW = "ai_hal", - ) - + var/emotion = AI_DISPLAY_DONT_GLOW MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) @@ -501,8 +454,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) if(!isAI(user)) return var/list/choices = list() - for(var/emotion_const in emotion_map) - var/icon_state = emotion_map[emotion_const] + for(var/emotion_const in GLOB.ai_status_display_emotes) + var/icon_state = GLOB.ai_status_display_emotes[emotion_const] choices[emotion_const] = image(icon = 'icons/obj/status_display.dmi', icon_state = icon_state) var/emotion_result = show_radial_menu(user, src, choices, tooltips = TRUE) @@ -517,7 +470,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) update_appearance() return PROCESS_KILL - set_picture(emotion_map[emotion]) + set_picture(GLOB.ai_status_display_emotes[emotion]) return PROCESS_KILL /obj/item/circuit_component/status_display @@ -598,5 +551,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) #undef MAX_STATIC_WIDTH #undef FONT_STYLE #undef SCROLL_RATE +#undef LINE1_X #undef LINE1_Y +#undef LINE2_X #undef LINE2_Y +#undef STATUS_DISPLAY_FONT_DATUM diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm index 4bccd80a0ea..8b494e8bac3 100644 --- a/code/game/objects/effects/decals/cleanable/aliens.dm +++ b/code/game/objects/effects/decals/cleanable/aliens.dm @@ -51,7 +51,7 @@ /obj/effect/decal/cleanable/xenoblood/xgibs/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER - if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc))) + if(NeverShouldHaveComeHere(loc)) return new /obj/effect/decal/cleanable/xenoblood/xsplatter(loc) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 2b4313bb237..998d60e0421 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -73,9 +73,11 @@ layer = ABOVE_WINDOW_LAYER plane = GAME_PLANE vis_flags = VIS_INHERIT_PLANE - turf_loc_check = FALSE alpha = 180 +/obj/effect/decal/cleanable/blood/splatter/over_window/NeverShouldHaveComeHere(turf/here_turf) + return isgroundlessturf(here_turf) + /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" desc = "They look like tracks left by wheels." @@ -103,7 +105,6 @@ plane = GAME_PLANE random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = FALSE - turf_loc_check = FALSE dryname = "rotting gibs" drydesc = "They look bloody and gruesome while some terrible smell fills the air." @@ -169,7 +170,7 @@ /obj/effect/decal/cleanable/blood/gibs/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER - if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc))) + if(NeverShouldHaveComeHere(loc)) return new /obj/effect/decal/cleanable/blood/splatter(loc, streak_diseases) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index a7f8f141a2e..19853660361 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -20,9 +20,8 @@ pixel_x = base_pixel_x + rand(-5, 5) pixel_y = base_pixel_y + rand(-5, 5) -/obj/effect/decal/cleanable/ash/crematorium -//crematoriums need their own ash cause default ash deletes itself if created in an obj - turf_loc_check = FALSE +/obj/effect/decal/cleanable/ash/NeverShouldHaveComeHere(turf/here_turf) + return !istype(here_turf, /obj/structure/bodycontainer/crematorium) && ..() /obj/effect/decal/cleanable/ash/large name = "large pile of ashes" diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 4ca68e8c0cc..e20314d161e 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -36,7 +36,7 @@ /obj/effect/decal/cleanable/robot_debris/proc/spread_movement_effects(datum/move_loop/has_target/source) SIGNAL_HANDLER - if(isclosedturf(loc) || (isgroundlessturf(loc) && !SSmapping.get_turf_below(loc))) + if(NeverShouldHaveComeHere(loc)) return if (prob(40)) new /obj/effect/decal/cleanable/oil/streak(loc) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 17ff9c6d695..f0db747c2ce 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -31,8 +31,8 @@ add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) -/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T) - return isgroundlessturf(T) +/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/here_turf) + return isgroundlessturf(here_turf) /obj/effect/decal/cleanable/crayon/proc/on_painted(datum/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) SIGNAL_HANDLER diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 291b9b9cb4f..ade4b4b5108 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -8,12 +8,11 @@ /obj/effect/decal/Initialize(mapload) . = ..() - if(turf_loc_check && NeverShouldHaveComeHere(loc)) -#ifdef UNIT_TESTS - stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. Please remove it or set turf_loc_check to FALSE on the decal if intended.") -#else + if(NeverShouldHaveComeHere(loc)) + if(mapload) + stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \ + Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.") return INITIALIZE_HINT_QDEL -#endif var/static/list/loc_connections = list( COMSIG_TURF_CHANGE = PROC_REF(on_decal_move), ) @@ -23,8 +22,9 @@ if(B && B.loc == loc) qdel(src) -/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T) - return isclosedturf(T) || (isgroundlessturf(T) && !SSmapping.get_turf_below(T)) +///Checks if we are allowed to be in `here_turf`, and returns that result. Subtypes should override this when necessary. +/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/here_turf) + return isclosedturf(here_turf) || (isgroundlessturf(here_turf) && !SSmapping.get_turf_below(here_turf)) /obj/effect/decal/ex_act(severity, target) qdel(src) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 940efd0c752..82a4c77603b 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -14,6 +14,9 @@ desc = "They look like human remains. They have a strange aura about them." icon_state = "remains" +/obj/effect/decal/remains/human/NeverShouldHaveComeHere(turf/here_turf) + return !istype(here_turf, /obj/structure/closet/crate/grave/filled) && ..() + /obj/effect/decal/remains/human/smokey desc = "They look like human remains. They have a strange, smokey aura about them..." ///Our proximity monitor, for detecting nearby looters. @@ -48,7 +51,9 @@ /obj/effect/decal/remains/plasma icon_state = "remainsplasma" - turf_loc_check = FALSE + +/obj/effect/decal/remains/plasma/NeverShouldHaveComeHere(turf/here_turf) + return isclosedturf(here_turf) /obj/effect/decal/remains/xeno desc = "They look like the remains of something... alien. They have a strange aura about them." diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index fc141acecb8..0d5b7bf1463 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -17,7 +17,7 @@ if(randomdir) setDir(pick(GLOB.cardinals)) - timerid = QDEL_IN(src, duration) + timerid = QDEL_IN_STOPPABLE(src, duration) /obj/effect/temp_visual/Destroy() . = ..() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 75d1e0bd104..bcb0933d581 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -1,5 +1,5 @@ -/obj/item/gps//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/gps //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "global positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/telescience.dmi' diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index f050edfbf15..2b4899baa54 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -34,7 +34,7 @@ living_mob.Knockdown(max(200/max(1, distance), 60)) //Bang - if(!distance || loc == living_mob || loc == living_mob.loc) //Stop allahu akbarring rooms with this. + if(!distance || loc == living_mob || loc == living_mob.loc) living_mob.Paralyze(20) living_mob.Knockdown(200) living_mob.soundbang_act(1, 200, 10, 15) diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 28a4934866b..abe487a0166 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -1,15 +1,33 @@ +/** + * Note that we can stack explosive implants and thus increase the payload's devastation radius. (https://github.com/tgstation/tgstation/pull/50674) + * That's why the three devastation values for the microbomb implant are balanced around in such a way + * that buying one macrobomb equals to buying 10 microbombs and stacking them. + */ + +#define MICROBOMB_DELAY 0.7 SECONDS + +#define MICROBOMB_EXPLOSION_LIGHT 2 +#define MICROBOMB_EXPLOSION_HEAVY 0.8 +#define MICROBOMB_EXPLOSION_DEVASTATE 0.4 + /obj/item/implant/explosive name = "microbomb implant" desc = "And boom goes the weasel." icon_state = "explosive" - actions_types = list(/datum/action/item_action/explosive_implant) - // Explosive implant action is always available. - var/weak = 2 - var/medium = 0.8 - var/heavy = 0.4 - var/delay = 7 - var/popup = FALSE // is the DOUWANNABLOWUP window open? + actions_types = list(/datum/action/item_action/explosive_implant) //Explosive implant action is always available. + ///Whether the implant's explosion sequence has been activated or not var/active = FALSE + ///The final countdown (delay before we explode) + var/delay = MICROBOMB_DELAY + ///Radius of weak devastation explosive impact + var/explosion_light = MICROBOMB_EXPLOSION_LIGHT + ///Radius of medium devastation explosive impact + var/explosion_heavy = MICROBOMB_EXPLOSION_HEAVY + ///Radius of heavy devastation explosive impact + var/explosion_devastate = MICROBOMB_EXPLOSION_DEVASTATE + ///Whether the confirmation UI popup is active or not + var/popup = FALSE + /obj/item/implant/explosive/proc/on_death(datum/source, gibbed) SIGNAL_HANDLER @@ -46,16 +64,16 @@ return FALSE if(cause == "death" && HAS_TRAIT(imp_in, TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION)) return FALSE - heavy = round(heavy) - medium = round(medium) - weak = round(weak) + explosion_devastate = round(explosion_devastate) + explosion_heavy = round(explosion_heavy) + explosion_light = round(explosion_light) to_chat(imp_in, span_notice("You activate your [name].")) active = TRUE var/turf/boomturf = get_turf(imp_in) message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") -//If the delay is short, just blow up already jeez - if(delay <= 7) - explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src) + //If the delay is shorter or equal to the default delay, just blow up already jeez + if(delay <= MICROBOMB_DELAY) + explosion(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src) if(imp_in) imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) imp_in.gib(TRUE) @@ -64,13 +82,14 @@ timed_explosion() /obj/item/implant/explosive/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) - for(var/X in target.implants) - if(istype(X, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs - var/obj/item/implant/explosive/imp_e = X - imp_e.heavy += heavy - imp_e.medium += medium - imp_e.weak += weak - imp_e.delay += delay + for(var/target_implant in target.implants) + if(istype(target_implant, /obj/item/implant/explosive)) //we don't use our own type here, because macrobombs inherit this proc and need to be able to upgrade microbombs + //We merge the two implants into a single bigger, badder one by adding the injected implant's values into the already present implant + var/obj/item/implant/explosive/implant_to_upgrade = target_implant + implant_to_upgrade.explosion_devastate += explosion_devastate + implant_to_upgrade.explosion_heavy += explosion_heavy + implant_to_upgrade.explosion_light += explosion_light + implant_to_upgrade.delay += delay qdel(src) return TRUE @@ -83,6 +102,10 @@ if(.) UnregisterSignal(target, COMSIG_LIVING_DEATH) +/** + * Explosive activation sequence for implants with a delay longer than 0.7 seconds. + * Make the implantee beep a few times, keel over and explode. Usually to a devastating effect. + */ /obj/item/implant/explosive/proc/timed_explosion() imp_in.visible_message(span_warning("[imp_in] starts beeping ominously!")) @@ -97,30 +120,34 @@ ) playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) + sleep(delay * 0.25) if(imp_in && !imp_in.stat) imp_in.visible_message(span_warning("[imp_in] doubles over in pain!")) - imp_in.Paralyze(140) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - playsound(loc, 'sound/items/timer.ogg', 30, FALSE) - sleep(delay*0.25) - explosion(src, devastation_range = heavy, heavy_impact_range = medium, light_impact_range = weak, flame_range = weak, flash_range = weak, explosion_cause = src) + imp_in.Paralyze(14 SECONDS) + //total of 4 bomb beeps, and we've already beeped once + var/bomb_beeps_until_boom = 3 + while(bomb_beeps_until_boom > 0) + //for extra spice + var/beep_volume = 35 + playsound(loc, 'sound/items/timer.ogg', beep_volume, FALSE) + sleep(delay * 0.25) + bomb_beeps_until_boom-- + beep_volume += 5 + explosion(src, devastation_range = explosion_devastate, heavy_impact_range = explosion_heavy, light_impact_range = explosion_light, flame_range = explosion_light, flash_range = explosion_light, explosion_cause = src) if(imp_in) imp_in.investigate_log("has been gibbed by an explosive implant.", INVESTIGATE_DEATHS) imp_in.gib(TRUE) qdel(src) +//Macrobomb has the strength and delay of 10 microbombs /obj/item/implant/explosive/macro name = "macrobomb implant" desc = "And boom goes the weasel. And everything else nearby." icon_state = "explosive" - weak = 20 //the strength and delay of 10 microbombs - medium = 8 - heavy = 4 - delay = 70 + delay = 10 * MICROBOMB_DELAY + explosion_light = 10 * MICROBOMB_EXPLOSION_LIGHT + explosion_heavy = 10 * MICROBOMB_EXPLOSION_HEAVY + explosion_devastate = 10 * MICROBOMB_EXPLOSION_DEVASTATE /obj/item/implanter/explosive name = "implanter (microbomb)" @@ -138,3 +165,8 @@ /datum/action/item_action/explosive_implant check_flags = NONE name = "Activate Explosive Implant" + +#undef MICROBOMB_DELAY +#undef MICROBOMB_EXPLOSION_LIGHT +#undef MICROBOMB_EXPLOSION_HEAVY +#undef MICROBOMB_EXPLOSION_DEVASTATE diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 815d20161ce..65f11c2519b 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -18,7 +18,7 @@ /obj/item/implant/tracking/c38/implant(mob/living/target, mob/user, silent, force) . = ..() - timerid = QDEL_IN(src, lifespan) + timerid = QDEL_IN_STOPPABLE(src, lifespan) /obj/item/implant/tracking/c38/removed(mob/living/source, silent, special) . = ..() diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 218310f4e64..474017e4243 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -43,34 +43,6 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list( new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/heat_exchanging/manifold4w, FALSE), new /datum/pipe_info/pipe("Junction", /obj/machinery/atmospherics/pipe/heat_exchanging/junction, FALSE), new /datum/pipe_info/pipe("Heat Exchanger", /obj/machinery/atmospherics/components/unary/heat_exchanger, FALSE), - ), - "Air Sensors" = list( - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/plasma_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/oxygen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrogen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/mix_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrous_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/air_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/carbon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/bz_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/freon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/halon_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/healium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hydrogen_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/hypernoblium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/miasma_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/nitrium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/pluoxium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/proto_nitrate_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/tritium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/water_vapor_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/zauker_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/helium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/antinoblium_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/incinerator_tank), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_burn_chamber), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/ordnance_freezer_chamber), - new /datum/pipe_info/sensor(/obj/machinery/air_sensor/engine_chamber), ) )) @@ -112,9 +84,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/dirtype = PIPE_BENDABLE var/all_layers -/datum/pipe_info/proc/Params() - return "" - /datum/pipe_info/proc/get_preview(selected_dir, selected = FALSE) var/list/dirs switch(dirtype) @@ -154,14 +123,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return rows -/datum/pipe_info/sensor - dirtype = PIPE_ONEDIR - -/datum/pipe_info/sensor/New(obj/machinery/air_sensor/sensor) - id = sensor - name = capitalize(replacetext(initial(sensor.name), "gas sensor", "")) - icon_state = "gsensor1" - /datum/pipe_info/pipe/New(label, obj/machinery/atmospherics/path, use_five_layers) name = label id = path @@ -170,9 +131,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/obj/item/pipe/c = initial(path.construction_type) dirtype = initial(c.RPD_type) -/datum/pipe_info/pipe/Params() - return "makepipe=[id]&type=[dirtype]" - /datum/pipe_info/meter icon_state = "meter" dirtype = PIPE_ONEDIR @@ -180,9 +138,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( /datum/pipe_info/meter/New(label) name = label -/datum/pipe_info/meter/Params() - return "makemeter=[id]&type=[dirtype]" - /datum/pipe_info/disposal/New(label, obj/path, dt=PIPE_UNARY) name = label id = path @@ -193,9 +148,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( dirtype = dt -/datum/pipe_info/disposal/Params() - return "dmake=[id]&type=[dirtype]" - /datum/pipe_info/transit/New(label, obj/path, dt=PIPE_UNARY) name = label id = path @@ -309,12 +261,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ui_interact(user) /obj/item/pipe_dispenser/pre_attack_secondary(obj/machinery/atmospherics/target, mob/user, params) - if(istype(target, /obj/machinery/air_sensor)) - if(!do_after(user, destroy_speed, target)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - qdel(target) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!istype(target, /obj/machinery/atmospherics)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(target.pipe_color && target.piping_layer) @@ -377,13 +323,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( for(var/i in 1 to cat.len) var/datum/pipe_info/info = cat[i] - //skip sensors which are already in the world so we dont create duplicate ones - if(info.type == /datum/pipe_info/sensor) - var/datum/pipe_info/sensor/sensor_info = info - var/obj/machinery/air_sensor/sensor = sensor_info.id - if(GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(initial(sensor.chamber_id))] != null) - continue - r += list(list( "pipe_name" = info.name, "pipe_index" = i, @@ -391,8 +330,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( )) if(info == recipe) data["selected_category"] = c - if(r.len == 0) //when all air sensors are installed this list will become empty - continue + data["categories"] += list(list("cat_name" = c, "recipes" = r)) var/list/init_directions = list("north" = FALSE, "south" = FALSE, "east" = FALSE, "west" = FALSE) @@ -587,14 +525,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( PM.setAttachLayer(piping_layer) if(mode & WRENCH_MODE) PM.wrench_act(user, src) - else if(recipe.type == /datum/pipe_info/sensor) - if(do_after(user, atmos_build_speed, target = attack_target)) - activate() - var/datum/pipe_info/sensor/sensor_recipe = recipe - var/obj/machinery/air_sensor/sensor_blueprint = sensor_recipe.id - new sensor_blueprint(get_turf(attack_target)) - //change the recipe as the current one becomes unavailable - recipe = first_atmos else if(recipe.all_layers == FALSE && (piping_layer == 1 || piping_layer == 5)) balloon_alert(user, "cant build on this layer!") diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index e1a0c8bd4fd..c1843aa5658 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -267,9 +267,9 @@ /obj/item/borg/upgrade/lavaproof name = "mining cyborg lavaproof chassis" - desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock." + desc = "An upgrade kit to apply specialized coolant systems and insulation layers to a mining cyborg's chassis, enabling them to withstand exposure to molten rock and liquid plasma." icon_state = "ash_plating" - resistance_flags = LAVA_PROOF | FIRE_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF require_model = TRUE model_type = list(/obj/item/robot_model/miner) model_flags = BORG_MODEL_MINER @@ -277,12 +277,12 @@ /obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) - ADD_TRAIT(R, TRAIT_LAVA_IMMUNE, type) + R.add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type) /obj/item/borg/upgrade/lavaproof/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) - REMOVE_TRAIT(R, TRAIT_LAVA_IMMUNE, type) + R.remove_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_SNOWSTORM_IMMUNE), type) /obj/item/borg/upgrade/selfrepair name = "self-repair module" diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 8210cf05a1b..de827380948 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -1,5 +1,5 @@ //Bluespace crystals, used in telescience and when crushed it will blink you to a random turf. -/obj/item/stack/ore/bluespace_crystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/stack/ore/bluespace_crystal name = "bluespace crystal" desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." icon = 'icons/obj/telescience.dmi' @@ -62,7 +62,7 @@ merge_type = /obj/item/stack/ore/bluespace_crystal/artificial //Polycrystals, aka stacks -/obj/item/stack/sheet/bluespace_crystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/stack/sheet/bluespace_crystal name = "bluespace polycrystal" icon = 'icons/obj/telescience.dmi' icon_state = "polycrystal" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index be9c6026beb..3e3ca870e0b 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -177,6 +177,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, check_density = FALSE, category = CAT_CONTAINERS), \ new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2, check_density = FALSE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("basketball", /obj/item/toy/basketball, 20, check_density = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("baseball", /obj/item/toy/beach_ball/baseball, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("saddle", /obj/item/saddle, 5, check_density = FALSE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2, check_density = FALSE, category = CAT_CLOTHING), \ new/datum/stack_recipe("cowboy boots", /obj/item/clothing/shoes/cowboy, 2, check_density = FALSE, category = CAT_CLOTHING), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 92d183154d2..b5dee280466 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -622,7 +622,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cardboard - novariants = TRUE grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/cardboard diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 8f2503847ac..09096e1d656 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -566,7 +566,8 @@ * - [inhand][boolean]: Whether or not the stack to check should act like it's in a mob's hand. */ /obj/item/stack/proc/can_merge(obj/item/stack/check, inhand = FALSE) - if(!istype(check, merge_type)) + // We don't only use istype here, since that will match subtypes, and stack things that shouldn't stack + if(!istype(check, merge_type) || check.merge_type != merge_type) return FALSE if(mats_per_unit ~! check.mats_per_unit) // ~! in case of lists this operator checks only keys, but not values return FALSE diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 66c8f1f077d..248d9c97155 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -1,4 +1,4 @@ -/obj/item/stack/telecrystal//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/stack/telecrystal name = "telecrystal" desc = "It seems to be pulsing with suspiciously enticing energies." singular_name = "telecrystal" diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm index c67bf0c7f40..034488af89c 100644 --- a/code/game/objects/items/stacks/tiles/tile_iron.dm +++ b/code/game/objects/items/stacks/tiles/tile_iron.dm @@ -5,7 +5,7 @@ icon_state = "tile" inhand_icon_state = "tile" force = 6 - mats_per_unit = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) + mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*0.25) throwforce = 10 flags_1 = CONDUCT_1 turf_type = /turf/open/floor/iron diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 45337d70c28..ee5d6673556 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1631,3 +1631,20 @@ GLOBAL_LIST_EMPTY(intento_players) #undef TIME_TO_BEGIN #undef TIME_PER_DEMO_STEP #undef TIME_TO_RESET_ICON + +/* + * Runic Scepter + */ +/obj/item/toy/foam_runic_scepter + name = "foam scepter" + desc = "A foam replica of the scepters Wizards us on Vendormancy Soccer." + icon_state = "vendor_staff" + inhand_icon_state = "vendor_staff" + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + icon = 'icons/obj/weapons/guns/magic.dmi' + slot_flags = ITEM_SLOT_BACK + attack_verb_continuous = list("smacks", "clubs", "wacks", "vendors") + attack_verb_simple = list("smack", "club", "wacks", "vendor") + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 4931a9f3782..dc55e46897d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -13,7 +13,7 @@ new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/qm(src) new /obj/item/circuitboard/machine/ore_silo(src) - new /obj/item/gun/ballistic/rifle/boltaction/quartermaster(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! + new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! new /obj/item/cargo_teleporter(src) // SKYRAT EDIT - Adds a cargo teleporter to QM locker, so they can intice others to research it new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) //SKYRAT EDIT - GUN CARGO new /obj/item/storage/bag/garment/quartermaster(src) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 9cf5d622667..23da14ec788 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -261,7 +261,7 @@ door.setDir(dir) //SKYRAT EDIT ADDITION BEGIN - LARGE_DOORS if(door.multi_tile) - door.SetBounds() + door.set_bounds() //SKYRAT EDIT END door.unres_sides = electronics.unres_sides //door.req_access = req_access diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 4456782ccd4..96afd16f4f5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -236,7 +236,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an if(!length(compiled)) // No mobs? icon_state = "morgue3" return ..() - + if(!(obj_flags & EMAGGED)) for(var/mob/living/occupant as anything in compiled) var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) @@ -341,7 +341,7 @@ GLOBAL_LIST_EMPTY(crematoriums) qdel(O) if(!locate(/obj/effect/decal/cleanable/ash) in get_step(src, dir))//prevent pile-up - new/obj/effect/decal/cleanable/ash/crematorium(src) + new/obj/effect/decal/cleanable/ash(src) sleep(3 SECONDS) diff --git a/code/game/objects/structures/signs/signs_interactive.dm b/code/game/objects/structures/signs/signs_interactive.dm index 5c3b85c7764..1e407034f4a 100644 --- a/code/game/objects/structures/signs/signs_interactive.dm +++ b/code/game/objects/structures/signs/signs_interactive.dm @@ -1,5 +1,3 @@ -#define COLLISION_HAZARD_THRESHOLD 11 - /obj/structure/sign/clock name = "wall clock" desc = "It's your run-of-the-mill wall clock showing both the local Coalition Standard Time and the galactic Treaty Coordinated Time. Perfect for staring at instead of working." @@ -26,141 +24,3 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/calendar, 32) . += span_info("Events:") for(var/holidayname in GLOB.holidays) . += span_info("[holidayname]") - -/** - * List of delamination counter signs on the map. - * Required as persistence subsystem loads after the ones present at mapload, and to reset to 0 upon explosion. - */ -GLOBAL_LIST_EMPTY(map_delamination_counters) - -/obj/structure/sign/delamination_counter - name = "delamination counter" - sign_change_name = "Flip Sign- Supermatter Delamination" - desc = "A pair of flip signs describe how long it's been since the last delamination incident." - icon_state = "days_since_explosion" - is_editable = TRUE - var/since_last = 0 - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/delamination_counter, 32) - -/obj/structure/sign/delamination_counter/Initialize(mapload) - . = ..() - GLOB.map_delamination_counters += src - if (!mapload) - update_count(SSpersistence.rounds_since_engine_exploded) - -/obj/structure/sign/delamination_counter/Destroy() - GLOB.map_delamination_counters -= src - return ..() - -/obj/structure/sign/delamination_counter/proc/update_count(new_count) - since_last = min(new_count, 99) - update_appearance() - -/obj/structure/sign/delamination_counter/update_overlays() - . = ..() - - var/ones = since_last % 10 - var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[ones]") - ones_overlay.pixel_w = 4 - . += ones_overlay - - var/tens = (since_last / 10) % 10 - var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "days_[tens]") - tens_overlay.pixel_w = -5 - . += tens_overlay - -/obj/structure/sign/delamination_counter/examine(mob/user) - . = ..() - . += span_info("It has been [since_last] day\s since the last delamination event at a Nanotrasen facility.") - switch (since_last) - if (0) - . += span_info("In case you didn't notice.") - if(1) - . += span_info("Let's do better today.") - if(2 to 5) - . += span_info("There's room for improvement.") - if(6 to 10) - . += span_info("Good work!") - if(11 to INFINITY) - . += span_info("Incredible!") - -/obj/structure/sign/collision_counter - name = "incident counter" - sign_change_name = "Indicator board- Tram incidents" - desc = "A display that indicates how many tram related incidents have occured today." - icon_state = "tram_hits" - is_editable = TRUE - var/hit_count = 0 - var/tram_id = TRAM_LIFT_ID - /// Has the tram hit enough people it now flashes hazard lights? - var/hazard_flash = FALSE - -/obj/structure/sign/collision_counter/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/structure/sign/collision_counter/LateInitialize() - . = ..() - for(var/obj/structure/industrial_lift/tram/tram as anything in GLOB.lifts) - if(tram.lift_id != tram_id) - continue - RegisterSignal(tram, COMSIG_TRAM_COLLISION, PROC_REF(new_hit)) - update_appearance() - -/obj/structure/sign/collision_counter/Destroy() - return ..() - -/obj/structure/sign/collision_counter/proc/new_hit(lift_master, collided_type) - SIGNAL_HANDLER - - if(!ismob(collided_type)) - return - - var/mob/victim = collided_type // Real players only, no gaming high score - if(!victim.client) - return - - hit_count++ - - if(hazard_flash) - update_appearance() - return - - if(hit_count == COLLISION_HAZARD_THRESHOLD) // When we hit the threshold, enable flashing the lights - hazard_flash = TRUE - icon_state = "tram_hits_alert" - update_appearance() - return - - update_appearance() - -/obj/structure/sign/collision_counter/update_overlays() - . = ..() - - var/ones = hit_count % 10 - var/mutable_appearance/ones_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[ones]") - ones_overlay.pixel_w = 4 - . += ones_overlay - - var/tens = (hit_count / 10) % 10 - var/mutable_appearance/tens_overlay = mutable_appearance('icons/obj/signs.dmi', "hits_[tens]") - tens_overlay.pixel_w = -5 - . += tens_overlay - -/obj/structure/sign/collision_counter/examine(mob/user) - . = ..() - . += span_info("The station has had [hit_count] incident\s this shift.") - switch (hit_count) - if(0) - . += span_info("Fantastic! Champions of safety.") - if(1) - . += span_info("Let's do better tomorrow.") - if(2 to 5) - . += span_info("There's room for improvement.") - if(6 to 10) - . += span_info("Good work! Nanotrasen's finest!") - if(11 to INFINITY) - . += span_info("Incredible! You're probably reading this from medbay.") - -#undef COLLISION_HAZARD_THRESHOLD diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 240b9765948..8cc063aa1d1 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -279,6 +279,14 @@ // Stops sliding slide_distance = 0 + // SKYRAT EDIT START - Akula species + if(HAS_TRAIT(slipper, TRAIT_SLIPPERY)) + if(!(lube & SLIDE_ICE)) + lube |= SLIDE + + slide_distance = rand(SLIPPERY_MIN, SLIPPERY_MAX) + // SKYRAT EDIT END + var/obj/buckled_obj if(slipper.buckled) if(!(lube & GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index bd94e2ecc87..0702183bfe2 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -201,6 +201,9 @@ message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!")) usr.log_message("non-admin attempted to execute a SDQL query!", LOG_ADMIN) return FALSE + var/prompt = tgui_alert(usr, "Run SDQL2 Query?", "SDQL2", list("Yes", "Cancel")) + if (prompt != "Yes") + return var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]") if(length(results) == 3) for(var/I in 1 to 3) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 5e9a38b869d..e95b1487673 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -264,8 +264,7 @@ playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) qdel(src) else - to_chat(user, span_warning("You can't seem to work up the nerve to shatter the bottle! Perhaps you should try again later.")) - + to_chat(user, span_warning("The bottle's contents usually pop and boil constantly, but right now they're eerily still and calm. Perhaps you should try again later.")) /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) var/mob/living/simple_animal/hostile/imp/slaughter/S = new demon_type(T) diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 584bb05d62a..dce84b93053 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -78,7 +78,7 @@ /obj/item/melee/touch_attack/mansus_fist/proc/after_clear_rune(obj/effect/target, mob/living/user) new /obj/effect/temp_visual/drawing_heretic_rune/fail(target.loc, target.greyscale_colors) var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = spell_which_made_us?.resolve() - grasp?.spell_feedback() + grasp?.spell_feedback(user) remove_hand_with_no_refund(user) diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index 4ce65676069..64c5930e411 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -85,7 +85,7 @@ /obj/item/melee/touch_attack/star_touch/proc/after_clear_rune(obj/effect/target, mob/living/user) new /obj/effect/temp_visual/cosmic_rune_fade(get_turf(target)) var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve() - star_touch_spell?.spell_feedback() + star_touch_spell?.spell_feedback(user) remove_hand_with_no_refund(user) /obj/item/melee/touch_attack/star_touch/ignition_effect(atom/to_light, mob/user) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 16373e02ac7..44c0a564194 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -390,3 +390,126 @@ whistle.whistler = null whistle = null return ..() + +/////////////////////////////////////////Scepter of Vendormancy/////////////////// +#define RUNIC_SCEPTER_MAX_CHARGES 3 +#define RUNIC_SCEPTER_MAX_RANGE 7 + +/obj/item/runic_vendor_scepter + name = "scepter of runic vendormancy" + desc = "This scepter allows you to conjure, force push and detonate Runic Vendors. It can hold up to 3 charges that can be recovered with a simple magical channeling. A modern spin on the old Geomancy spells." + icon_state = "vendor_staff" + inhand_icon_state = "vendor_staff" + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' + icon = 'icons/obj/weapons/guns/magic.dmi' + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_NORMAL + force = 10 + damtype = BRUTE + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + attack_verb_continuous = list("smacks", "clubs", "wacks") + attack_verb_simple = list("smack", "club", "wacks") + + /// Range cap on where you can summon vendors. + var/max_summon_range = RUNIC_SCEPTER_MAX_RANGE + /// Channeling time to summon a vendor. + var/summoning_time = 1 SECONDS + /// Checks if the scepter is channeling a vendor already. + var/scepter_is_busy_summoning = FALSE + /// Checks if the scepter is busy channeling recharges + var/scepter_is_busy_recharging = FALSE + ///Number of summoning charges left. + var/summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + +/obj/item/runic_vendor_scepter/Initialize(mapload) + . = ..() + + RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, PROC_REF(on_magic_charge)) + var/static/list/loc_connections = list( + COMSIG_ITEM_MAGICALLY_CHARGED = PROC_REF(on_magic_charge), + ) + +/obj/item/runic_vendor_scepter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(scepter_is_busy_recharging) + user.balloon_alert(user, "busy!") + return + if(!check_allowed_items(target, not_inside = TRUE)) + return + . |= AFTERATTACK_PROCESSED_ITEM + var/turf/afterattack_turf = get_turf(target) + if(istype(target, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/runic_explosion_target = target + runic_explosion_target.runic_explosion() + return + var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_turf + if(vendor_on_turf) + vendor_on_turf.runic_explosion() + return + if(!summon_vendor_charges) + user.balloon_alert(user, "no charges!") + return + if(get_dist(afterattack_turf,src) > max_summon_range) + user.balloon_alert(user, "too far!") + return + if(get_turf(src) == afterattack_turf) + user.balloon_alert(user, "too close!") + return + if(scepter_is_busy_summoning) + user.balloon_alert(user, "already summoning!") + return + if(afterattack_turf.is_blocked_turf(TRUE)) + user.balloon_alert(user, "blocked!") + return + if(summoning_time) + scepter_is_busy_summoning = TRUE + user.balloon_alert(user, "summoning...") + if(!do_after(user, summoning_time, target = target)) + scepter_is_busy_summoning = FALSE + return + scepter_is_busy_summoning = FALSE + if(summon_vendor_charges) + playsound(src,'sound/weapons/resonator_fire.ogg',50,TRUE) + user.visible_message(span_warning("[user] summons a runic vendor!")) + new /obj/machinery/vending/runic_vendor(afterattack_turf) + summon_vendor_charges-- + user.changeNext_move(CLICK_CD_MELEE) + return + return ..() + +/obj/item/runic_vendor_scepter/attack_self(mob/user, modifiers) + . = ..() + user.balloon_alert(user, "recharging...") + scepter_is_busy_recharging = TRUE + if(!do_after(user, 5 SECONDS)) + scepter_is_busy_recharging = FALSE + return + user.balloon_alert(user, "fully charged") + scepter_is_busy_recharging = FALSE + summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + +/obj/item/runic_vendor_scepter/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + var/turf/afterattack_secondary_turf = get_turf(target) + var/obj/machinery/vending/runic_vendor/vendor_on_turf = locate() in afterattack_secondary_turf + if(istype(target, /obj/machinery/vending/runic_vendor)) + var/obj/machinery/vending/runic_vendor/vendor_being_throw = target + vendor_being_throw.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(vendor_on_turf) + vendor_on_turf.throw_at(get_edge_target_turf(target, get_cardinal_dir(src, target)), 4, 20, user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/runic_vendor_scepter/proc/on_magic_charge(datum/source, datum/action/cooldown/spell/charge/spell, mob/living/caster) + SIGNAL_HANDLER + + if(!ismovable(loc)) + return + + . = COMPONENT_ITEM_CHARGED + + summon_vendor_charges = RUNIC_SCEPTER_MAX_CHARGES + return . + +#undef RUNIC_SCEPTER_MAX_CHARGES +#undef RUNIC_SCEPTER_MAX_RANGE diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm index 9b084b90a64..130b9e66264 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm @@ -97,3 +97,12 @@ limit = 3 category = "Assistance" refundable = TRUE + +/datum/spellbook_entry/item/vendormancer + name = "Scepter of Vendormancy" + desc = "A scepter containing the power of Runic Vendormancy.\ + It can summon up to 3 Runic Vendors that decay over time, but can be \ + throw around to squash oponents or be directly detonated. When out of \ + charges a long channel will restore the charges." + item_path = /obj/item/runic_vendor_scepter + category = "Assistance" diff --git a/code/modules/asset_cache/assets/pipes.dm b/code/modules/asset_cache/assets/pipes.dm index f553051ba7e..66a37de9f86 100644 --- a/code/modules/asset_cache/assets/pipes.dm +++ b/code/modules/asset_cache/assets/pipes.dm @@ -4,4 +4,3 @@ /datum/asset/spritesheet/pipes/create_spritesheets() for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) InsertAll("", each, GLOB.alldirs) - Insert(sprite_name = "gsensor1", I = 'icons/obj/stationobjs.dmi', icon_state = "gsensor1") diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 0aa32f06691..9e0f620eadd 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -654,7 +654,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/airalarm, 27) ///Used for air alarm link helper, which connects air alarm to a sensor with corresponding chamber_id /obj/machinery/airalarm/proc/setup_chamber_link() - var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[CHAMBER_SENSOR_FROM_ID(air_sensor_chamber_id)] + var/obj/machinery/air_sensor/sensor = GLOB.objects_by_id_tag[GLOB.map_loaded_sensors[air_sensor_chamber_id]] if(isnull(sensor)) log_mapping("[src] at [AREACOORD(src)] tried to connect to a sensor, but no sensor with chamber_id:[air_sensor_chamber_id] found!") return 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 bf79819e01b..460b59d744d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -17,11 +17,11 @@ ///Rate of operation of the device var/volume_rate = 50 - ///id of air sensor its connected to - var/chamber_id - /obj/machinery/atmospherics/components/unary/outlet_injector/Initialize(mapload) + if(isnull(id_tag)) + id_tag = assign_random_name() . = ..() + var/static/list/tool_screentips = list( TOOL_MULTITOOL = list( SCREENTIP_CONTEXT_LMB = "Log to link later with air sensor", @@ -42,27 +42,17 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/multitool_act(mob/living/user, obj/item/multitool/multi_tool) . = ..() - if (!istype(multi_tool)) - return . + + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + sensor.inlet_id = id_tag + multi_tool.buffer = null + balloon_alert(user, "input linked to sensor") + return TOOL_ACT_TOOLTYPE_SUCCESS balloon_alert(user, "saved in buffer") multi_tool.buffer = src - return TRUE - -/obj/machinery/atmospherics/components/unary/outlet_injector/wrench_act(mob/living/user, obj/item/I) - . = ..() - if(.) - disconnect_chamber() - -///called when its either unwrenched or destroyed -/obj/machinery/atmospherics/components/unary/outlet_injector/proc/disconnect_chamber() - if(chamber_id != null) - GLOB.objects_by_id_tag -= CHAMBER_INPUT_FROM_ID(chamber_id) - chamber_id = null - -/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy() - disconnect_chamber() - return ..() + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user) if(can_interact(user)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 30c8ca704d9..bc8f282bfb8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -52,23 +52,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/multitool_act(mob/living/user, obj/item/multitool/multi_tool) . = ..() - if (!istype(multi_tool)) - return . + + if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) + var/obj/machinery/air_sensor/sensor = multi_tool.buffer + sensor.outlet_id = id_tag + multi_tool.buffer = null + balloon_alert(user, "output linked to sensor") + return TOOL_ACT_TOOLTYPE_SUCCESS balloon_alert(user, "saved in buffer") multi_tool.buffer = src - return TRUE - -/obj/machinery/atmospherics/components/unary/vent_pump/wrench_act(mob/living/user, obj/item/wrench) - . = ..() - if(.) - disconnect_chamber() - -///called when its either unwrenched or destroyed -/obj/machinery/atmospherics/components/unary/vent_pump/proc/disconnect_chamber() - if(chamber_id != null) - GLOB.objects_by_id_tag -= CHAMBER_OUTPUT_FROM_ID(chamber_id) - chamber_id = null + return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() disconnect_from_area() @@ -77,8 +71,6 @@ if(vent_area) vent_area.air_vents -= src - disconnect_chamber() - return ..() /obj/machinery/atmospherics/components/unary/vent_pump/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index c22874dc068..06c52305f51 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -1,5 +1,5 @@ /datum/export/material - cost = 5 // Cost per SHEET_MATERIAL_AMOUNT, which is 2000cm3 as of April 2016. + cost = 5 // Cost per SHEET_MATERIAL_AMOUNT, which is 100cm3 as of May 2023. message = "cm3 of developer's tears. Please, report this on github" amount_report_multiplier = SHEET_MATERIAL_AMOUNT var/material_id = null diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 495d904eed4..c3cb16eec6d 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -65,7 +65,7 @@ // For base materials, see materials.dm /datum/export/stack/plasteel - cost = CARGO_CRATE_VALUE * 0.41 // 2000u of plasma + 2000u of iron. + cost = CARGO_CRATE_VALUE * 0.41 // 100u of plasma + 100u of iron. message = "of plasteel" export_types = list(/obj/item/stack/sheet/plasteel) diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 538a231cc7f..6ea644aba80 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -174,33 +174,36 @@ /** * adds an supply pack to the checkout cart - * * params - an list with id of the supply pack to add to the cart as its only element + * * user - the mobe doing this order + * * id - the type of pack to order + * * amount - the amount to order. You may not order more then 10 things at once */ -/obj/machinery/computer/cargo/proc/add_item(params) +/obj/machinery/computer/cargo/proc/add_item(mob/user, id, amount = 1) if(is_express) return - var/id = params["id"] id = text2path(id) || id var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) - CRASH("Unknown supply pack id given by order console ui. ID: [params["id"]]") + CRASH("Unknown supply pack id given by order console ui. ID: [id]") + if(amount > 50 || amount < 1) // Holy shit fuck off + CRASH("Invalid amount passed into add_item") if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/human = usr + var/ckey = user.ckey + if(ishuman(user)) + var/mob/living/carbon/human/human = user name = human.get_authentification_name() rank = human.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name + else if(issilicon(user)) + name = user.real_name rank = "Silicon" var/datum/bank_account/account - if(self_paid && isliving(usr)) - var/mob/living/living_user = usr + if(self_paid && isliving(user)) + var/mob/living/living_user = user var/obj/item/card/id/id_card = living_user.get_idcard(TRUE) if(!istype(id_card)) say("No ID card detected.") @@ -219,7 +222,7 @@ var/reason = "" if(requestonly && !self_paid) - reason = tgui_input_text(usr, "Reason", name) + reason = tgui_input_text(user, "Reason", name) if(isnull(reason)) return @@ -228,7 +231,6 @@ say("ERROR: Small crates may only be purchased by private accounts.") return - var/amount = params["amount"] for(var/count in 1 to amount) var/obj/item/coupon/applied_coupon for(var/obj/item/coupon/coupon_check in loaded_coupons) @@ -258,10 +260,9 @@ /** * removes an item from the checkout cart - * * params - an list with the id of the cart item to remove as its only element + * * id - the id of the cart item to remove */ -/obj/machinery/computer/cargo/proc/remove_item(params) - var/id = text2num(params["id"]) +/obj/machinery/computer/cargo/proc/remove_item(id) for(var/datum/supply_order/order in SSshuttle.shopping_list) if(order.id != id) continue @@ -279,7 +280,6 @@ SSshuttle.shopping_list -= order . = TRUE break - /** * maps the ordename displayed on the ui to its supply pack id * * order_name - the name of the order @@ -291,10 +291,11 @@ return pack return null -/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) +/obj/machinery/computer/cargo/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return + switch(action) if("send") if(!SSshuttle.supply.canMove()) @@ -307,7 +308,7 @@ if(SSshuttle.supply.getDockedId() == docking_home) SSshuttle.moveShuttle(cargo_shuttle, docking_away, TRUE) say("The supply shuttle is departing.") - usr.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) + ui.user.investigate_log("sent the supply shuttle away.", INVESTIGATE_CARGO) else //create the paper from the SSshuttle.shopping_list if(length(SSshuttle.shopping_list)) @@ -333,7 +334,7 @@ requisition_paper.add_raw_text(requisition_text) requisition_paper.update_appearance() - usr.investigate_log("called the supply shuttle.", INVESTIGATE_CARGO) + ui.user.investigate_log("called the supply shuttle.", INVESTIGATE_CARGO) say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") SSshuttle.moveShuttle(cargo_shuttle, docking_home, TRUE) @@ -353,16 +354,16 @@ else SSshuttle.shuttle_loan.loan_shuttle() say("The supply shuttle has been loaned to CentCom.") - usr.investigate_log("accepted a shuttle loan event.", INVESTIGATE_CARGO) - usr.log_message("accepted a shuttle loan event.", LOG_GAME) + ui.user.investigate_log("accepted a shuttle loan event.", INVESTIGATE_CARGO) + ui.user.log_message("accepted a shuttle loan event.", LOG_GAME) . = TRUE if("add") - return add_item(params) + return add_item(ui.user, params["id"]) if("add_by_name") var/supply_pack_id = name_to_id(params["order_name"]) if(!supply_pack_id) return - return add_item(list("id" = supply_pack_id, "amount" = 1)) + return add_item(ui.user, supply_pack_id) if("remove") var/order_name = params["order_name"] //try removing atleast one item with the specified name. An order may not be removed if it was from the department @@ -371,7 +372,7 @@ for(var/datum/supply_order/order in shopping_cart) if(order.pack.name != order_name) continue - if(remove_item(list("id" = order.id))) + if(remove_item(order.id)) return TRUE return TRUE @@ -382,23 +383,25 @@ var/list/shopping_cart = SSshuttle.shopping_list.Copy() //we operate on the list copy else we would get runtimes when removing & iterating over the same SSshuttle.shopping_list for(var/datum/supply_order/order in shopping_cart) //find corresponding order id for the order name if(order.pack.name == order_name) - remove_item(list("id" = "[order.id]")) + remove_item(order.id) //now add the new amount stuff var/amount = text2num(params["amount"]) if(amount == 0) return TRUE + if(amount > 50) + return var/supply_pack_id = name_to_id(order_name) //map order name to supply pack id for adding if(!supply_pack_id) return - return add_item(list("id" = supply_pack_id, "amount" = amount)) + return add_item(ui.user, supply_pack_id, amount) if("clear") //create copy of list else we will get runtimes when iterating & removing items on the same list SSshuttle.shopping_list var/list/shopping_cart = SSshuttle.shopping_list.Copy() for(var/datum/supply_order/cancelled_order in shopping_cart) if(cancelled_order.department_destination || !cancelled_order.can_be_cancelled) continue //don't cancel other department's orders or orders that can't be cancelled - remove_item(list("id" = "[cancelled_order.id]")) //remove & properly refund any coupons attached with this order + remove_item(cancelled_order.id) //remove & properly refund any coupons attached with this order if("approve") var/id = text2num(params["id"]) for(var/datum/supply_order/SO in SSshuttle.request_list) diff --git a/code/modules/client/preferences/ai_core_display.dm b/code/modules/client/preferences/ai_core_display.dm index 72b8219931d..1abbc586a1a 100644 --- a/code/modules/client/preferences/ai_core_display.dm +++ b/code/modules/client/preferences/ai_core_display.dm @@ -8,7 +8,7 @@ /datum/preference/choiced/ai_core_display/init_possible_values() var/list/values = list() - values["Random"] = icon('icons/mob/silicon/ai.dmi', "ai-empty") + values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") for (var/screen in GLOB.ai_core_display_screens - "Portrait" - "Random") values[screen] = icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(screen)) diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm new file mode 100644 index 00000000000..8548753e1af --- /dev/null +++ b/code/modules/client/preferences/ai_emote_display.dm @@ -0,0 +1,26 @@ +/// What to show on the AI monitor +/datum/preference/choiced/ai_emote_display + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "preferred_ai_emote_display" + should_generate_icons = TRUE + +/datum/preference/choiced/ai_emote_display/init_possible_values() + var/list/values = list() + + values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") + + for(var/emote in GLOB.ai_status_display_emotes) + var/emote_icon = GLOB.ai_status_display_emotes[emote] + values[emote] = icon('icons/obj/status_display.dmi', emote_icon) + + return values + +/datum/preference/choiced/ai_emote_display/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return istype(preferences.get_highest_priority_job(), /datum/job/ai) + +/datum/preference/choiced/ai_emote_display/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/ai_hologram_display.dm b/code/modules/client/preferences/ai_hologram_display.dm new file mode 100644 index 00000000000..fdf49aecb2b --- /dev/null +++ b/code/modules/client/preferences/ai_hologram_display.dm @@ -0,0 +1,25 @@ +/// What to show on the AI hologram +/datum/preference/choiced/ai_hologram_display + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "preferred_ai_hologram_display" + should_generate_icons = TRUE + +/datum/preference/choiced/ai_hologram_display/init_possible_values() + var/list/values = list() + + values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") + + for(var/hologram in GLOB.ai_hologram_icons - "Random") + values[hologram] = icon(GLOB.ai_hologram_icons[hologram], GLOB.ai_hologram_icon_state[hologram]) + + return values + +/datum/preference/choiced/ai_hologram_display/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return istype(preferences.get_highest_priority_job(), /datum/job/ai) + +/datum/preference/choiced/ai_hologram_display/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index f2534ac7105..8c623836ba2 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -1,3 +1,5 @@ +// SKYRAT EDIT: REPLACED BY /datum/preference/choiced/mutant_choice/pod_hair IN mutant_parts.dm +/* /datum/preference/choiced/pod_hair savefile_key = "feature_pod_hair" savefile_identifier = PREFERENCE_CHARACTER @@ -33,3 +35,4 @@ /datum/preference/choiced/pod_hair/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["pod_hair"] = value +*/ // SKYRAT EDIT END diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm index ad7d24374de..419fa903f09 100644 --- a/code/modules/clothing/head/mind_monkey_helmet.dm +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -94,7 +94,7 @@ playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) visible_message(span_warning("[src] fizzles and breaks apart!")) magnification = null - new /obj/effect/decal/cleanable/ash/crematorium(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation + new /obj/effect/decal/cleanable/ash(drop_location()) //just in case they're in a locker or other containers it needs to use crematorium ash, see the path itself for an explanation /obj/item/clothing/head/helmet/monkey_sentience/dropped(mob/user) . = ..() diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 1af058181a6..9c947b53a93 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,6 +5,7 @@ inhand_icon_state = "balaclava" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets; yes, that's below hair, but it already has HIDEHAIR w_class = WEIGHT_CLASS_SMALL actions_types = list(/datum/action/item_action/adjust) @@ -61,4 +62,5 @@ inhand_icon_state = "balaclava" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets; yes, that's below hair, but it already has HIDEHAIR w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 813be9b3d8b..b1d6e055506 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -35,7 +35,7 @@ /datum/round_event/brand_intelligence/setup() //select our origin machine (which will also be the type of vending machine affected.) for(var/obj/machinery/vending/vendor in GLOB.machines) - if(!is_station_level(vendor.z)) + if(!vendor.onstation) continue if(!vendor.density) continue diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 088263e82de..aead7157d91 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -368,7 +368,11 @@ open() playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) - +/** + * Begins the process of cooking the included ingredients. + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/cook(mob/cooker) if(machine_stat & (NOPOWER|BROKEN)) return @@ -380,7 +384,7 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return - if(HAS_TRAIT(cooker, TRAIT_CURSED) && prob(7)) + if(cooker && HAS_TRAIT(cooker, TRAIT_CURSED) && prob(7)) muck() return if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure @@ -414,10 +418,20 @@ s.set_up(2, 1, src) s.start() +/** + * The start of the cook loop + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/start(mob/cooker) wzhzhzh() loop(MICROWAVE_NORMAL, 10, cooker = cooker) +/** + * The start of the cook loop, but can fail (result in a splat / dirty microwave) + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/start_can_fail(mob/cooker) wzhzhzh() loop(MICROWAVE_PRE, 4, cooker = cooker) @@ -429,12 +443,20 @@ update_appearance() loop(MICROWAVE_MUCK, 4) +/** + * The actual cook loop started via [proc/start] or [proc/start_can_fail] + * + * * type - the type of cooking, determined via how this iteration of loop is called, and determines the result + * * time - how many loops are left, base case for recursion + * * wait - deciseconds between loops + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2), mob/cooker) // standard wait is 10 if((machine_stat & BROKEN) && type == MICROWAVE_PRE) pre_fail() return - if(!time || !length(ingredients)) + if(time <= 0 || !length(ingredients)) switch(type) if(MICROWAVE_NORMAL) loop_finish(cooker) @@ -453,9 +475,15 @@ pre_fail() eject() +/** + * Called when the loop is done successfully, no dirty mess or whatever + * + * * cooker - The mob that initiated the cook cycle, can be null if no apparent mob triggered it (such as via emp) + */ /obj/machinery/microwave/proc/loop_finish(mob/cooker) operating = FALSE + var/cursed_chef = cooker && HAS_TRAIT(cooker, TRAIT_CURSED) var/metal_amount = 0 for(var/obj/item/cooked_item in ingredients) var/sigreturn = cooked_item.microwave_act(src, cooker, randomize_pixel_offset = ingredients.len) @@ -468,7 +496,7 @@ metal_amount += (cooked_item.custom_materials?[GET_MATERIAL_REF(/datum/material/iron)] || 0) - if(HAS_TRAIT(cooker, TRAIT_CURSED) && prob(5)) + if(cursed_chef && prob(5)) spark() broken = REALLY_BROKEN explosion(src, light_impact_range = 2, flame_range = 1) @@ -476,7 +504,7 @@ if(metal_amount) spark() broken = REALLY_BROKEN - if(HAS_TRAIT(cooker, TRAIT_CURSED) || prob(max(metal_amount / 2, 33))) // If we're unlucky and have metal, we're guaranteed to explode + if(cursed_chef || prob(max(metal_amount / 2, 33))) // If we're unlucky and have metal, we're guaranteed to explode explosion(src, heavy_impact_range = 1, light_impact_range = 2) else dump_inventory_contents() diff --git a/code/modules/hallucination/body.dm b/code/modules/hallucination/body.dm index 1e9b78f8240..cec96f9f828 100644 --- a/code/modules/hallucination/body.dm +++ b/code/modules/hallucination/body.dm @@ -99,7 +99,7 @@ /datum/hallucination/body/staticguy/queue_cleanup() RegisterSignal(hallucinator, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - del_timerid = QDEL_IN(src, rand(2 MINUTES, 3 MINUTES)) + del_timerid = QDEL_IN_STOPPABLE(src, rand(2 MINUTES, 3 MINUTES)) return TRUE /// Signal proc for [COMSIG_MOVABLE_MOVED] - if we move out of view of the hallucination, it disappears, how spooky @@ -110,7 +110,7 @@ if(shown_body.loc == hallucinator.loc) animate(shown_body, alpha = 0, time = 0.5 SECONDS) deltimer(del_timerid) - del_timerid = QDEL_IN(src, 0.6 SECONDS) + del_timerid = QDEL_IN_STOPPABLE(src, 0.6 SECONDS) return // Staying in view will do nothing diff --git a/code/modules/hallucination/fake_alert.dm b/code/modules/hallucination/fake_alert.dm index 56cecba0476..537f6e29490 100644 --- a/code/modules/hallucination/fake_alert.dm +++ b/code/modules/hallucination/fake_alert.dm @@ -36,7 +36,7 @@ override = TRUE, ) - del_timer_id = QDEL_IN(src, duration) + del_timer_id = QDEL_IN_STOPPABLE(src, duration) return TRUE /datum/hallucination/fake_alert/need_oxygen diff --git a/code/modules/hallucination/screwy_health_doll.dm b/code/modules/hallucination/screwy_health_doll.dm index b2efb0a69eb..7bab267563c 100644 --- a/code/modules/hallucination/screwy_health_doll.dm +++ b/code/modules/hallucination/screwy_health_doll.dm @@ -29,7 +29,7 @@ return FALSE add_fake_limb() - del_timer_id = QDEL_IN(src, duration) + del_timer_id = QDEL_IN_STOPPABLE(src, duration) return TRUE /// Increments the severity of the damage seen on all the limbs we are already tracking. diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 604dc7c12c7..11dffd531af 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -196,8 +196,8 @@ podman.faction |= factions if(!features["mcolor"]) features["mcolor"] = "#59CE00" - if(!features["pod_hair"]) - features["pod_hair"] = pick(GLOB.pod_hair_list) + /*if(!features["pod_hair"]) + features["pod_hair"] = pick(GLOB.pod_hair_list)*/ //SKYRAT EDIT - Tricolor Pod Hair for(var/V in quirks) new V(podman) diff --git a/code/modules/industrial_lift/elevator/elevator_indicator.dm b/code/modules/industrial_lift/elevator/elevator_indicator.dm index 781ff35981b..f0aec0c2217 100644 --- a/code/modules/industrial_lift/elevator/elevator_indicator.dm +++ b/code/modules/industrial_lift/elevator/elevator_indicator.dm @@ -19,10 +19,10 @@ light_color = LIGHT_COLOR_DARK_BLUE luminosity = 1 - maptext_x = 17 - maptext_y = 21 - maptext_width = 4 - maptext_height = 8 + maptext_x = 18 + maptext_y = 20 + maptext_width = 8 + maptext_height = 16 /// What specific_lift_id do we link with? var/linked_elevator_id @@ -150,7 +150,7 @@ return set_light(l_on = TRUE) - maptext = {"
[current_lift_floor]
"} + maptext = MAPTEXT_TINY_UNICODE("
[current_lift_floor]
") /obj/machinery/lift_indicator/update_overlays() . = ..() diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index e5ac79af233..95880740068 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -424,7 +424,10 @@ GLOBAL_LIST_EMPTY(lifts) var/datum/callback/land_slam = new(collided, TYPE_PROC_REF(/mob/living/, tram_slam_land)) collided.throw_at(throw_target, 200 * collision_lethality, 4 * collision_lethality, callback = land_slam) - SEND_SIGNAL(src, COMSIG_TRAM_COLLISION, collided) + //increment the hit counter signs + if(ismob(collided) && collided.client) + SSpersistence.tram_hits_this_round++ + SEND_SIGNAL(src, COMSIG_TRAM_COLLISION, SSpersistence.tram_hits_this_round) unset_movement_registrations(exited_locs) group_move(things_to_move, going) diff --git a/code/modules/industrial_lift/tram/tram_windows.dm b/code/modules/industrial_lift/tram/tram_windows.dm index a837a94e4f5..1a98a56a0ba 100644 --- a/code/modules/industrial_lift/tram/tram_windows.dm +++ b/code/modules/industrial_lift/tram/tram_windows.dm @@ -3,6 +3,9 @@ desc = "A window made out of a titanium-silicate alloy. It looks tough to break. Is that a challenge?" icon = 'icons/obj/smooth_structures/tram_window.dmi' icon_state = "tram_mid" + smoothing_flags = SMOOTH_BITMASK|SMOOTH_BORDER_OBJECT + canSmoothWith = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM reinf = TRUE heat_resistance = 1600 armor_type = /datum/armor/window_tram @@ -12,6 +15,38 @@ rad_insulation = RAD_MEDIUM_INSULATION glass_material_datum = /datum/material/alloy/titaniumglass +/obj/structure/window/reinforced/tram/Initialize(mapload, direct) + . = ..() + setDir(dir) + +/obj/structure/window/reinforced/tram/setDir(new_dir) + . = ..() + if(fulltile) + return + if(dir & NORTH) + layer = LOW_ITEM_LAYER + else + layer = BELOW_OBJ_LAYER + if(dir & SOUTH) + SET_PLANE_IMPLICIT(src, WALL_PLANE_UPPER) + else + SET_PLANE_IMPLICIT(src, GAME_PLANE) + +/obj/structure/window/reinforced/tram/set_smoothed_icon_state(new_junction) + if(fulltile) + return ..() + smoothing_junction = new_junction + var/smooth_left = (smoothing_junction & turn(dir, 90)) + var/smooth_right = (smoothing_junction & turn(dir, -90)) + if(smooth_left && smooth_right) + icon_state = "tram_mid" + else if (smooth_left) + icon_state = "tram_left" + else if (smooth_right) + icon_state = "tram_right" + else + icon_state = "tram_mid" + /obj/structure/window/reinforced/tram/front name = "tram wall" desc = "A lightweight titanium composite structure with a windscreen installed." @@ -19,35 +54,14 @@ base_icon_state = "tram_window" wtype = "shuttle" fulltile = TRUE + smoothing_flags = NONE + canSmoothWith = null + smoothing_groups = SMOOTH_GROUP_WINDOW_DIRECTIONAL_TRAM flags_1 = PREVENT_CLICK_UNDER_1 explosion_block = 3 glass_amount = 2 receive_ricochet_chance_mod = 1.2 -/obj/structure/window/reinforced/tram/left/directional/north - icon_state = "tram_left" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/left/directional/south - icon_state = "tram_left" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/mid/directional/north - icon_state = "tram_mid" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/mid/directional/south - icon_state = "tram_mid" - plane = WALL_PLANE_UPPER - -/obj/structure/window/reinforced/tram/right/directional/north - icon_state = "tram_right" - layer = LOW_ITEM_LAYER - -/obj/structure/window/reinforced/tram/right/directional/south - icon_state = "tram_right" - plane = WALL_PLANE_UPPER - /datum/armor/window_tram melee = 80 bullet = 5 @@ -55,6 +69,4 @@ fire = 99 acid = 100 -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/left, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/mid, 0) -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram/right, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tram, 0) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index e5119377c37..8c5852b54bf 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -246,6 +246,7 @@ name = "instrument delivery beacon" desc = "Summon your tool of art." icon_state = "gangtool-red" + w_class = WEIGHT_CLASS_TINY /obj/item/choice_beacon/music/generate_display_names() var/static/list/instruments diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 39b508dae92..92ce5b06055 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -527,7 +527,8 @@ return apply_pref_name(/datum/preference/name/ai, player_client) // This proc already checks if the player is appearance banned. set_core_display_icon(null, player_client) - + apply_pref_emote_display(player_client) + apply_pref_hologram_display(player_client) /mob/living/silicon/robot/apply_prefs_job(client/player_client, datum/job/job) if(mmi) diff --git a/code/modules/library/barcode_scanner.dm b/code/modules/library/barcode_scanner.dm index ca20f362663..09f2303a779 100644 --- a/code/modules/library/barcode_scanner.dm +++ b/code/modules/library/barcode_scanner.dm @@ -25,3 +25,4 @@ if(BARCODE_SCANNER_INVENTORY) scan_mode = BARCODE_SCANNER_CHECKIN user.balloon_alert(user, "check-in mode") + playsound(loc, 'sound/items/click.ogg', 20, TRUE) diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index 234bb934de1..73a41a11d0f 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -150,6 +150,7 @@ checkouts -= checkout_ref computer.checkout_update() user.balloon_alert(user, "book checked in") + playsound(loc, 'sound/items/barcodebeep.ogg', 20, FALSE) return user.balloon_alert(user, "book not checked out!") @@ -159,6 +160,7 @@ computer.inventory[ref(our_copy)] = our_copy computer.inventory_update() user.balloon_alert(user, "book added to inventory") + playsound(loc, 'sound/items/barcodebeep.ogg', 20, FALSE) else if(try_carve(attacking_item, user, params)) return diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 7ab757ff3f4..e141c921159 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -389,7 +389,7 @@ GLOBAL_LIST_INIT(mafia_role_by_alignment, setup_mafia_role_by_alignment()) roles.mafia_alert.update_text("[message]") roles.reveal_role(src) phase = MAFIA_PHASE_VICTORY_LAP - next_phase_timer = QDEL_IN(src, VICTORY_LAP_PERIOD_LENGTH) + next_phase_timer = QDEL_IN_STOPPABLE(src, VICTORY_LAP_PERIOD_LENGTH) /** * Cleans up the game, resetting variables back to the beginning and removing the map with the generator. diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm index 8ce3869bf60..4ec58a92c7f 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm @@ -73,7 +73,7 @@ if(prob(10)) new /obj/item/stack/ore/iron(src, 1) new /obj/item/stack/ore/glass(src, 1) - new /obj/effect/decal/remains/human/grave(src, 1) + new /obj/effect/decal/remains/human(src, 1) else new /obj/item/stack/sheet/bone(src, 1) @@ -166,7 +166,7 @@ /obj/structure/closet/crate/grave/filled/PopulateContents() //GRAVEROBBING IS NOW A FEATURE ..() - new /obj/effect/decal/remains/human/grave(src) + new /obj/effect/decal/remains/human(src) switch(rand(1,8)) if(1) new /obj/item/coin/gold(src) @@ -278,9 +278,6 @@ new /obj/effect/decal/cleanable/blood/gibs/old(src) new /obj/item/book/granter/crafting_recipe/boneyard_notes(src) -/obj/effect/decal/remains/human/grave - turf_loc_check = FALSE - //***Fluff items for lore/intrigue /obj/item/paper/crumpled/muddy/fluff/elephant_graveyard name = "posted warning" diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 33d545f551a..a1ef04e204f 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -107,6 +107,9 @@ /// Pulls out model paths for DMM var/static/regex/model_path = new(@'(\/[^\{]*?(?:\{.*?\})?)(?:,|$)', "g") + /// If we are currently loading this map + var/loading = FALSE + #ifdef TESTING var/turfsSkipped = 0 #endif @@ -249,9 +252,13 @@ #define MAPLOADING_CHECK_TICK \ if(TICK_CHECK) { \ - SSatoms.map_loader_stop(); \ - stoplag(); \ - SSatoms.map_loader_begin(); \ + if(loading) { \ + SSatoms.map_loader_stop(REF(src)); \ + stoplag(); \ + SSatoms.map_loader_begin(REF(src)); \ + } else { \ + stoplag(); \ + } \ } // Do not call except via load() above. @@ -259,7 +266,8 @@ PRIVATE_PROC(TRUE) // Tell ss atoms that we're doing maploading // We'll have to account for this in the following tick_checks so it doesn't overflow - SSatoms.map_loader_begin() + loading = TRUE + SSatoms.map_loader_begin(REF(src)) // Loading used to be done in this proc // We make the assumption that if the inner procs runtime, we WANT to do cleanup on them, but we should stil tell our parents we failed @@ -272,7 +280,8 @@ sucessful = _dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) // And we are done lads, call it off - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) + loading = FALSE if(new_z) for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) @@ -409,7 +418,7 @@ var/list/cache = modelCache[gset.gridLines[i]] if(!cache) - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) CRASH("Undefined model key in DMM: [gset.gridLines[i]]") build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) @@ -542,7 +551,7 @@ continue var/list/cache = modelCache[model_key] if(!cache) - SSatoms.map_loader_stop() + SSatoms.map_loader_stop(REF(src)) CRASH("Undefined model key in DMM: [model_key]") build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) @@ -956,6 +965,7 @@ GLOBAL_LIST_EMPTY(map_model_default) /datum/parsed_map/Destroy() ..() + SSatoms.map_loader_stop(REF(src)) // Just in case, I don't want to double up here if(turf_blacklist) turf_blacklist.Cut() parsed_bounds.Cut() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 13ceb8c4119..5397199eeeb 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -117,11 +117,11 @@ name = "\improper Ancient Sarcophagus" desc = "Once guarded by the King of Demons, this sarcophagus contains the relics of an ancient soldier." icon_state = "necro_bubblegum" + base_icon_state = "necro_bubblegum" lid_icon_state = "necro_bubblegum_lid" lid_x = -26 lid_y = 2 - /obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() new /obj/item/clothing/suit/hooded/hostile_environment(src) var/loot = rand(1,2) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index f76cdcde796..6033263f6b1 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) * - action: Text that visually describes the action (smelted/deposited/resupplied...) * - amount: The amount of sheets/objects deposited/withdrawn by this action. Positive for depositing, negative for withdrawing. * - noun: Name of the object the action was performed with (sheet, units, ore...) - * - [mats][list]: Assoc list in format (material datum = amount of raw materials). Wants the actual amount of raw (iron, glass...) materials involved in this action. If you have 10 metal sheets each worth 2000 iron you would pass a list with the iron material datum = 20000 + * - [mats][list]: Assoc list in format (material datum = amount of raw materials). Wants the actual amount of raw (iron, glass...) materials involved in this action. If you have 10 metal sheets each worth 100 iron you would pass a list with the iron material datum = 1000 */ /obj/machinery/ore_silo/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) if (!length(mats)) diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm index 28a5b026797..acd8db55ad0 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm @@ -31,8 +31,11 @@ /datum/ai_planning_subtree/bileworm_execute/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_EXECUTION_TARGET] - if(QDELETED(target) || target.stat < UNCONSCIOUS) + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_EXECUTION_TARGET] + if(QDELETED(target) || !isliving(target)) + return + var/mob/living/living_target = target + if(living_target.stat < UNCONSCIOUS) return controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability, BB_BILEWORM_DEVOUR, BB_BASIC_MOB_EXECUTION_TARGET) diff --git a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm index 385e8448346..c38e4f132ad 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm @@ -36,7 +36,7 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate /datum/ai_behavior/basic_ranged_attack/syndicate - action_cooldown = 2.5 SECONDS + action_cooldown = 1 SECONDS required_distance = 5 /datum/ai_controller/basic_controller/syndicate/ranged/burst diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 319ce7f5eb6..7f261d82e61 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -102,7 +102,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) */ // ORIGINAL END - SKYRAT EDIT START target.dna.features["ethcolor"] = COLOR_WHITE target.dna.features["mcolor"] = COLOR_VIBRANT_LIME - target.dna.features["pod_hair"] = "Ivy" + //target.dna.features["pod_hair"] = "Ivy" SKYRAT EDIT - Tricolor Pod Hair /// Provides a dummy that is consistently bald, white, naked, etc. /mob/living/carbon/human/dummy/consistent diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 071a72bafb6..1ed96f47dea 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1135,6 +1135,10 @@ altered_grab_state-- //SKYRAT EDIT END var/resist_chance = BASE_GRAB_RESIST_CHANCE /// see defines/combat.dm, this should be baseline 60% //SKYRAT EDIT ADDITION + // Akula grab resist + if(HAS_TRAIT(src, TRAIT_SLIPPERY)) + resist_chance += AKULA_GRAB_RESIST_BONUS + // Oversized grab resist if(HAS_TRAIT(src, TRAIT_OVERSIZED)) resist_chance += OVERSIZED_GRAB_RESIST_BONUS if(HAS_TRAIT(pulledby, TRAIT_OVERSIZED)) @@ -1142,6 +1146,17 @@ //SKYRAT EDIT END resist_chance = (resist_chance/altered_grab_state) ///Resist chance divided by the value imparted by your grab state. It isn't until you reach neckgrab that you gain a penalty to escaping a grab. if(prob(resist_chance)) + //SKYRAT EDIT ADDITION + // Akula break-out flavor + if(HAS_TRAIT(src, TRAIT_SLIPPERY)) + visible_message(span_cyan("[src] slips free of [pulledby]'s grip!"), \ + span_cyan("You slip free of [pulledby]'s grip!"), null, null, pulledby) + to_chat(pulledby, span_cyan("[src] slips free of your grip!")) + playsound(loc, 'sound/misc/slip.ogg', 50, TRUE, -1) + log_combat(pulledby, src, "broke grab") + pulledby.stop_pulling() + return FALSE + //SKYRAT EDIT END visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ span_danger("You break free of [pulledby]'s grip!"), null, null, pulledby) to_chat(pulledby, span_warning("[src] breaks free of your grip!")) diff --git a/code/modules/mob/living/silicon/ai/_preferences.dm b/code/modules/mob/living/silicon/ai/_preferences.dm new file mode 100644 index 00000000000..0a98c436e53 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/_preferences.dm @@ -0,0 +1,126 @@ +// A mapping between AI_EMOTION_* string constants, which also double as user readable descriptions, and the name of the iconfile. (used for /obj/machinery/status_display/ai ) +GLOBAL_LIST_INIT(ai_status_display_emotes, list( + AI_EMOTION_AWESOME = "ai_awesome", + AI_EMOTION_BLANK = AI_DISPLAY_DONT_GLOW, + AI_EMOTION_BLUE_GLOW = "ai_sal", + AI_EMOTION_BSOD = "ai_bsod", + AI_EMOTION_CONFUSED = "ai_confused", + AI_EMOTION_DORFY = "ai_urist", + AI_EMOTION_FACEPALM = "ai_facepalm", + AI_EMOTION_FRIEND_COMPUTER = "ai_friend", + AI_EMOTION_HAPPY = "ai_happy", + AI_EMOTION_NEUTRAL = "ai_neutral", + AI_EMOTION_PROBLEMS = "ai_trollface", + AI_EMOTION_RED_GLOW = "ai_hal", + AI_EMOTION_SAD = "ai_sad", + AI_EMOTION_THINKING = "ai_thinking", + AI_EMOTION_UNSURE = "ai_unsure", + AI_EMOTION_VERY_HAPPY = "ai_veryhappy", +)) + +// New items need to also be added to ai_hologram_icon_state list +GLOBAL_LIST_INIT(ai_hologram_icons, list( + AI_HOLOGRAM_BEAR = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_CARP = 'icons/mob/simple/carp.dmi', + AI_HOLOGRAM_CAT = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_CAT_2 = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_CHICKEN = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_CORGI = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_COW = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_CRAB = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_DEFAULT = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_FACE = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_FOX = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_GOAT = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_NARSIE = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_PARROT = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_PUG = 'icons/mob/simple/pets.dmi', + AI_HOLOGRAM_RATVAR = 'icons/mob/silicon/ai.dmi', + AI_HOLOGRAM_SPIDER = 'icons/mob/simple/animal.dmi', + AI_HOLOGRAM_XENO = 'icons/mob/nonhuman-player/alien.dmi', +)) + +// New items need to also be added to ai_hologram_icons list +GLOBAL_LIST_INIT(ai_hologram_icon_state, list( + AI_HOLOGRAM_BEAR = "bear", + AI_HOLOGRAM_CARP = "carp", + AI_HOLOGRAM_CAT = "cat", + AI_HOLOGRAM_CAT_2 = "cat2", + AI_HOLOGRAM_CHICKEN = "chicken_brown", + AI_HOLOGRAM_CORGI = "corgi", + AI_HOLOGRAM_COW = "cow", + AI_HOLOGRAM_CRAB = "crab", + AI_HOLOGRAM_DEFAULT = "default", + AI_HOLOGRAM_FACE = "floating face", + AI_HOLOGRAM_FOX = "fox", + AI_HOLOGRAM_GOAT = "goat", + AI_HOLOGRAM_NARSIE = "horror", + AI_HOLOGRAM_PARROT = "parrot_fly", + AI_HOLOGRAM_PUG = "pug", + AI_HOLOGRAM_RATVAR = "clock", + AI_HOLOGRAM_SPIDER = "guard", + AI_HOLOGRAM_XENO = "alienq", +)) + + +GLOBAL_LIST_INIT(ai_core_display_screens, sort_list(list( + ":thinking:", + "Alien", + "Angel", + "Banned", + "Bliss", + "Blue", + "Clown", + "Database", + "Dorf", + "Firewall", + "Fuzzy", + "Gentoo", + "Glitchman", + "Gondola", + "Goon", + "Hades", + "HAL 9000", + "Heartline", + "Helios", + "House", + "Inverted", + "Matrix", + "Monochrome", + "Murica", + "Nanotrasen", + "Not Malf", + "Portrait", + "President", + "Rainbow", + "Random", + "Red October", + "Red", + "Static", + "Syndicat Meow", + "Text", + "Too Deep", + "Triumvirate-M", + "Triumvirate", + "Weird", +))) + +/// A form of resolve_ai_icon that is guaranteed to never sleep. +/// Not always accurate, but always synchronous. +/proc/resolve_ai_icon_sync(input) + SHOULD_NOT_SLEEP(TRUE) + + if(!input || !(input in GLOB.ai_core_display_screens)) + return "ai" + else + if(input == "Random") + input = pick(GLOB.ai_core_display_screens - "Random") + return "ai-[lowertext(input)]" + +/proc/resolve_ai_icon(input) + if (input == "Portrait") + var/datum/portrait_picker/tgui = new(usr)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + return "ai-portrait" //just take this until they decide + + return resolve_ai_icon_sync(input) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index b33c8be5306..62a3b7e1ebb 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -157,21 +157,20 @@ create_modularInterface() + // /mob/living/silicon/ai/apply_prefs_job() uses these to set these procs at mapload + // this is used when a person is being inserted into an AI core during a round if(client) INVOKE_ASYNC(src, PROC_REF(apply_pref_name), /datum/preference/name/ai, client) + INVOKE_ASYNC(src, PROC_REF(apply_pref_hologram_display), client) INVOKE_ASYNC(src, PROC_REF(set_core_display_icon)) - - hologram_appearance = mutable_appearance('icons/mob/silicon/ai.dmi',"default") - spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb) - aiMulti = new(src) aicamera = new/obj/item/camera/siliconcam/ai_camera(src) @@ -262,6 +261,33 @@ var/preferred_icon = input ? input : C.prefs.read_preference(/datum/preference/choiced/ai_core_display) icon_state = resolve_ai_icon(preferred_icon) +/// Apply an AI's hologram preference +/mob/living/silicon/ai/proc/apply_pref_hologram_display(client/player_client) + if(player_client.prefs?.read_preference(/datum/preference/choiced/ai_hologram_display)) + var/list/hologram_choice = player_client.prefs.read_preference(/datum/preference/choiced/ai_hologram_display) + if(hologram_choice == "Random") + hologram_choice = pick(GLOB.ai_hologram_icons) + + hologram_appearance = mutable_appearance(GLOB.ai_hologram_icons[hologram_choice], GLOB.ai_hologram_icon_state[hologram_choice]) + + hologram_appearance ||= mutable_appearance(GLOB.ai_hologram_icons[AI_HOLOGRAM_DEFAULT], GLOB.ai_hologram_icon_state[AI_HOLOGRAM_DEFAULT]) + +/// Apply an AI's emote display preference +/mob/living/silicon/ai/proc/apply_pref_emote_display(client/player_client) + if(player_client.prefs?.read_preference(/datum/preference/choiced/ai_emote_display)) + var/emote_choice = player_client.prefs.read_preference(/datum/preference/choiced/ai_emote_display) + + if(emote_choice == "Random") + emote_choice = pick(GLOB.ai_status_display_emotes) + + apply_emote_display(emote_choice) + +/// Apply an emote to all AI status displays on the station +/mob/living/silicon/ai/proc/apply_emote_display(emote) + for(var/obj/machinery/status_display/ai/ai_display as anything in GLOB.ai_status_displays) + ai_display.emotion = emote + ai_display.update() + /mob/living/silicon/ai/verb/pick_icon() set category = "AI Commands" set name = "Set AI Core Display" diff --git a/code/modules/mob/living/silicon/ai/emote.dm b/code/modules/mob/living/silicon/ai/emote.dm index 08bdef69289..8050ff1d0a0 100644 --- a/code/modules/mob/living/silicon/ai/emote.dm +++ b/code/modules/mob/living/silicon/ai/emote.dm @@ -7,23 +7,15 @@ key = "blank" var/emotion = AI_EMOTION_BLANK -/datum/emote/ai/emotion_display/run_emote(mob/user, params, type_override, intentional) +/datum/emote/ai/emotion_display/run_emote(mob/living/silicon/ai/user, params, type_override, intentional) . = ..() if(!.) return - var/mob/living/silicon/ai/ai = user - var/turf/ai_turf = get_turf(ai) - for(var/obj/machinery/status_display/ai/ai_display as anything in GLOB.ai_status_displays) - var/turf/display_turf = get_turf(ai_display) + if(!istype(user)) + return - // - Station AIs can change every display on the station Z. - // - Ghost role AIs (or AIs on the mining base?) can only affect their Z - if(!is_valid_z_level(ai_turf, display_turf)) - continue - - ai_display.emotion = emotion - ai_display.update() + user.apply_emote_display(emotion) /datum/emote/ai/emotion_display/very_happy key = "veryhappy" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index cf2e609ec91..65f86289f04 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -161,7 +161,7 @@ return ..() /mob/living/simple_animal/hostile/electrocute_act(shock_damage, source, siemens_coeff, flags) - if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client) + if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && isatom(source)) // strings are sometimes used in electrocute_act() FindTarget(list(source)) return ..() @@ -246,6 +246,10 @@ // Please do not add one-off mob AIs here, but override this function for your mob /mob/living/simple_animal/hostile/CanAttack(atom/the_target)//Can we actually attack a possible target? + if(!isatom(the_target)) + stack_trace("Invalid target in CanAttack(): [the_target]") + return FALSE + if(isturf(the_target) || QDELETED(the_target) || QDELETED(src)) // bail out on invalids return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 9ecdb4c94c3..8e4526efdfd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -239,7 +239,7 @@ /obj/effect/temp_visual/goliath_tentacle/proc/retract() icon_state = "goliath_tentacle_retract" deltimer(timerid) - timerid = QDEL_IN(src, 7) + timerid = QDEL_IN_STOPPABLE(src, 7) /obj/item/saddle name = "saddle" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm index 30f0e9cbae4..5be6fc9575d 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm @@ -75,7 +75,7 @@ * Associated list of items able to be sold to the NPC with the money given for them. * The price given should be the "base" price; any price manipulation based on variables should be done with apply_sell_price_mods() * ADDITIONAL_DESCRIPTION is any additional text added to explain how the variables of the item effect the price; if it's stack based, it's final price depends how much is in the stack - * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 2000 cm3 sheet of diamond") + * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 100 cm3 sheet of diamond") * This list is filled by Initialize(), if you want to change the starting wanted items, modify initial_wanteds() */ var/list/wanted_items diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 233b98d164b..05b681c83f9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -466,6 +466,9 @@ ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) + if(!isatom(the_target)) // no + stack_trace("Invalid target in CanAttack(): [the_target]") + return FALSE if(see_invisible < the_target.invisibility) return FALSE if(ismob(the_target)) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 1a76e86370a..15df657564d 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -99,6 +99,8 @@ if(preference_source) apply_pref_name(/datum/preference/name/ai, preference_source) + our_AI.apply_pref_hologram_display(preference_source) + our_AI.set_core_display_icon(null, preference_source) qdel(src) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 4622b79ba14..b251499a9c1 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -105,6 +105,7 @@ extended_desc = theme.extended_desc slowdown_inactive = theme.slowdown_inactive slowdown_active = theme.slowdown_active + activation_step_time = theme.activation_step_time complexity_max = theme.complexity_max ui_theme = theme.ui_theme charge_drain = theme.charge_drain diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 9e36190b09f..2869bf660ef 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -41,6 +41,8 @@ var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. var/slowdown_active = 0.75 + /// How long this MOD takes each part to seal. + var/activation_step_time = MOD_ACTIVATION_STEP_TIME /// Theme used by the MOD TGUI. var/ui_theme = "ntos" /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. @@ -1633,6 +1635,7 @@ siemens_coefficient = 0 slowdown_inactive = 0.5 slowdown_active = 0 + activation_step_time = 0.4 SECONDS allowed_suit_storage = list( /obj/item/gun, ) @@ -1692,6 +1695,7 @@ siemens_coefficient = 0 slowdown_inactive = 0 slowdown_active = 0 + activation_step_time = 0.1 SECONDS allowed_suit_storage = list( /obj/item/gun, ) diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 4e467a2501d..ab7c4b2b537 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -71,12 +71,12 @@ if(!isnull(stored_blade)) stored_blade.forceMove(drop_location()) -/obj/item/papercutter/Exited(atom/movable/leaving, direction) +/obj/item/papercutter/Exited(atom/movable/leaving, atom/new_loc) + . = ..() if(leaving == stored_paper) stored_paper = null if(leaving == stored_blade) stored_blade = null - return ..() /obj/item/papercutter/suicide_act(mob/living/user) if(iscarbon(user) && stored_blade) diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 28c35ae27d8..5eab87f4f4a 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -13,7 +13,7 @@ ///maximum size of a patch var/max_patch_volume = 40 ///maximum size of a bottle - var/max_bottle_volume = 30 + var/max_bottle_volume = 50 //SKYRAT EDIT HYPOVIALS maximum size of a vial var/max_vial_volume = 60 ///current operating product (pills or patches) diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm index 0513516d67f..1fb90ea674b 100644 --- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm @@ -21,9 +21,10 @@ GLOBAL_LIST_INIT(sm_delam_list, list( /// [/obj/machinery/power/supermatter_crystal/proc/count_down] /datum/sm_delam/proc/delaminate(obj/machinery/power/supermatter_crystal/sm) if (sm.is_main_engine) + SSpersistence.delam_highscore = SSpersistence.rounds_since_engine_exploded SSpersistence.rounds_since_engine_exploded = ROUNDCOUNT_ENGINE_JUST_EXPLODED - for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) - sign.update_count(ROUNDCOUNT_ENGINE_JUST_EXPLODED) + for (var/obj/machinery/incident_display/sign as anything in GLOB.map_delamination_counters) + sign.update_delam_count(ROUNDCOUNT_ENGINE_JUST_EXPLODED) qdel(sm) #undef ROUNDCOUNT_ENGINE_JUST_EXPLODED diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 652060a3ab3..38a4cee32a4 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -327,6 +327,10 @@ desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." icon_state = "surplus" inhand_icon_state = "moistnugget" + lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' + righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 worn_icon_state = null weapon_weight = WEAPON_HEAVY mag_type = /obj/item/ammo_box/magazine/m10mm/rifle diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 22d6db23bbb..10b2fcd30d5 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -3,6 +3,10 @@ desc = "Some kind of bolt action rifle. You get the feeling you shouldn't have this." icon = 'icons/obj/weapons/guns/mosinnagant.dmi' icon_state = "moistnugget" + lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' + righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 w_class = WEIGHT_CLASS_BULKY inhand_icon_state = "moistnugget" worn_icon_state = "moistnugget" @@ -121,6 +125,10 @@ desc = "A weapon favored by carp hunters, but just as infamously employed by agents of the Animal Rights Consortium against human aggressors. Because it's ironic." icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "speargun" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + inhand_x_dimension = 32 + inhand_y_dimension = 32 inhand_icon_state = "speargun" worn_icon_state = "speargun" mag_type = /obj/item/ammo_box/magazine/internal/boltaction/harpoon @@ -256,6 +264,10 @@ It is also able to be suppressed....somehow." icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "sniper" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + inhand_x_dimension = 32 + inhand_y_dimension = 32 weapon_weight = WEAPON_HEAVY inhand_icon_state = "sniper" worn_icon_state = null diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 1c8c8d4267e..5d76b547119 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -16,6 +16,9 @@ desc = "Boom." icon_state= "missile" damage = 50 + sharpness = NONE + embedding = null + shrapnel_type = null ricochets_max = 0 /// Whether we do extra damage when hitting a mech or silicon var/anti_armour_damage = 0 diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 09cf5107518..4cbc22fa434 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -216,11 +216,13 @@ /obj/item/reagent_containers/cup/glass/bottle/beer/light name = "Carp Lite" desc = "Brewed with \"Pure Ice Asteroid Spring Water\"." + icon_state = "litebeer" list_reagents = list(/datum/reagent/consumable/ethanol/beer/light = 30) /obj/item/reagent_containers/cup/glass/bottle/rootbeer name = "Two-Time root beer" desc = "A popular, old-fashioned brand of root beer, known for its extremely sugary formula. Might make you want a nap afterwards." + icon_state = "twotime" volume = 30 list_reagents = list(/datum/reagent/consumable/rootbeer = 30) drink_type = SUGAR | JUNKFOOD diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 7d756fe7d43..57468add33d 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -16,8 +16,11 @@ var/dpdir = NONE // bitmask of pipe directions var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm var/flip_type // If set, the pipe is flippable and becomes this type when flipped + /// The pipe used to create us, if it exists + /// (I like it when c4 carries over) var/obj/structure/disposalconstruct/stored - + /// Should we create a pipe on destroy? + var/spawn_pipe = TRUE /datum/armor/structure_disposalpipe melee = 25 @@ -34,8 +37,6 @@ setDir(make_from.dir) make_from.forceMove(src) stored = make_from - else - stored = new /obj/structure/disposalconstruct(src, null , SOUTH , FALSE , src) if(ISDIAGONALDIR(dir)) // Bent pipes already have all the dirs set initialize_dirs = NONE @@ -56,7 +57,8 @@ turf_loc.add_blueprints_preround(src) /obj/structure/disposalpipe/Destroy() - qdel(stored) + spawn_pipe = FALSE + QDEL_NULL(stored) return ..() /** @@ -72,10 +74,11 @@ continue holdplease.active = FALSE expel(holdplease, get_turf(src), 0) - stored = null //The qdel is handled in expel() + stored = null // It gets dumped out in expel() /obj/structure/disposalpipe/handle_atom_del(atom/A) if(A == stored && !QDELETED(src)) + spawn_pipe = FALSE stored = null deconstruct(FALSE) //pipe has broken. @@ -167,11 +170,14 @@ /obj/structure/disposalpipe/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) - if(stored) + if(spawn_pipe) + if(isnull(stored)) // Don't have something? Make one now + stored = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) stored.forceMove(loc) transfer_fingerprints_to(stored) stored.setDir(dir) stored = null + spawn_pipe = FALSE else var/turf/T = get_turf(src) for(var/D in GLOB.cardinals) @@ -310,6 +316,7 @@ initialize_dirs = DISP_DIR_NONE // broken pipes always have dpdir=0 so they're not found as 'real' pipes // i.e. will be treated as an empty turf + spawn_pipe = FALSE /obj/structure/disposalpipe/broken/deconstruct() qdel(src) diff --git a/code/modules/religion/honorbound/honorbound_trauma.dm b/code/modules/religion/honorbound/honorbound_trauma.dm index 350e02c29f6..6c5cbea29e1 100644 --- a/code/modules/religion/honorbound/honorbound_trauma.dm +++ b/code/modules/religion/honorbound/honorbound_trauma.dm @@ -15,13 +15,10 @@ //checking spells cast by honorbound RegisterSignal(owner, COMSIG_MOB_CAST_SPELL, PROC_REF(spell_check)) RegisterSignal(owner, COMSIG_MOB_FIRED_GUN, PROC_REF(staff_check)) - //signals that check for guilt - RegisterSignal(owner, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_guilt)) - RegisterSignal(owner, COMSIG_ATOM_HULK_ATTACK, PROC_REF(hulk_guilt)) - RegisterSignal(owner, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hand_guilt)) - RegisterSignal(owner, COMSIG_ATOM_ATTACK_PAW, PROC_REF(paw_guilt)) - RegisterSignal(owner, COMSIG_ATOM_BULLET_ACT, PROC_REF(bullet_guilt)) - RegisterSignal(owner, COMSIG_ATOM_HITBY, PROC_REF(thrown_guilt)) + + //adds the relay_attackers element to the owner so whoever attacks him becomes guilty. + owner.AddElement(/datum/element/relay_attackers) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) //signal that checks for dishonorable attacks RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(attack_honor)) @@ -32,12 +29,7 @@ /datum/brain_trauma/special/honorbound/on_lose(silent) owner.clear_mood_event("honorbound") UnregisterSignal(owner, list( - COMSIG_ATOM_ATTACKBY, - COMSIG_ATOM_HULK_ATTACK, - COMSIG_ATOM_ATTACK_HAND, - COMSIG_ATOM_ATTACK_PAW, - COMSIG_ATOM_BULLET_ACT, - COMSIG_ATOM_HITBY, + COMSIG_ATOM_WAS_ATTACKED, COMSIG_MOB_CLICKON, COMSIG_MOB_CAST_SPELL, COMSIG_MOB_FIRED_GUN, @@ -77,7 +69,7 @@ if(user in guilty) return var/datum/mind/guilty_conscience = user.mind - if(guilty_conscience) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways) + if(guilty_conscience && !declaration) //sec and medical are immune to becoming guilty through attack (we don't check holy because holy shouldn't be able to attack eachother anyways) var/datum/job/job = guilty_conscience.assigned_role if(job.departments_bitflags & (DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SECURITY)) return @@ -88,6 +80,12 @@ to_chat(user, span_danger("[GLOB.deity] no longer considers you innocent!")) guilty += user +///Signal sent by the relay_attackers element. It makes the attacker guilty unless the damage was stamina or it was a shove. +/datum/brain_trauma/special/honorbound/proc/on_attacked(mob/source, mob/attacker, attack_flags) + SIGNAL_HANDLER + if(!(attack_flags & (ATTACKER_STAMINA_ATTACK|ATTACKER_SHOVING))) + guilty(attacker) + /** * Called by attack_honor signal to check whether an attack should be allowed or not * @@ -111,7 +109,7 @@ if(is_holy || (job?.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY)) to_chat(honorbound_human, span_warning("There is nothing righteous in attacking the just.")) return FALSE - if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL) + if(job?.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL && !is_guilty) to_chat(honorbound_human, span_warning("If you truly think this healer is not innocent, declare them guilty.")) return FALSE //THE INNOCENT @@ -120,49 +118,6 @@ return FALSE return TRUE -// SIGNALS THAT ARE FOR BEING ATTACKED FIRST (GUILTY) -/datum/brain_trauma/special/honorbound/proc/attackby_guilt(datum/source, obj/item/I, mob/attacker) - SIGNAL_HANDLER - if(I.force && I.damtype != STAMINA) - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/hulk_guilt(datum/source, mob/attacker) - SIGNAL_HANDLER - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/hand_guilt(datum/source, mob/living/attacker) - SIGNAL_HANDLER - if(attacker.combat_mode) - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/paw_guilt(datum/source, mob/living/attacker) - SIGNAL_HANDLER - guilty(attacker) - -/datum/brain_trauma/special/honorbound/proc/bullet_guilt(datum/source, obj/projectile/proj) - SIGNAL_HANDLER - var/mob/living/shot_honorbound = source - var/static/list/guilty_projectiles = typecacheof(list( - /obj/projectile/beam, - /obj/projectile/bullet, - /obj/projectile/magic, - )) - if(!is_type_in_typecache(proj, guilty_projectiles)) - return - if(proj.damage_type == STAMINA || !proj.is_hostile_projectile()) - return - if(proj.damage > 0 && proj.damage < shot_honorbound.health && isliving(proj.firer)) - guilty(proj.firer) - -/datum/brain_trauma/special/honorbound/proc/thrown_guilt(datum/source, atom/movable/thrown_movable, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(isitem(thrown_movable)) - var/mob/living/honorbound = source - var/obj/item/thrown_item = thrown_movable - var/mob/thrown_by = thrown_item.thrownby?.resolve() - if(thrown_item.throwforce < honorbound.health && ishuman(thrown_by)) - guilty(thrown_by) - //spell checking /datum/brain_trauma/special/honorbound/proc/spell_check(mob/user, datum/action/cooldown/spell/spell_cast) SIGNAL_HANDLER diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index d29bcfc3fa8..c7c2d1d1d58 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -6,13 +6,13 @@ For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent, you use one of the material IDs below. These are NOT ids in the usual sense (they aren't defined in the object or part of a datum), they are simply references used as part of a "has materials?" type proc. They all start with a $ to denote that they aren't reagents. -The currently supporting non-reagent materials. All material amounts are set as the define SHEET_MATERIAL_AMOUNT, which defaults to 2000 +The currently supporting non-reagent materials. All material amounts are set as the define SHEET_MATERIAL_AMOUNT, which defaults to 100 Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from iron). Only add raw materials. Design Guidelines - When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed. -- A single sheet of anything is 2000 units of material. Materials besides iron/glass require help from other jobs (mining for +- A single sheet of anything is 100 units of material. Materials besides iron/glass require help from other jobs (mining for other types of metals and chemistry for reagents). - Add the AUTOLATHE tag to */ diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index db619a48184..594486b539d 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -424,6 +424,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE +/datum/design/digital_clock_frame + name = "Digital Clock Frame" + id = "digital_clock_frame" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4) + build_path = /obj/item/wallframe/digital_clock + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SERVICE + /datum/design/razor name = "Electric Razor" id = "razor" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 24272fad964..1725c1fa5f5 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -121,7 +121,12 @@ ui.open() /obj/machinery/rnd/production/ui_static_data(mob/user) - var/list/data = list() + var/list/data + if(isnull(materials.mat_container)) + data = list() + else + data = materials.mat_container.ui_static_data() + var/list/designs = list() var/datum/asset/spritesheet/research_designs/spritesheet = get_asset_datum(/datum/asset/spritesheet/research_designs) @@ -201,7 +206,7 @@ var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index c6e838ae7bc..81fb08d2a34 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -211,7 +211,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good new /obj/item/stock_parts/micro_laser(src) new /obj/item/stock_parts/matter_bin(src) -/obj/item/storage/part_replacer/cyborg//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/storage/part_replacer/cyborg //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE name = "rapid part exchange device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "borgrped" @@ -257,7 +257,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good //Rating 1 -/obj/item/stock_parts/capacitor//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE ALL COMPONENTS! +/obj/item/stock_parts/capacitor name = "capacitor" desc = "A basic capacitor used in the construction of a variety of devices." icon_state = "capacitor" diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 1ea267fe7d9..e89c006626d 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -182,7 +182,7 @@ to_chat(owner, span_warning("[src] cannot be cast unless you are completely manifested in the material plane!")) return FALSE - if(!try_invoke(feedback = feedback)) + if(!try_invoke(owner, feedback = feedback)) return FALSE if(ishuman(owner)) @@ -242,7 +242,7 @@ if(!(precast_result & SPELL_NO_FEEDBACK)) // We do invocation and sound effects here, before actual cast // That way stuff like teleports or shape-shifts can be invoked before ocurring - spell_feedback() + spell_feedback(owner) // Actually cast the spell. Main effects go here cast(cast_on) @@ -319,20 +319,19 @@ SEND_SIGNAL(src, COMSIG_SPELL_AFTER_CAST, cast_on) /// Provides feedback after a spell cast occurs, in the form of a cast sound and/or invocation -/datum/action/cooldown/spell/proc/spell_feedback() - if(!owner) +/datum/action/cooldown/spell/proc/spell_feedback(mob/living/invoker) + if(!invoker) return ///even INVOCATION_NONE should go through this because the signal might change that - invocation() - if(sound) - playsound(get_turf(owner), sound, 50, TRUE) + invocation(invoker) + playsound(invoker, sound, 50, vary = TRUE) /// The invocation that accompanies the spell, called from spell_feedback() before cast(). -/datum/action/cooldown/spell/proc/invocation() +/datum/action/cooldown/spell/proc/invocation(mob/living/invoker) //lists can be sent by reference, a string would be sent by value var/list/invocation_list = list(invocation, invocation_type, garbled_invocation_prob) - SEND_SIGNAL(owner, COMSIG_MOB_PRE_INVOCATION, src, invocation_list) + SEND_SIGNAL(invoker, COMSIG_MOB_PRE_INVOCATION, src, invocation_list) var/used_invocation_message = invocation_list[INVOCATION_MESSAGE] var/used_invocation_type = invocation_list[INVOCATION_TYPE] var/used_invocation_garble_prob = invocation_list[INVOCATION_GARBLE_PROB] @@ -340,21 +339,21 @@ switch(used_invocation_type) if(INVOCATION_SHOUT) if(prob(used_invocation_garble_prob)) - owner.say(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") + invoker.say(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") else - owner.say(used_invocation_message, forced = "spell ([src])") + invoker.say(used_invocation_message, forced = "spell ([src])") if(INVOCATION_WHISPER) if(prob(used_invocation_garble_prob)) - owner.whisper(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") + invoker.whisper(replacetext(used_invocation_message," ","`"), forced = "spell ([src])") else - owner.whisper(used_invocation_message, forced = "spell ([src])") + invoker.whisper(used_invocation_message, forced = "spell ([src])") if(INVOCATION_EMOTE) - owner.visible_message(used_invocation_message, invocation_self_message) + invoker.visible_message(used_invocation_message, invocation_self_message) /// Checks if the current OWNER of the spell is in a valid state to say the spell's invocation -/datum/action/cooldown/spell/proc/try_invoke(feedback = TRUE) +/datum/action/cooldown/spell/proc/try_invoke(mob/living/invoker, feedback = TRUE) if(spell_requirements & SPELL_CASTABLE_WITHOUT_INVOCATION) return TRUE @@ -362,26 +361,25 @@ return TRUE // If you want a spell usable by ghosts for some reason, it must be INVOCATION_NONE - if(!isliving(owner)) + if(!istype(invoker)) if(feedback) - to_chat(owner, span_warning("You need to be living to invoke [src]!")) + to_chat(invoker, span_warning("You need to be living to invoke [src]!")) return FALSE - var/mob/living/living_owner = owner - var/invoke_sig_return = SEND_SIGNAL(owner, COMSIG_MOB_TRY_INVOKE_SPELL, src, feedback) + var/invoke_sig_return = SEND_SIGNAL(invoker, COMSIG_MOB_TRY_INVOKE_SPELL, src, feedback) if(invoke_sig_return & SPELL_INVOCATION_ALWAYS_SUCCEED) return TRUE // skips all of the following checks if(invoke_sig_return & SPELL_INVOCATION_FAIL) return FALSE - if(invocation_type == INVOCATION_EMOTE && HAS_TRAIT(living_owner, TRAIT_EMOTEMUTE)) + if(invocation_type == INVOCATION_EMOTE && HAS_TRAIT(invoker, TRAIT_EMOTEMUTE)) if(feedback) - to_chat(owner, span_warning("You can't position your hands correctly to invoke [src]!")) + to_chat(invoker, span_warning("You can't position your hands correctly to invoke [src]!")) return FALSE - if((invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !living_owner.can_speak()) + if((invocation_type == INVOCATION_WHISPER || invocation_type == INVOCATION_SHOUT) && !invoker.can_speak()) if(feedback) - to_chat(owner, span_warning("You can't get the words out to invoke [src]!")) + to_chat(invoker, span_warning("You can't get the words out to invoke [src]!")) return FALSE return TRUE diff --git a/code/modules/spells/spell_types/jaunt/_jaunt.dm b/code/modules/spells/spell_types/jaunt/_jaunt.dm index e2fc4324ad9..e73abb5b438 100644 --- a/code/modules/spells/spell_types/jaunt/_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/_jaunt.dm @@ -60,7 +60,7 @@ jaunter.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN), REF(src)) // Don't do the feedback until we have runechat hidden. // Otherwise the text will follow the jaunt holder, which reveals where our caster is travelling. - spell_feedback() + spell_feedback(jaunter) // This needs to happen at the end, after all the traits and stuff is handled SEND_SIGNAL(jaunter, COMSIG_MOB_ENTER_JAUNT, src, jaunt) diff --git a/code/modules/spells/spell_types/pointed/finger_guns.dm b/code/modules/spells/spell_types/pointed/finger_guns.dm index ee8cc5eeab6..5ed666d9e64 100644 --- a/code/modules/spells/spell_types/pointed/finger_guns.dm +++ b/code/modules/spells/spell_types/pointed/finger_guns.dm @@ -27,19 +27,19 @@ projectile_type = /obj/projectile/bullet/mime projectile_amount = 3 -/datum/action/cooldown/spell/pointed/projectile/finger_guns/try_invoke(feedback = TRUE) +/datum/action/cooldown/spell/pointed/projectile/finger_guns/try_invoke(mob/living/invoker, feedback = TRUE) if(invocation_type == INVOCATION_EMOTE) - if(!ishuman(owner)) + if(!ishuman(invoker)) return FALSE - var/mob/living/carbon/human/human_owner = owner - if(human_owner.incapacitated()) + var/mob/living/carbon/human/human_invoker = invoker + if(human_invoker.incapacitated()) if(feedback) - to_chat(owner, span_warning("You can't properly point your fingers while incapacitated.")) + to_chat(human_invoker, span_warning("You can't properly point your fingers while incapacitated.")) return FALSE - if(human_owner.get_active_held_item()) + if(human_invoker.get_active_held_item()) if(feedback) - to_chat(owner, span_warning("You can't properly fire your finger guns with something in your hand.")) + to_chat(human_invoker, span_warning("You can't properly fire your finger guns with something in your hand.")) return FALSE return ..() diff --git a/code/modules/spells/spell_types/self/voice_of_god.dm b/code/modules/spells/spell_types/self/voice_of_god.dm index 7320022fc30..b1efaabd2a8 100644 --- a/code/modules/spells/spell_types/self/voice_of_god.dm +++ b/code/modules/spells/spell_types/self/voice_of_god.dm @@ -38,7 +38,7 @@ cooldown_time = (command_cooldown * cooldown_mod) // "Invocation" is done by the actual voice of god proc -/datum/action/cooldown/spell/voice_of_god/invocation() +/datum/action/cooldown/spell/voice_of_god/invocation(mob/living/invoker) return /datum/action/cooldown/spell/voice_of_god/clown diff --git a/code/modules/spells/spell_types/teleport/_teleport.dm b/code/modules/spells/spell_types/teleport/_teleport.dm index 794da323dc5..fd6e02cdfb3 100644 --- a/code/modules/spells/spell_types/teleport/_teleport.dm +++ b/code/modules/spells/spell_types/teleport/_teleport.dm @@ -119,7 +119,7 @@ else target_area = tgui_input_list(cast_on, "Chose an area to teleport to.", "Teleport", GLOB.teleportlocs) - if(QDELETED(src) || QDELETED(cast_on) || !can_cast_spell()) + if(QDELETED(src) || QDELETED(cast_on) || (owner && !can_cast_spell())) return . | SPELL_CANCEL_CAST if(!target_area || isnull(GLOB.teleportlocs[target_area])) return . | SPELL_CANCEL_CAST @@ -132,7 +132,7 @@ living_cast_on.buckled?.unbuckle_mob(cast_on, force = TRUE) return ..() -/datum/action/cooldown/spell/teleport/area_teleport/invocation() +/datum/action/cooldown/spell/teleport/area_teleport/invocation(mob/living/invoker) var/area/last_chosen_area = GLOB.teleportlocs[last_chosen_area_name] if(!invocation_says_area || isnull(last_chosen_area)) @@ -140,6 +140,6 @@ switch(invocation_type) if(INVOCATION_SHOUT) - owner.say("[invocation], [uppertext(last_chosen_area.name)]!", forced = "spell ([src])") + invoker.say("[invocation], [uppertext(last_chosen_area.name)]!", forced = "spell ([src])") if(INVOCATION_WHISPER) - owner.whisper("[invocation], [uppertext(last_chosen_area.name)].", forced = "spell ([src])") + invoker.whisper("[invocation], [uppertext(last_chosen_area.name)].", forced = "spell ([src])") diff --git a/code/modules/spells/spell_types/touch/_touch.dm b/code/modules/spells/spell_types/touch/_touch.dm index 05840cd9351..29a6f28e4f5 100644 --- a/code/modules/spells/spell_types/touch/_touch.dm +++ b/code/modules/spells/spell_types/touch/_touch.dm @@ -223,7 +223,7 @@ return log_combat(caster, victim, "cast the touch spell [name] on", hand) - spell_feedback() + spell_feedback(caster) remove_hand(caster) /** @@ -240,7 +240,7 @@ // Continue will remove the hand here and stop if(SECONDARY_ATTACK_CONTINUE_CHAIN) log_combat(caster, victim, "cast the touch spell [name] on", hand, "(secondary / alt cast)") - spell_feedback() + spell_feedback(caster) remove_hand(caster) // Call normal will call the normal cast proc diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 2dc654fa7af..77e81cfda81 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -230,6 +230,11 @@ var/image/hair_overlay = image(sprite2.icon, "[sprite2.icon_state]", -HAIR_LAYER, SOUTH) hair_overlay.color = hair_color hair_overlay.alpha = hair_alpha + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_overlay @@ -268,8 +273,18 @@ else if(!hair_hidden && hair_overlay && (HAIR in species_flags_list)) hair_overlay.alpha = hair_alpha + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_overlay if(hair_gradient_overlay) + // SKYRAT ADD - Hair offset + if(LAZYFIND(owner?.dna?.species?.offset_features, OFFSET_HAIR)) + hair_gradient_overlay.pixel_x = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_X] + hair_gradient_overlay.pixel_y = owner.dna.species.offset_features[OFFSET_HAIR][INDEX_Y] + // SKYRAT ADD END . += hair_gradient_overlay /// Returns an appropriate debrained icon state diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index 37a75f1cba4..d6bb8358414 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -89,7 +89,7 @@ /datum/bodypart_overlay/mutant/wings/moth/can_draw_on_bodypart(mob/living/carbon/human/human) if(!(human.wear_suit?.flags_inv & HIDEMUTWINGS)) return ..(human, ignore_suit = TRUE) //SKYRAT - Customization - ORIGINAL: return TRUE - return ..() //SKYRAT EDIT - Customization - ORIGINAL: return FALSE + return FALSE /datum/bodypart_overlay/mutant/wings/moth/get_base_icon_state() return burnt ? burn_datum.icon_state : sprite_datum.icon_state diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png index ace27bc50e2..bf5b3374ce4 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_fugitive.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png index 99b989476e8..acb7c061011 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_akula.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png index 12e1720c01b..82f06aabc25 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png index 12e1720c01b..82f06aabc25 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png differ diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 8d1607fd119..2b929988441 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -17,6 +17,7 @@ uplink_item.name += " ([round(((initial(uplink_item.cost)-uplink_item.cost)/initial(uplink_item.cost))*100)]% off!)" uplink_item.desc += " Normally costs [initial(uplink_item.cost)] TC. All sales final. [pick(disclaimer)]" uplink_item.item = taken_item.item + uplink_item.discounted = TRUE sales += uplink_item return sales @@ -35,8 +36,6 @@ var/desc = "item description" /// Path to the item to spawn. var/item = null - /// Alternative path for refunds, in case the item purchased isn't what is actually refunded (ie: holoparasites). - var/refund_path = null /// Cost of the item. var/cost = 0 /// Amount of TC to refund, in case there's a TC penalty for refunds. @@ -47,6 +46,8 @@ var/surplus = 100 /// Whether this can be discounted or not var/cant_discount = FALSE + /// If discounted, is true. Used to send a signal to update reimbursement. + var/discounted = FALSE /// If this value is changed on two items they will share stock, defaults to not sharing stock with any other item var/stock_key = UPLINK_SHARED_STOCK_UNIQUE /// How many items of this stock can be purchased. @@ -125,6 +126,8 @@ A = new spawn_path(get_turf(user)) else A = spawn_path + if(refundable) + A.AddElement(/datum/element/uplink_reimburse, (refund_amount ? refund_amount : cost)) if(ishuman(user) && isitem(A)) var/mob/living/carbon/human/H = user if(H.put_in_hands(A)) diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 0c14c302b5e..1d3b3cb0a6b 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -89,6 +89,7 @@ surplus = 0 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) restricted = TRUE + refundable = TRUE /datum/uplink_item/dangerous/revolver name = "Syndicate Revolver" diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 36b77e3e8ef..4714935974c 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -551,6 +551,7 @@ cost = 20 purchasable_from = UPLINK_CLOWN_OPS restricted = TRUE + refundable = TRUE /datum/uplink_item/support/reinforcement name = "Reinforcements" @@ -558,16 +559,15 @@ They'll come equipped with a mere surplus SMG, so arming them is recommended." item = /obj/item/antag_spawner/nuke_ops cost = 25 - refundable = TRUE purchasable_from = UPLINK_NUKE_OPS restricted = TRUE + refundable = TRUE /datum/uplink_item/support/reinforcement/assault_borg name = "Syndicate Assault Cyborg" desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \ Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar." item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault - refundable = TRUE cost = 65 restricted = TRUE @@ -577,7 +577,6 @@ It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \ Thanks to its organ storage bag, it can perform surgery as well as any humanoid." item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical - refundable = TRUE cost = 35 restricted = TRUE @@ -587,7 +586,6 @@ Aside from regular Engineering equipment, it comes with a special destination tagger that lets it traverse disposals networks. \ Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer." item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur - refundable = TRUE cost = 35 restricted = TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 37746277eb6..d74468d1d28 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -281,11 +281,11 @@ ///Type of fuel the generator is using. Is set in generator_init() to add the starting amount of fuel var/obj/item/stack/sheet/fuel = null ///Fuel used per second while idle, not generating, in units - var/fuelrate_idle = 12.5 + var/fuelrate_idle = 0.00625 * SHEET_MATERIAL_AMOUNT ///Fuel used per second while actively generating, in units - var/fuelrate_active = 100 + var/fuelrate_active = 0.05 * SHEET_MATERIAL_AMOUNT ///Maximum fuel capacity of the generator, in units - var/max_fuel = 150000 + var/max_fuel = 75 * SHEET_MATERIAL_AMOUNT ///Energy recharged per second var/rechargerate = 10 @@ -312,11 +312,11 @@ . = ..() if(action == "toggle") if(activated) - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation enabled.")]") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Power generation enabled.")]") START_PROCESSING(SSobj, src) log_message("Activated.", LOG_MECHA) else - to_chat(usr, "[icon2html(src, usr)][span_warning("Power generation disabled.")]") + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Power generation disabled.")]") STOP_PROCESSING(SSobj, src) log_message("Deactivated.", LOG_MECHA) return TRUE diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 7ae78576493..97894b28992 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -92,7 +92,7 @@ //maximum stocking amount (default 300000, 600000 at T4) for(var/datum/stock_part/matter_bin/matter_bin in component_parts) T += matter_bin.tier - rmat.set_local_size((200000 + (T * 50000))) + rmat.set_local_size(((100*SHEET_MATERIAL_AMOUNT) + (T * (25*SHEET_MATERIAL_AMOUNT)))) //resources adjustment coefficient (1 -> 0.85 -> 0.7 -> 0.55) T = 1.15 diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index e3d0ef2c023..3b4098b51c0 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -165,10 +165,11 @@ * Is this item on station or not * * if it doesn't originate from off-station during mapload, everything is free + * if it's off-station during mapload, it's also safe from the brand intelligence event */ - var/onstation = TRUE //if it doesn't originate from off-station during mapload, everything is free - ///A variable to change on a per instance basis on the map that allows the instance to force cost and ID requirements - var/onstation_override = FALSE //change this on the object on the map to override the onstation check. DO NOT APPLY THIS GLOBALLY. + var/onstation = TRUE + ///A variable to change on a per instance basis on the map that allows the instance to force cost and ID requirements. DO NOT APPLY THIS GLOBALLY. + var/onstation_override = FALSE var/list/vending_machine_input = list() ///Display header on the input view diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index e7492f43d94..2e00d9d2a01 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -4,27 +4,60 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" panel_type = "panel4" - products = list( - /obj/item/storage/bag/tray = 8, - /obj/item/reagent_containers/cup/bowl = 30, - /obj/item/reagent_containers/cup/soup_pot = 3, - /obj/item/kitchen/fork = 6, - /obj/item/kitchen/spoon = 10, - /obj/item/kitchen/spoon/soup_ladle = 3, - /obj/item/reagent_containers/cup/glass/drinkingglass = 8, - /obj/item/reagent_containers/condiment/pack/ketchup = 5, - /obj/item/reagent_containers/condiment/pack/hotsauce = 5, - /obj/item/reagent_containers/condiment/pack/astrotame = 5, - /obj/item/reagent_containers/condiment/saltshaker = 5, - /obj/item/reagent_containers/condiment/peppermill = 5, - /obj/item/clothing/suit/apron/chef = 2, - /obj/item/kitchen/rollingpin = 2, - /obj/item/knife/kitchen = 2, - /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, - /obj/item/skillchip/chefs_kiss = 2, - /obj/item/plate/small = 5, - /obj/item/plate = 10, - /obj/item/plate/large = 5, + product_categories = list( + list( + "name" = "Kitchen Utensils", + "icon" = FA_ICON_KITCHEN_SET, + "products" = list( + /obj/item/storage/bag/tray = 8, + /obj/item/reagent_containers/cup/soup_pot = 3, + /obj/item/kitchen/spoon/soup_ladle = 3, + /obj/item/clothing/suit/apron/chef = 2, + /obj/item/kitchen/rollingpin = 2, + /obj/item/knife/kitchen = 2, + ), + ), + list( + "name" = "Eating Utensils", + "icon" = FA_ICON_UTENSILS, + "products" = list( + /obj/item/kitchen/fork = 6, + /obj/item/kitchen/spoon = 10, + ), + ), + list( + "name" = "Dinnerware", + "icon" = FA_ICON_PLATE_WHEAT, + "products" = list( + /obj/item/plate/small = 5, + /obj/item/plate = 10, + /obj/item/plate/large = 5, + /obj/item/reagent_containers/cup/bowl = 30, + /obj/item/reagent_containers/cup/glass/drinkingglass = 8, + ), + ), + list( + "name" = "Condiments", + "icon" = FA_ICON_BOTTLE_DROPLET, + "products" = list( + /obj/item/reagent_containers/condiment/pack/ketchup = 5, + /obj/item/reagent_containers/condiment/pack/hotsauce = 5, + /obj/item/reagent_containers/condiment/pack/astrotame = 5, + /obj/item/reagent_containers/condiment/saltshaker = 5, + /obj/item/reagent_containers/condiment/peppermill = 5, + ), + ), + list( + "name" = "Recipes", + "icon" = FA_ICON_BOOK_OPEN_READER, + "products" = list( + /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, + ), + ), + ) + + premium = list( + /obj/item/skillchip/chefs_kiss = 2 ) contraband = list( /obj/item/kitchen/rollingpin/illegal = 2, @@ -32,7 +65,7 @@ ) refill_canister = /obj/item/vending_refill/dinnerware default_price = PAYCHECK_CREW * 0.8 - extra_price = PAYCHECK_COMMAND + extra_price = PAYCHECK_CREW * 2.4 payment_department = ACCOUNT_SRV light_mask = "dinnerware-light-mask" diff --git a/code/modules/vending/runic_vendor.dm b/code/modules/vending/runic_vendor.dm new file mode 100644 index 00000000000..3edb5b27264 --- /dev/null +++ b/code/modules/vending/runic_vendor.dm @@ -0,0 +1,91 @@ +#define PULSE_DISTANCE_RANGE 2 + +/obj/machinery/vending/runic_vendor + name = "\improper Runic Vending Machine" + desc = "This vending machine was designed for warfare! A perfect bait for Nanotrasen's crew thirst for consumerism." + icon_state = "RunicVendor" + panel_type = "panel10" + product_slogans = "Come get free magic!;50% off on Mjollnirs today!; Buy a warp whistle and get another one free!" + vend_reply = "Please, stand still near the vending machine for your special package!" + resistance_flags = FIRE_PROOF + light_mask = "RunicVendor-light-mask" + /// How long the vendor stays up before it decays. + var/time_to_decay = 30 SECONDS + /// Area around the vendor that will pushback nearby mobs. + var/pulse_distance = PULSE_DISTANCE_RANGE + + +/obj/machinery/vending/runic_vendor/Initialize(mapload) + if(mapload) + log_mapping("[type] is not supposed to be mapped it, it decays after a set time") + stack_trace("Someone mapped in the meme vending machine the wizard scepter spawns, please remove it") + + addtimer(CALLBACK(src, PROC_REF(decay)), time_to_decay, TIMER_STOPPABLE) + INVOKE_ASYNC(src, PROC_REF(runic_pulse)) + + switch(pick(1,3)) + if(1) + products = list( + /obj/item/clothing/head/wizard = 1, + /obj/item/clothing/suit/wizrobe = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + if(2) + products = list( + /obj/item/clothing/head/wizard/red = 1, + /obj/item/clothing/suit/wizrobe/red = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + if(3) + products = list( + /obj/item/clothing/head/wizard/yellow = 1, + /obj/item/clothing/suit/wizrobe/yellow = 1, + /obj/item/clothing/shoes/sandal/magic = 1, + /obj/item/toy/foam_runic_scepter = 1, + ) + + return ..() + +/obj/machinery/vending/runic_vendor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(held_item) + if(istype(held_item, /obj/item/runic_vendor_scepter)) + context[SCREENTIP_CONTEXT_LMB] = "Detonate" + context[SCREENTIP_CONTEXT_RMB] = "Force push" + + return CONTEXTUAL_SCREENTIP_SET + + return . + + +/obj/machinery/vending/runic_vendor/Destroy() + visible_message(span_warning("[src] flickers and disappears!")) + playsound(src,'sound/weapons/resonator_blast.ogg',25,TRUE) + return ..() + +/obj/machinery/vending/runic_vendor/proc/runic_explosion() + explosion(src, light_impact_range = 2) + qdel(src) + +/obj/machinery/vending/runic_vendor/proc/runic_pulse() + var/pulse_locs = spiral_range_turfs(pulse_distance, get_turf(src)) + var/list/hit_things = list() + for(var/turf/pulsing_turf in pulse_locs) + for(var/mob/living/mob_to_be_pulsed_back in pulsing_turf.contents) + hit_things += mob_to_be_pulsed_back + var/atom/target = get_edge_target_turf(mob_to_be_pulsed_back, get_dir(src, get_step_away(mob_to_be_pulsed_back, src))) + to_chat(mob_to_be_pulsed_back, span_userdanger("The field repels you with tremendous force!")) + playsound(src, 'sound/effects/gravhit.ogg', 50, TRUE) + mob_to_be_pulsed_back.throw_at(target, 4, 4) + +/obj/machinery/vending/runic_vendor/screwdriver_act(mob/living/user, obj/item/I) + explosion(src, light_impact_range = 2) + qdel(src) + +/obj/machinery/vending/runic_vendor/proc/decay() + qdel(src) + +#undef PULSE_DISTANCE_RANGE diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index ca05ac68a87..9c99b5423ea 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -90,7 +90,7 @@ var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) @@ -343,7 +343,7 @@ var/total_storage = 0 for(var/datum/stock_part/matter_bin/bin in component_parts) - total_storage += bin.tier * 75000 + total_storage += bin.tier * (37.5*SHEET_MATERIAL_AMOUNT) materials.set_local_size(total_storage) diff --git a/html/changelogs/AutoChangeLog-pr-19908.yml b/html/changelogs/AutoChangeLog-pr-19908.yml new file mode 100644 index 00000000000..9be909c4513 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-19908.yml @@ -0,0 +1,4 @@ +author: "Nerev4r" +delete-after: True +changes: + - refactor: "Podperson hair is now colorable, properly layered, and able to be emissive." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21861.yml b/html/changelogs/AutoChangeLog-pr-21861.yml deleted file mode 100644 index 50fe70675ac..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21861.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - rscadd: "Added Solfed stamp, recolored NRI stamp to a more green color" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21930.yml b/html/changelogs/AutoChangeLog-pr-21930.yml deleted file mode 100644 index 3f00279e7ab..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21930.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - image: "Updated several Null Rod Graphics. Also updated: the supermatter sword." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21958.yml b/html/changelogs/AutoChangeLog-pr-21958.yml deleted file mode 100644 index ca2687e8db2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21958.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - rscadd: "The Vorpal Scythe, a special null rod variant that gains power from beheading people! But it is fickle about when and how you use its power. Replaces the Reaper Scythe." - - rscadd: "Beheading via the special death knell attack empowers the scythe, but only on humans with a mind, and requires you to use the right-click button to wind up the slice. If you succeed, you empower your scythe for a bit!" - - rscadd: "If they don't have a mind, you cause the heads to float around. OoooOOOooo! Spooky!" - - rscadd: "With the sinister crystal that holds the Vorpal Scythe within bound to your arm, you are Morbid! You love to do pretty unsettling things, like dissections for fun! But helping the living stay alive is abhorrent to you!" - - rscadd: "...unless you get to do it while screaming 'IT LIVES!' via Revival surgery. Screw conventional medicine and science, you know the true way to bring back the dead!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21966.yml b/html/changelogs/AutoChangeLog-pr-21966.yml deleted file mode 100644 index 66d58716cba..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21966.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - image: "added lizard inhand- and onhead sprites" - - image: "added space lizard inhand- and onhead sprites" - - bugfix: "changed held weight class of lizards from normal to tiny" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21983.yml b/html/changelogs/AutoChangeLog-pr-21983.yml deleted file mode 100644 index d8d9315085e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21983.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Virology disposals now route directly to space, rather than sending their nasty tubes to cargo." - - bugfix: "A single maintenance spawner was removed from a wall by plumbing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-21993.yml b/html/changelogs/AutoChangeLog-pr-21993.yml deleted file mode 100644 index 2e7ae3a3c50..00000000000 --- a/html/changelogs/AutoChangeLog-pr-21993.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - rscadd: "Adds a shark plush, obtainable from Cargo for a nominal fee." - - rscdel: "Removed plush cucumber by popular request. Cucumber has been replaced by the shark plushie in arcade machines." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22044.yml b/html/changelogs/AutoChangeLog-pr-22044.yml new file mode 100644 index 00000000000..917917e2467 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22044.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "glass bottles with reagents can be used for crafting, empty glass bottles will be used as tools(e.g. empty glass bottle as rolling pin)" + - bugfix: "glass bottle with welding fuel can be used for crafting improvised shotgun shells" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22046.yml b/html/changelogs/AutoChangeLog-pr-22046.yml new file mode 100644 index 00000000000..db66d4f9251 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22046.yml @@ -0,0 +1,5 @@ +author: "Melbert" +delete-after: True +changes: + - rscadd: "Wizarditis Improved. Those infected will now randomly cast one of the following (weakened) spells at max stage: Teleport, Disable Tech, Mutate, Knock, Forcewall, Blink, Smoke, Spacetime Distortion, Timestop, Repulse, Blind, Lightning Bolt, or Swap" + - rscadd: "A source of antimagic will prevent Wizarditis's ill effects, but won't cure you." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22059.yml b/html/changelogs/AutoChangeLog-pr-22059.yml new file mode 100644 index 00000000000..1848676af85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22059.yml @@ -0,0 +1,5 @@ +author: "SkyratBot" +delete-after: True +changes: + - sound: "Adds unique sounds to library barcode scanner" + - image: "Removes soul from library" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22069.yml b/html/changelogs/AutoChangeLog-pr-22069.yml new file mode 100644 index 00000000000..cdf5aa2c274 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22069.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Symbols display correctly when sending messages via mind link" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22070.yml b/html/changelogs/AutoChangeLog-pr-22070.yml new file mode 100644 index 00000000000..d98671b04db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22070.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Items that shouldn't have been stacking should no longer stack." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22073.yml b/html/changelogs/AutoChangeLog-pr-22073.yml new file mode 100644 index 00000000000..d275b44aec7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22073.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - image: "the mosin and prime nagants' mob sprites have been updated" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22076.yml b/html/changelogs/AutoChangeLog-pr-22076.yml new file mode 100644 index 00000000000..25ac1acc597 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22076.yml @@ -0,0 +1,4 @@ +author: "axietheaxolotl / viro" +delete-after: True +changes: + - image: "resprited surgery tables, and stasis beds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22078.yml b/html/changelogs/AutoChangeLog-pr-22078.yml new file mode 100644 index 00000000000..de2f68b9865 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22078.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - sound: "One (1) new space ambience track has been added. Good luck and godspeed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22079.yml b/html/changelogs/AutoChangeLog-pr-22079.yml new file mode 100644 index 00000000000..c77e25d8902 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22079.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "The lavaproof tracks cyborg upgrade now protects against liquid plasma, the Icebox equivalent of lava." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22081.yml b/html/changelogs/AutoChangeLog-pr-22081.yml new file mode 100644 index 00000000000..42ee98895a8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22081.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "fixed hostile mobs trying to attack supermatter discharge bolts" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22100.yml b/html/changelogs/AutoChangeLog-pr-22100.yml new file mode 100644 index 00000000000..612807bedd8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22100.yml @@ -0,0 +1,7 @@ +author: "LT3" +delete-after: True +changes: + - refactor: "Refactored maptext (those floating words)" + - bugfix: "Fixed special chat bubbles for yelling, clown, redtext, greentext" + - bugfix: "Fixed alignment of status display text" + - code_imp: "Status displays now synchronize their message lines when scrolling" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22106.yml b/html/changelogs/AutoChangeLog-pr-22106.yml new file mode 100644 index 00000000000..83b13209d3c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22106.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - balance: "Syndicate simplemob fire-rate raised to one shot per second." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-22109.yml b/html/changelogs/AutoChangeLog-pr-22109.yml new file mode 100644 index 00000000000..c9698216f14 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-22109.yml @@ -0,0 +1,4 @@ +author: "SkyratBot" +delete-after: True +changes: + - bugfix: "Brand intelligence can no longer affect off-station vendors in some specific circumstances." \ No newline at end of file diff --git a/html/changelogs/archive/2023-06.yml b/html/changelogs/archive/2023-06.yml index 872ee6c2a95..17c6e1284df 100644 --- a/html/changelogs/archive/2023-06.yml +++ b/html/changelogs/archive/2023-06.yml @@ -907,3 +907,192 @@ - bugfix: fixes holymelons not having inhand sprites softcerv: - bugfix: NIFs are no longer parented to their owners +2023-06-23: + SkyratBot: + - rscadd: Adds a shark plush, obtainable from Cargo for a nominal fee. + - rscdel: Removed plush cucumber by popular request. Cucumber has been replaced + by the shark plushie in arcade machines. + - rscadd: The Vorpal Scythe, a special null rod variant that gains power from beheading + people! But it is fickle about when and how you use its power. Replaces the + Reaper Scythe. + - rscadd: Beheading via the special death knell attack empowers the scythe, but + only on humans with a mind, and requires you to use the right-click button to + wind up the slice. If you succeed, you empower your scythe for a bit! + - rscadd: If they don't have a mind, you cause the heads to float around. OoooOOOooo! + Spooky! + - rscadd: With the sinister crystal that holds the Vorpal Scythe within bound to + your arm, you are Morbid! You love to do pretty unsettling things, like dissections + for fun! But helping the living stay alive is abhorrent to you! + - rscadd: '...unless you get to do it while screaming ''IT LIVES!'' via Revival + surgery. Screw conventional medicine and science, you know the true way to bring + back the dead!' + - image: 'Updated several Null Rod Graphics. Also updated: the supermatter sword.' + - bugfix: Virology disposals now route directly to space, rather than sending their + nasty tubes to cargo. + - bugfix: A single maintenance spawner was removed from a wall by plumbing. + - image: added lizard inhand- and onhead sprites + - image: added space lizard inhand- and onhead sprites + - bugfix: changed held weight class of lizards from normal to tiny + Zonespace27: + - rscadd: Added Solfed stamp, recolored NRI stamp to a more green color + softcerv: + - bugfix: soulcatcher join actions no longer duplicate themselves when a ghost logs + in and out. +2023-06-24: + GoldenAlpharex: + - bugfix: Inflatable barrier box can now only contain inflatables, and should be + able to hold as many as they spawn with. They also hold a nicer amount of items + (7 doors and 14 walls, instead of 8 doors and 16 walls, which looked stupid). + Guillaume Prata: + - rscadd: 'New Wizard spell branch: Vendormacy! Summon runic vending machines with + your Vending Scepter, force push them on your enemies to squish them or blow + them up while they are busy buying from the machines.' + Hatterhat: + - rscadd: The Free Trade Union has reported losing small stocks of their "Archangel" + rifle furniture sets. Coincidentally, in-sector black markets (accessible, as + always, via appropriate black market uplinks) now report an uptick in availability + of the very same parts. Prospective crazed gunmen are advised to bring a screwdriver. + LT3: + - image: Delam and tram flipsigns have been replaced with information displays + - bugfix: Tram hit count is centrally managed instead of independently on each sign, + so they won't get out of sync + Melbert: + - qol: Categorizes chef vendor + - bugfix: The colossus's finale attack is now 100x more lethal, because it was firing + 100x fewer projectiles than intended + - bugfix: Fixed EMP'd / signaled microwaves not running as they should + - bugfix: Fix runtimes from Bileworms targeting mechas (or other objects people + are hiding in) + - bugfix: The Syndicate Assault Cyborg can autofire their LMG + OrionTheFox: + - qol: made Balaclavas layer below glasses and radios + Paxilmaniac: + - qol: If you are either flying or floating, you can now traverse differently heighted + tiles (for example, pool tiles onto a normal floor) without having to climb. + - bugfix: Pool tiles are no longer forever jail if the gravity system shuts off. + Skyrat: + - balance: Nanotrasen's accounting department flipped out when they noticed how + much money the station was spending on confetti. Employees are now advised to + have birthdays less often and/or with less celebration. + SkyratBot: + - bugfix: Fixed being unable to reimburse syndicate spawners via uplinks. This includes + nukie reinforcements, cyborgs, and holoparasite injectors. + - refactor: Turned TC reimbursement into a bespoke element. + - spellcheck: Tuned demon's blood message when there's no ghosts to pick to be a + little more understandable and sensible. + - qol: pill press' max volume for bottles are 50, as the volume of bottles itself. + - bugfix: changed station floor tiles to be worth 25 instead of 50, one quarter + of an iron sheet. + - rscadd: air sensor's are craftable + - refactor: air sensor's can now be turned off by hand and can only be deconstructed + by a welding tool + - refactor: removed `Params()` proc + - qol: unwrenched air sensors can be picked up & recycled like regular item's + - rscdel: air sensor are removed from the RPD UI + - qol: air sensor's are no longer restricted by their unique ID's which mean you + can craft as many air sensors as you want. + - qol: Instrument delivery beacons now fit in pockets. + - bugfix: ' material container[and hence autolathe] now won''t touch the content''s + of abstract/hologram item''s like the tentacle gun' + - bugfix: material container[and hence autolathe] consuming indestructible items + - bugfix: material container[and hence autolathe] cosuming half the content's of + an object and leaving out the rest if there isn't space producing broken behaviour + in those item's + - qol: material container[and hence autolathe] display's the item name consumed + and it's material worth to let player's fully know the content's of the item + being recycled + - bugfix: Rockets can no longer embed in people and cause blunt wounds instead of + piercing + - bugfix: Dehardcodes some stuff with tram windows, they'll be easier to map with + now + - refactor: Border objects can now smooth with each other. I'm sure something cool + will come of this + - sound: explosive implant's beeps get louder as it gets closer to exploding + - bugfix: fixed Godwoken Syndrome VoG commands triggering the spam filter + - qol: Embedding an object inside a cake or loaf of bread now requires a right-click + instead of a left-click. No more accidentally putting your knife inside it! + - qol: Added context tips for slicing, embedding, and removing embedded items from + cake, bread, and cheese wheels. + - bugfix: Fixed the honourbound trauma not reacting to attacks from basic mobs + - bugfix: Fixed the "Declare Evil" spell not working against the medical department. + - rscadd: Baseballs can now be crafted with 3 leather. + - bugfix: fixed mecha generators using way too much fuel due to using the old values + of material units per sheet + - bugfix: Maps loaded post init will no longer randomly enter a failed state. Hopefully. + - bugfix: attacking non-carbon mobs with a cuffsnapping object will no longer runtime. + - code_imp: makes sure cargo computer doesn't use `usr` var inside `ui_act()` which + could cause undefined behaviour + - qol: Add UI preference menus for AI hologram and status displays + - bugfix: autolathe, protolathe, mech fabricator and component printers material + capacity are now in 20 times less, as intended. + - bugfix: protolathe material menu now should display material ejecting correctly. + Wallem: + - image: Tweaks cardboard sheet sprite + vinylspiders: + - bugfix: the mothic mantella and mothic flightsuit will now always hide moth wings + again +2023-06-25: + LT3: + - bugfix: Nanotrasen sent a crew in the night to fix the poorly installed clocks + and incident displays on Void Raptor + SkyratBot: + - bugfix: bubble gum crate actually looks correct + - image: Added new Space Beer sprite + - image: Added new Carp Lite sprite + - image: Added new Ale Bottle sprite + - image: Added new Two-Time Root Beer sprite + - rscadd: Adds digital clocks, can be found in all the stations' hallways! Most + noticeably in bars or the bridge. They can also be lathed. + - admin: The Debug and Admin MODsuits now take a lot less time to (de)activate. + 2 and 0.5 seconds respectively, compared to the default of 10s. + - image: Resprited the Limb Grower + Wallem: + - image: Resprites plumbing machines + softcerv: + - rscadd: soulcatcher souls can now be renamed by themselves or the owner of the + soulcatcher + - qol: soulcatcher souls now have their own dedicated UI + tf-4: + - bugfix: Multi-tile airlocks will no longer close on you if you stand on the "wrong" + tile. + - bugfix: Multi-tile airlock assemblies are no longer only half dense. +2023-06-27: + LT3: + - qol: Crew have learned how to properly hold their alcohol + - qol: Crew can smoke a cigarette without falling into an instant coughing fit + - bugfix: Fixed nicotine addiction side effects being applied twice each time + OrionTheFox: + - image: Stock Parts, Bluespace Crystals, and Telecrystals are now using TG's sprites + zydras: + - qol: Improved a donator gas mask's sprite, function and gave it general donator + access +2023-06-28: + Hatterhat: + - rscadd: Breaching hammers (like the ones found in the armory) are now usable to + break kneecaps on immobilized, buckled, or floored targets. + SkyratBot: + - bugfix: Added the missing medical laptop to the morgue on Northstar. + - qol: '[Birdshot] Adds layer adapters to gas tank output hookups in atmospherics' + - qol: '[Birdshot] Adds additional navigation verb landmarks' + - bugfix: '[Birdshot] Fixes entrances to some departments from maints not requiring + department access' + - bugfix: '[Birdshot] Converts the guard locker in perma to a normal security officer''s + locker' + - bugfix: '[Birdshot] Adds an exterior outlet vent for the incinerator' + - bugfix: Science department hallways now have unrestricted one-way exits on Delta, + Birdshot, and Icebox, to make these maps consistent with the others. + YakumoChen: + - balance: Deforest Medical imports now have a selection of Medical-themed MODsuit + modules for sale, as well as some cyber augments. + dolphinemote: + - bugfix: replaces sofas in VR medbay break room with correctly turned versions + - bugfix: replaces the bench in the VR medbay lobby with a correctly edged version + - bugfix: replaces the reinforced table in the VR maint that was adjacent to the + basic iron tables with an iron version + - bugfix: changes decals in the VR evidence room + - bugfix: removes one air alarm from the VR evidence room (it had two) + zydras: + - rscadd: Added 2 new donator items for someone + - bugfix: fixed incorrect/missing ckeys on donator items + - bugfix: fixed all-donator item not being selectable due to lacking a duplicate + path diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 6a5277636d6..f5fc1ff67d5 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_left.dmi b/icons/mob/inhands/weapons/64x_guns_left.dmi index 83f9b02b572..e03b66b1c67 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_left.dmi and b/icons/mob/inhands/weapons/64x_guns_left.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_right.dmi b/icons/mob/inhands/weapons/64x_guns_right.dmi index 4e804c53d72..3e58d86b7a5 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_right.dmi and b/icons/mob/inhands/weapons/64x_guns_right.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index e866650e19f..8aeba8acd7b 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 2aca6d31727..a5770109909 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi index 82c552b5038..0b7480e211c 100644 Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi index 769709f53da..fd85d8913a9 100644 Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ diff --git a/icons/mob/silicon/ai.dmi b/icons/mob/silicon/ai.dmi index 6ccceff86d9..df9059fb09e 100644 Binary files a/icons/mob/silicon/ai.dmi and b/icons/mob/silicon/ai.dmi differ diff --git a/icons/obj/digital_clock.dmi b/icons/obj/digital_clock.dmi new file mode 100644 index 00000000000..9ab096bf593 Binary files /dev/null and b/icons/obj/digital_clock.dmi differ diff --git a/icons/obj/drinks/bottles.dmi b/icons/obj/drinks/bottles.dmi index 6f362217954..4eb56636580 100644 Binary files a/icons/obj/drinks/bottles.dmi and b/icons/obj/drinks/bottles.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 31c97cfaf9a..ebf48682325 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/machines/incident_display.dmi b/icons/obj/machines/incident_display.dmi new file mode 100644 index 00000000000..80d63134f1d Binary files /dev/null and b/icons/obj/machines/incident_display.dmi differ diff --git a/icons/obj/machines/limbgrower.dmi b/icons/obj/machines/limbgrower.dmi index 7e26a9f7f24..d14d31a054c 100644 Binary files a/icons/obj/machines/limbgrower.dmi and b/icons/obj/machines/limbgrower.dmi differ diff --git a/icons/obj/machines/stasis.dmi b/icons/obj/machines/stasis.dmi index 21844b0f8d5..3c0cd722714 100755 Binary files a/icons/obj/machines/stasis.dmi and b/icons/obj/machines/stasis.dmi differ diff --git a/icons/obj/medical/surgery_table.dmi b/icons/obj/medical/surgery_table.dmi index 2db30fee06d..bfa0c8266ed 100644 Binary files a/icons/obj/medical/surgery_table.dmi and b/icons/obj/medical/surgery_table.dmi differ diff --git a/icons/obj/plumbing/plumbers.dmi b/icons/obj/plumbing/plumbers.dmi index 0df78d61294..792868a8ae3 100644 Binary files a/icons/obj/plumbing/plumbers.dmi and b/icons/obj/plumbing/plumbers.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index bddf5166764..cacb18fabda 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 27e3d27cd91..09c580cbee0 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi index 6833e9ff244..76d20addff7 100644 Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 0c8eab0e2fb..f74b5ae4a85 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/obj/weapons/guns/magic.dmi b/icons/obj/weapons/guns/magic.dmi index 3a97682ef66..7dbc984c4b6 100644 Binary files a/icons/obj/weapons/guns/magic.dmi and b/icons/obj/weapons/guns/magic.dmi differ diff --git a/interface/fonts.dm b/interface/fonts.dm deleted file mode 100644 index 0bfc9c728c7..00000000000 --- a/interface/fonts.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// A font datum, it exists to define a custom font to use in a span style later. -/datum/font - /// Font name, just so people know what to put in their span style. - var/name - /// The font file we link to. - var/font_family - -/datum/font/vcr_osd_mono - name = "VCR OSD Mono" - font_family = 'interface/VCR_OSD_Mono.ttf' diff --git a/interface/fonts/Grand9K_Pixel.ttf b/interface/fonts/Grand9K_Pixel.ttf new file mode 100644 index 00000000000..cf6fdf44e2e Binary files /dev/null and b/interface/fonts/Grand9K_Pixel.ttf differ diff --git a/interface/fonts/TinyUnicode.ttf b/interface/fonts/TinyUnicode.ttf new file mode 100644 index 00000000000..74d0d3e386e Binary files /dev/null and b/interface/fonts/TinyUnicode.ttf differ diff --git a/interface/VCR_OSD_Mono.ttf b/interface/fonts/VCR_OSD_Mono.ttf similarity index 100% rename from interface/VCR_OSD_Mono.ttf rename to interface/fonts/VCR_OSD_Mono.ttf diff --git a/interface/fonts/fonts_datum.dm b/interface/fonts/fonts_datum.dm new file mode 100644 index 00000000000..a346706d7fa --- /dev/null +++ b/interface/fonts/fonts_datum.dm @@ -0,0 +1,78 @@ +/// A font datum, it exists to define a custom font to use in a span style later. +/datum/font + /// Font name, just so people know what to put in their span style. + var/name + /// The font file we link to. + var/font_family + + /// Font features and metrics + /// Generated by Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) + /// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe + + /// list of font size/spacing metrics + var/list/metrics + /// total height of a line + var/height + /// distance above baseline (including whitespace) + var/ascent + /// distance below baseline + var/descent + /// average character width + var/average_width + /// maximum character width + var/max_width + /// extra width, such as from italics, for a line + var/overhang + /// internal leading vertical space, for accent marks + var/in_leading + /// external leading vertical space, just plain blank + var/ex_leading + /// default character (for undefined chars) + var/default_character + /// first character in metrics + var/start + /// last character in metrics + var/end + +/// Get font metrics +/// From Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/datum/font/proc/get_metrics(text, flags, first_line) + . = 0 + var/longest = 0 + if(!length(text)) + return + + var/i = 1 + var/idx + while(i <= length(text)) + var/character = text2ascii(text, i++) + if(character <= 10) + if(character <= 7) + . += character // spacers for justification + + if(character <= 9) + continue // soft-break chars + + if(. && idx && !(flags & INCLUDE_AC)) + . -= max(metrics[idx + 3], 0) + + longest = max(longest, . + first_line) + . = 0 + first_line = 0 + idx = 0 + continue + + idx = (character - start) * 3 + if(idx <= 0 || idx >= metrics.len) + idx = (default_character - start) * 3 + + if(!. && !(flags & INCLUDE_AC)) + . -= metrics[idx + 1] + . += metrics[idx + 1] + metrics[idx + 2] + metrics[idx +3] + + if(. && idx && !(flags & INCLUDE_AC)) + . -= max(metrics[idx + 3], 0) + + . = max(. + first_line, longest) + if(. > 0) + . += overhang diff --git a/interface/fonts/grand_9k.dm b/interface/fonts/grand_9k.dm new file mode 100644 index 00000000000..7993d307bcb --- /dev/null +++ b/interface/fonts/grand_9k.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 6: 6pt 12pt 18pt 24pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 6pt = 8px, 12pt = 16px etc. + +/// Base font +/datum/font/grand9k + name = "Grand9K Pixel" + font_family = 'interface/fonts/Grand9K_Pixel.ttf' + +/// For icon overlays +/// Grand9K 6pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/grand9k/size_6pt + name = "Grand9K Pixel 6pt" + height = 12 + ascent = 10 + descent = 2 + average_width = 4 + max_width = 9 + overhang = 0 + in_leading = 4 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 0, 5, 1, // char 30 + 0, 5, 1, // char 31 + 0, 1, 1, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 6, 1, // char 35 + 0, 5, 1, // char 36 + 0, 7, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 3, 1, // char 40 + 0, 3, 1, // char 41 + 0, 5, 1, // char 42 + 0, 5, 1, // char 43 + 0, 1, 1, // char 44 + 0, 4, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 5, 1, // char 48 + 0, 2, 1, // char 49 + 0, 5, 1, // char 50 + 0, 4, 1, // char 51 + 0, 5, 1, // char 52 + 0, 5, 1, // char 53 + 0, 5, 1, // char 54 + 0, 5, 1, // char 55 + 0, 5, 1, // char 56 + 0, 5, 1, // char 57 + 0, 1, 1, // char 58 + 0, 1, 1, // char 59 + 0, 4, 1, // char 60 + 0, 4, 1, // char 61 + 0, 4, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 5, 1, // char 65 + 0, 5, 1, // char 66 + 0, 4, 1, // char 67 + 0, 5, 1, // char 68 + 0, 4, 1, // char 69 + 0, 4, 1, // char 70 + 0, 5, 1, // char 71 + 0, 5, 1, // char 72 + 0, 1, 1, // char 73 + 0, 5, 1, // char 74 + 0, 5, 1, // char 75 + 0, 5, 1, // char 76 + 0, 5, 1, // char 77 + 0, 5, 1, // char 78 + 0, 5, 1, // char 79 + 0, 5, 1, // char 80 + 0, 6, 1, // char 81 + 0, 5, 1, // char 82 + 0, 5, 1, // char 83 + 0, 5, 1, // char 84 + 0, 5, 1, // char 85 + 0, 5, 1, // char 86 + 0, 5, 1, // char 87 + 0, 5, 1, // char 88 + 0, 5, 1, // char 89 + 0, 5, 1, // char 90 + 0, 3, 1, // char 91 + 0, 3, 1, // char 92 + 0, 3, 1, // char 93 + 0, 5, 1, // char 94 + 0, 4, 0, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 4, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 3, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 4, 1, // char 114 + 0, 4, 1, // char 115 + 0, 4, 1, // char 116 + 0, 4, 1, // char 117 + 0, 5, 1, // char 118 + 0, 5, 1, // char 119 + 0, 5, 1, // char 120 + 0, 4, 1, // char 121 + 0, 5, 1, // char 122 + 0, 4, 1, // char 123 + 0, 1, 1, // char 124 + 0, 4, 1, // char 125 + 0, 6, 1, // char 126 + 0, 5, 1, // char 127 + 0, 5, 1, // char 128 + 0, 5, 1, // char 129 + 0, 1, 1, // char 130 + 0, 5, 1, // char 131 + 0, 3, 1, // char 132 + 0, 5, 1, // char 133 + 0, 5, 1, // char 134 + 0, 5, 1, // char 135 + 0, 5, 1, // char 136 + 0, 5, 1, // char 137 + 0, 5, 1, // char 138 + 0, 3, 1, // char 139 + 0, 6, 1, // char 140 + 0, 5, 1, // char 141 + 0, 5, 1, // char 142 + 0, 5, 1, // char 143 + 0, 5, 1, // char 144 + 0, 1, 1, // char 145 + 0, 1, 1, // char 146 + 0, 3, 1, // char 147 + 0, 3, 1, // char 148 + 0, 1, 1, // char 149 + 0, 5, 1, // char 150 + 0, 5, 1, // char 151 + 0, 5, 1, // char 152 + 0, 8, 1, // char 153 + 0, 4, 1, // char 154 + 0, 3, 1, // char 155 + 0, 5, 1, // char 156 + 0, 5, 1, // char 157 + 0, 5, 1, // char 158 + 0, 5, 1, // char 159 + 0, 1, 1, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 5, 1, // char 163 + 0, 5, 1, // char 164 + 0, 5, 1, // char 165 + 0, 1, 1, // char 166 + 0, 5, 1, // char 167 + 0, 3, 1, // char 168 + 0, 8, 1, // char 169 + 0, 5, 1, // char 170 + 0, 6, 1, // char 171 + 0, 4, 1, // char 172 + 0, 5, 1, // char 173 + 0, 8, 1, // char 174 + 0, 5, 1, // char 175 + 0, 3, 1, // char 176 + 0, 5, 1, // char 177 + 0, 5, 1, // char 178 + 0, 5, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 0, 1, 1, // char 183 + 0, 2, 1, // char 184 + 0, 5, 1, // char 185 + 0, 5, 1, // char 186 + 0, 6, 1, // char 187 + 0, 5, 1, // char 188 + 0, 5, 1, // char 189 + 0, 5, 1, // char 190 + 0, 4, 1, // char 191 + 0, 5, 1, // char 192 + 0, 5, 1, // char 193 + 0, 5, 1, // char 194 + 0, 6, 0, // char 195 + 0, 5, 1, // char 196 + 0, 5, 1, // char 197 + 0, 6, 1, // char 198 + 0, 4, 1, // char 199 + 0, 4, 1, // char 200 + 0, 4, 1, // char 201 + 0, 4, 1, // char 202 + 0, 4, 1, // char 203 + 1, 2, 0, // char 204 + 0, 2, 1, // char 205 + 0, 3, 0, // char 206 + 0, 3, 0, // char 207 + 0, 6, 1, // char 208 + 0, 6, 0, // char 209 + 0, 5, 1, // char 210 + 0, 5, 1, // char 211 + 0, 5, 1, // char 212 + 0, 6, 1, // char 213 + 0, 5, 1, // char 214 + 0, 5, 1, // char 215 + 0, 5, 1, // char 216 + 0, 5, 1, // char 217 + 0, 5, 1, // char 218 + 0, 5, 1, // char 219 + 0, 5, 1, // char 220 + 0, 5, 1, // char 221 + 0, 5, 1, // char 222 + 0, 5, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 5, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 1, 2, 0, // char 237 + 0, 3, 0, // char 238 + 0, 3, 0, // char 239 + 0, 5, 0, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 4, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/license.txt b/interface/fonts/license.txt new file mode 100644 index 00000000000..800b033f887 --- /dev/null +++ b/interface/fonts/license.txt @@ -0,0 +1,8 @@ +VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. +(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) + +Grand9K Pixel created by Jayvee Enaguas. Licensed under Creative Commons Attribution 4.0 International (CC BY 4.0) +(https://creativecommons.org/licenses/by/4.0/) (https://www.dafont.com/grand9k-pixel.font) + +Tiny Unicode created by Jakob Riedle/DuffsDevice. Website indicates free for commercial use. +(https://fontmeme.com/fonts/tiny-unicode-font/) diff --git a/interface/fonts/tiny_unicode.dm b/interface/fonts/tiny_unicode.dm new file mode 100644 index 00000000000..d6af265d518 --- /dev/null +++ b/interface/fonts/tiny_unicode.dm @@ -0,0 +1,253 @@ +/// For clean results on map, use only sizing pt, multiples of 12: 12pt 24pt 48pt etc. - Not for use with px sizing +/// Can be used in TGUI etc, px sizing is pt / 0.75. 12pt = 16px, 24pt = 32px etc. + +/// Base font +/datum/font/tiny_unicode + name = "TinyUnicode" + font_family = 'interface/fonts/TinyUnicode.ttf' + +/// For icon overlays +/// TinyUnicode 12pt metrics generated using Lummox's dmifontsplus (https://www.byond.com/developer/LummoxJR/DmiFontsPlus) +/// Note: these variable names have been changed, so you can't straight copy/paste from dmifontsplus.exe +/datum/font/tiny_unicode/size_12pt + name = "TinyUnicode 12pt" + height = 13 + ascent = 11 + descent = 2 + average_width = 5 + max_width = 11 + overhang = 0 + in_leading = -3 + ex_leading = 1 + default_character = 31 + start = 30 + end = 255 + metrics = list( + 1, 5, 0, // char 30 + 1, 5, 0, // char 31 + 0, 1, 4, // char 32 + 0, 1, 1, // char 33 + 0, 3, 1, // char 34 + 0, 5, 1, // char 35 + 0, 4, 1, // char 36 + 0, 3, 1, // char 37 + 0, 5, 1, // char 38 + 0, 1, 1, // char 39 + 0, 2, 1, // char 40 + 0, 2, 1, // char 41 + 0, 3, 1, // char 42 + 0, 3, 1, // char 43 + 0, 2, 1, // char 44 + 0, 3, 1, // char 45 + 0, 1, 1, // char 46 + 0, 3, 1, // char 47 + 0, 4, 1, // char 48 + 0, 2, 1, // char 49 + 0, 4, 1, // char 50 + 0, 4, 1, // char 51 + 0, 4, 1, // char 52 + 0, 4, 1, // char 53 + 0, 4, 1, // char 54 + 0, 4, 1, // char 55 + 0, 4, 1, // char 56 + 0, 4, 1, // char 57 + 0, 1, 1, // char 58 + 0, 2, 1, // char 59 + 0, 2, 1, // char 60 + 0, 4, 1, // char 61 + 0, 2, 1, // char 62 + 0, 4, 1, // char 63 + 0, 7, 1, // char 64 + 0, 4, 1, // char 65 + 0, 4, 1, // char 66 + 0, 3, 1, // char 67 + 0, 4, 1, // char 68 + 0, 3, 1, // char 69 + 0, 3, 1, // char 70 + 0, 4, 1, // char 71 + 0, 4, 1, // char 72 + 0, 3, 1, // char 73 + 0, 4, 1, // char 74 + 0, 4, 1, // char 75 + 0, 3, 1, // char 76 + 0, 5, 1, // char 77 + 0, 4, 1, // char 78 + 0, 4, 1, // char 79 + 0, 4, 1, // char 80 + 0, 4, 1, // char 81 + 0, 4, 1, // char 82 + 0, 4, 1, // char 83 + 0, 3, 1, // char 84 + 0, 4, 1, // char 85 + 0, 4, 1, // char 86 + 0, 5, 1, // char 87 + 0, 4, 1, // char 88 + 0, 4, 1, // char 89 + 0, 3, 1, // char 90 + 0, 2, 1, // char 91 + 0, 3, 1, // char 92 + 0, 2, 1, // char 93 + 0, 3, 1, // char 94 + 0, 5, 1, // char 95 + 0, 2, 1, // char 96 + 0, 4, 1, // char 97 + 0, 4, 1, // char 98 + 0, 3, 1, // char 99 + 0, 4, 1, // char 100 + 0, 4, 1, // char 101 + 0, 3, 1, // char 102 + 0, 4, 1, // char 103 + 0, 4, 1, // char 104 + 0, 1, 1, // char 105 + 0, 2, 1, // char 106 + 0, 4, 1, // char 107 + 0, 1, 1, // char 108 + 0, 5, 1, // char 109 + 0, 4, 1, // char 110 + 0, 4, 1, // char 111 + 0, 4, 1, // char 112 + 0, 4, 1, // char 113 + 0, 3, 1, // char 114 + 0, 4, 1, // char 115 + 0, 3, 1, // char 116 + 0, 4, 1, // char 117 + 0, 4, 1, // char 118 + 0, 5, 1, // char 119 + 0, 3, 1, // char 120 + 0, 4, 1, // char 121 + 0, 4, 1, // char 122 + 0, 3, 1, // char 123 + 0, 1, 1, // char 124 + 0, 3, 1, // char 125 + 0, 5, 1, // char 126 + 1, 5, 0, // char 127 + 0, 4, 1, // char 128 + 1, 5, 0, // char 129 + 1, 5, 0, // char 130 + 1, 5, 0, // char 131 + 1, 5, 0, // char 132 + 1, 5, 0, // char 133 + 1, 5, 0, // char 134 + 1, 5, 0, // char 135 + 1, 5, 0, // char 136 + 0, 5, 1, // char 137 + 1, 5, 0, // char 138 + 1, 5, 0, // char 139 + 0, 6, 1, // char 140 + 1, 5, 0, // char 141 + 1, 5, 0, // char 142 + 1, 5, 0, // char 143 + 1, 5, 0, // char 144 + 1, 5, 0, // char 145 + 1, 5, 0, // char 146 + 1, 5, 0, // char 147 + 1, 5, 0, // char 148 + 0, 2, 1, // char 149 + 1, 5, 0, // char 150 + 1, 5, 0, // char 151 + 1, 5, 0, // char 152 + 0, 4, 1, // char 153 + 1, 5, 0, // char 154 + 1, 5, 0, // char 155 + 1, 5, 0, // char 156 + 1, 5, 0, // char 157 + 1, 5, 0, // char 158 + 0, 4, 1, // char 159 + 1, 5, 0, // char 160 + 0, 1, 1, // char 161 + 0, 4, 1, // char 162 + 0, 4, 1, // char 163 + 0, 5, 1, // char 164 + 0, 3, 1, // char 165 + 0, 1, 1, // char 166 + 0, 4, 1, // char 167 + 0, 3, 1, // char 168 + 0, 2, 1, // char 169 + 0, 8, 1, // char 170 + 0, 4, 1, // char 171 + 0, 4, 1, // char 172 + 1, 5, 0, // char 173 + 0, 2, 1, // char 174 + 0, 4, 1, // char 175 + 0, 3, 1, // char 176 + 0, 3, 1, // char 177 + 0, 2, 1, // char 178 + 0, 2, 1, // char 179 + 0, 2, 1, // char 180 + 0, 4, 1, // char 181 + 0, 5, 1, // char 182 + 1, 1, 1, // char 183 + 0, 8, 1, // char 184 + 0, 2, 1, // char 185 + 0, 2, 1, // char 186 + 0, 4, 1, // char 187 + 0, 7, 1, // char 188 + 0, 8, 1, // char 189 + 0, 8, 1, // char 190 + 0, 4, 1, // char 191 + 0, 4, 1, // char 192 + 0, 4, 1, // char 193 + 0, 4, 1, // char 194 + 0, 4, 1, // char 195 + 0, 4, 1, // char 196 + 0, 4, 1, // char 197 + 0, 6, 1, // char 198 + 0, 3, 1, // char 199 + 0, 3, 1, // char 200 + 0, 3, 1, // char 201 + 0, 3, 1, // char 202 + 0, 3, 1, // char 203 + 0, 3, 1, // char 204 + 0, 3, 1, // char 205 + 0, 3, 1, // char 206 + 0, 3, 1, // char 207 + 0, 10, 1, // char 208 + 0, 4, 1, // char 209 + 0, 4, 1, // char 210 + 0, 4, 1, // char 211 + 0, 4, 1, // char 212 + 0, 4, 1, // char 213 + 0, 4, 1, // char 214 + 0, 3, 1, // char 215 + 0, 5, 1, // char 216 + 0, 4, 1, // char 217 + 0, 4, 1, // char 218 + 0, 4, 1, // char 219 + 0, 4, 1, // char 220 + 0, 4, 1, // char 221 + 0, 3, 1, // char 222 + 0, 3, 1, // char 223 + 0, 4, 1, // char 224 + 0, 4, 1, // char 225 + 0, 4, 1, // char 226 + 0, 4, 1, // char 227 + 0, 4, 1, // char 228 + 0, 4, 1, // char 229 + 0, 7, 1, // char 230 + 0, 3, 1, // char 231 + 0, 4, 1, // char 232 + 0, 4, 1, // char 233 + 0, 4, 1, // char 234 + 0, 4, 1, // char 235 + 0, 2, 1, // char 236 + 0, 2, 1, // char 237 + 0, 3, 1, // char 238 + 0, 3, 1, // char 239 + 0, 5, 1, // char 240 + 0, 4, 1, // char 241 + 0, 4, 1, // char 242 + 0, 4, 1, // char 243 + 0, 4, 1, // char 244 + 0, 4, 1, // char 245 + 0, 4, 1, // char 246 + 0, 5, 1, // char 247 + 0, 4, 1, // char 248 + 0, 4, 1, // char 249 + 0, 4, 1, // char 250 + 0, 4, 1, // char 251 + 0, 4, 1, // char 252 + 0, 4, 1, // char 253 + 0, 10, 1, // char 254 + 0, 4, 1, // char 255 + 226 + ) diff --git a/interface/fonts/vcr_osd_mono.dm b/interface/fonts/vcr_osd_mono.dm new file mode 100644 index 00000000000..301d90d2f7e --- /dev/null +++ b/interface/fonts/vcr_osd_mono.dm @@ -0,0 +1,3 @@ +/datum/font/vcr_osd_mono + name = "VCR OSD Mono" + font_family = 'interface/fonts/VCR_OSD_Mono.ttf' diff --git a/interface/license.txt b/interface/license.txt deleted file mode 100644 index 5f74403c50a..00000000000 --- a/interface/license.txt +++ /dev/null @@ -1,2 +0,0 @@ -VCR OSD Mono created by Riciery Leal/mrmanet. Website indicates 100% free, author confirms it's free for all to use. -(https://www.dafont.com/font-comment.php?file=vcr_osd_mono) diff --git a/interface/skin.dmf b/interface/skin.dmf index f0e5881b0bd..5a465bd12e9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -111,12 +111,12 @@ window "mapwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - font-family = "Arial" - font-size = 7 + font-family = "Grand9K Pixel" + font-size = 6pt is-default = true right-click = true saved-params = "zoom;letterbox;zoom-mode" - style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }" + style = ".center { text-align: center; } .maptext { font-family: 'Grand9K Pixel'; font-size: 6pt; -dm-text-outline: 1px black; color: white; line-height: 1.0; } .command_headset { font-weight: bold; } .small { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; } .big { font-size: 8pt; } .reallybig { font-size: 8pt; } .extremelybig { font-size: 8pt; } .greentext { color: #00FF00; font-size: 6pt; } .redtext { color: #FF0000; font-size: 6pt; } .clown { color: #FF69BF; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; }" elem "title_browser" type = BROWSER pos = 0,0 @@ -128,6 +128,7 @@ window "mapwindow" is-disabled = true saved-params = "" auto-format = false + style = ".center { text-align: center; } .maptext { font-family: 'Grand9K Pixel'; font-size: 6pt; -dm-text-outline: 1px black; color: white; line-height: 1.0; } .command_headset { font-weight: bold; } .small { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; } .big { font-size: 8pt; } .reallybig { font-size: 8pt; } .extremelybig { font-size: 8pt; } .greentext { color: #00FF00; font-size: 6pt; } .redtext { color: #FF0000; font-size: 6pt; } .clown { color: #FF69BF; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-family: 'TinyUnicode'; font-size: 12pt; line-height: 0.75; }" elem "status_bar" type = LABEL pos = 0,464 diff --git a/lua/SS13.lua b/lua/SS13.lua index d9c208edfeb..088d15e471d 100644 --- a/lua/SS13.lua +++ b/lua/SS13.lua @@ -80,7 +80,7 @@ function SS13.register_signal(datum, signal, func, make_easy_clear_function) } end if signal == "parent_qdeleting" then --We want to make sure that the cleanup function is the very last signal handler called. - local comp_lookup = datum.vars.comp_lookup + local comp_lookup = datum.vars._listen_lookup if comp_lookup then local lookup_for_signal = comp_lookup.entries.parent_qdeleting if lookup_for_signal and not SS13.istype(lookup_for_signal, "/datum") then diff --git a/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm b/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm new file mode 100644 index 00000000000..6090b958ab3 --- /dev/null +++ b/modular_skyrat/master_files/code/datums/mood_events/generic_negative_events.dm @@ -0,0 +1,20 @@ +// Species trait debuffs +/datum/mood_event/dry_skin + description = "My skin feels awfully dry...\n" + mood_change = -2 + +// Surgery mood debuffs +/datum/mood_event/mild_surgery + description = "Even if I couldn't feel most of it, it feels wrong being awake while somebody works on your body. Ugh!\n" + mood_change = -1 + timeout = 5 MINUTES + +/datum/mood_event/severe_surgery + description = "Wait, THEY CUT ME OPEN - AND I FELT EVERY SECOND OF IT!\n" + mood_change = -4 + timeout = 15 MINUTES + +/datum/mood_event/robot_surgery + description = "Having my robotic parts messed with while I was conscious felt wrong... if only I had a sleep mode!\n" + mood_change = -4 + timeout = 10 MINUTES diff --git a/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm b/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm index cbe17f639b4..793371eff89 100644 --- a/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm +++ b/modular_skyrat/master_files/code/game/objects/items/encryptionkey.dm @@ -65,6 +65,11 @@ desc = "An encryption key that automatically encodes Siik'tajr heard through the radio into common." translated_language = /datum/language/siiktajr +/obj/item/encryptionkey/translation/akula + name = "\improper Te Velu Akko translation key" + desc = "An encryption key that automatically encodes Te Velu Akko heard through the radio into common." + translated_language = /datum/language/akulan + /obj/item/encryptionkey/translation/terrum name = "\improper Terrum translation key" desc = "An encryption key that automatically encodes Terrum heard through the radio into common." diff --git a/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm b/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm new file mode 100644 index 00000000000..9dc58d6fa67 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm @@ -0,0 +1,8 @@ +/datum/market_item/weapon/mosin_pro + name = "FTU 'Archangel' Precision Rifle Stock" + desc = "Sure, it doesn't come with any of the actual bits that go bang, but who's gonna be laughing when you spook 'em with three more rounds?" + item = /obj/item/crafting_conversion_kit/mosin_pro + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 4 + stock_max = 3 + availability_prob = 80 diff --git a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm index 6131207c689..04b766e9455 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm @@ -803,3 +803,69 @@ relevant_mutant_bodypart = "neck_acc" type_to_check = /datum/preference/toggle/mutant_toggle/neck_acc +/datum/preference/choiced/mutant_choice/pod_hair + savefile_key = "feature_pod_hair" + main_feature_name = "Hairstyle" + category = PREFERENCE_CATEGORY_FEATURES + relevant_mutant_bodypart = "pod_hair" + default_accessory_type = /datum/sprite_accessory/pod_hair/ivy + should_generate_icons = TRUE + generate_icons = TRUE + +/datum/preference/choiced/mutant_choice/pod_hair/init_possible_values() + var/list/values = list() + + var/icon/pod_head = icon('icons/mob/species/human/bodyparts_greyscale.dmi', "pod_head_m") + pod_head.Blend(COLOR_GREEN, ICON_MULTIPLY) + + for (var/pod_name in GLOB.pod_hair_list) + var/datum/sprite_accessory/pod_hair/pod_hair = GLOB.pod_hair_list[pod_name] + if(pod_hair.locked) + continue + + var/icon/icon_with_hair = new(pod_head) + var/icon/icon_adj = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_ADJ") + var/icon/icon_front = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_FRONT_OVER") + icon_front.Blend(COLOR_MAGENTA, ICON_MULTIPLY) + icon_adj.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) + icon_adj.Blend(icon_front, ICON_OVERLAY) + icon_with_hair.Blend(icon_adj, ICON_OVERLAY) + icon_with_hair.Scale(64, 64) + icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31) + + values[pod_hair.name] = icon_with_hair + + return values + +/datum/preference/choiced/mutant_choice/pod_hair/is_part_enabled(datum/preferences/preferences) + return TRUE + +/datum/preference/choiced/mutant_choice/pod_hair/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + var/species_path = preferences?.read_preference(/datum/preference/choiced/species) + if(!ispath(species_path, /datum/species/pod)) // This is what we do so it doesn't show up on non-podpeople. + return + + return ..() + +/datum/preference/choiced/mutant_choice/pod_hair/compile_constant_data() + var/list/data = ..() + + data[SUPPLEMENTAL_FEATURE_KEY] = "pod_hair_color" + + return data + +/datum/preference/tri_color/pod_hair_color + category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "pod_hair_color" + relevant_mutant_bodypart = "pod_hair" + type_to_check = /datum/preference/choiced/mutant_choice/pod_hair + +/datum/preference/toggle/emissive/pod_hair_emissive + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "pod_hair_emissive" + relevant_mutant_bodypart = "pod_hair" + // This makes it so that it appears only when we have pod hair or allow mismatched parts. + check_mode = TRICOLOR_CHECK_ACCESSORY + type_to_check = /datum/preference/choiced/mutant_choice/pod_hair diff --git a/modular_skyrat/master_files/code/modules/client/preferences/species_features/pod.dm b/modular_skyrat/master_files/code/modules/client/preferences/species_features/pod.dm deleted file mode 100644 index 965aada17ad..00000000000 --- a/modular_skyrat/master_files/code/modules/client/preferences/species_features/pod.dm +++ /dev/null @@ -1,12 +0,0 @@ -/datum/preference/choiced/pod_hair - relevant_mutant_bodypart = "pod_hair" - -/datum/preference/choiced/pod_hair/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) - var/species_path = preferences?.read_preference(/datum/preference/choiced/species) - if(!ispath(species_path, /datum/species/pod)) // This is what we do so it doesn't show up on non-podpeople. - return - - if(!target.dna.mutant_bodyparts["pod_hair"]) - target.dna.mutant_bodyparts["pod_hair"] = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE, FALSE, FALSE)) - - target.dna.mutant_bodyparts["pod_hair"][MUTANT_INDEX_NAME] = value diff --git a/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm b/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm new file mode 100644 index 00000000000..b763c0fa076 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/head/akula_official.dm @@ -0,0 +1,20 @@ +/obj/item/clothing/head/hats/caphat/azulean + icon_state = "oldbloodcap" + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi' + +/obj/item/clothing/head/hats/caphat/azulean/old_blood + name = "\improper Oldblood's royal cap" + desc = "A peaked cap typically seen on nobles and high-rankers of the Agurkrral Royal Navy, this service hat has a long history in the Old Principalities. \ + Comfortable and lightweight, the purpose of this cap has gradually shifted to becoming yet another method to flex rank. \n\n\ + Threaded gold is often seen in the campaign cords attached to it, and the emblems on them grow more and more complex based on ranking; \ + and of course, importance to the King." + icon_state = "oldbloodcap" + +/obj/item/clothing/head/hats/caphat/azulean/upstart + name = "\improper Upstart's noble cap" + desc = "A peaked cap widely seen across the New Principalities. \n\ + Combining ideas from both the NRI and the Old Principalities, this cloneleather cap was made to be both inexpensive and easier to maintain than the elaborate headpieces worn by the older nobility. \ + Border princes of all make and model are known to put their own personal emblems on these instead of any coherent ranking system, \ + and the cap features a wider brim in order to shield Azulean eyes from the alien suns they intend to grasp." + icon_state = "upstartcap" diff --git a/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm new file mode 100644 index 00000000000..ebbabeea7a4 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/suits/skinsuits.dm @@ -0,0 +1,82 @@ +/// A space-worthy skinsuit to be combined with the skinsuit armor +/obj/item/clothing/under/skinsuit + name = "\improper Voidcrosser stardress" + desc = "The 'Voidcrosser'-pattern Stardress is a long-standing template upon which most Azulean spacesuits are made. \n\ + This EVA suit is a single skintight garment, designed for flexibility and maneuverability while using jetpacks or any sort of thruster; \ + Azuleans preferring to use more familiar swimming motions than most EVA workers. The 'Voidcrosser' applies similar technologies to traditional Shoredresses, \ + utilizing high-tech fabrics and water pumps to exert pressure over the Azulean's body. \n\n\ + An attached Shoredress helm is often used in conjunction with a third-party oxygen supply to allow one to breathe, \ + and open pores in the suit allow the body to be cooled by the perspiration of internal water. \n\ + These suits are reputable among orbital workers for having very little interference with movement, and easy storage by simply folding them inside of any bubble-shaped helmet." + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' + icon_state = "skinsuit" + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + armor_type = /datum/armor/wetsuit_under + cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF + resistance_flags = NONE + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/skinsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + +/obj/item/clothing/under/skinsuit/Destroy() + . = ..() + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/head/helmet/space/skinsuit_helmet + name = "\improper Stardress helm" + desc = "A reinforced type of 'Glass' often used particularly by Azulean boarding teams, this offshoot of the ones seen in Shoredresses is built to last. \n\ + These make use of laminated glass rather than the typical 'flexiglass' of civilian models, allowing them not only durability, but to hold together when a shatter does occur; \ + and for what remains to stay in the frame. These are typically made of up to four layers of the stuff, working unintentionally to ensure the faces of their wearers are difficult to identify. \n\n\ + In addition, the interlayer gives the helms sound insulation properties, and the ability to block UV radiation. \ + These helmets are known for being distinctly uncomfortable in comparison to their civilian counterparts; cramped and with only the most barebones climate control tech." + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi' + icon_state = "skinsuithelmet" + +/obj/item/clothing/head/helmet/space/skinsuit_helmet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + +/obj/item/clothing/head/helmet/space/skinsuit_helmet/Destroy() + . = ..() + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/suit/armor/riot/skinsuit_armor + name = "\improper Shorebreaker plating" + desc = "'Shorebreaker'-pattern Stardress plating was developed for Azulean boarding teams in service of the New Principalities. \ + Kept resilient and maneuverable, Shorebreaker armor is built predominantly close-quarters breaching. \n\n\ + Having sparse plating around the wearer's arms and legs, boarding teams are encouraged after their pod lands to do one thing: \ + make use of their rapid movement, and render their enemies past tense. The armor is relatively hardy against ranged weapons, \ + but the alloys involved are primarily constructed around resisting strikes from boarding axes, lances, and other common pirate-repellant weapons." + icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi' + icon_state = "skinsuitarmor" + base_icon_state = "skinsuitarmor" + + +/obj/item/clothing/suit/armor/riot/skinsuit_armor/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_ICLOTHING) + return + + check_tail(user) + update_appearance() + +/obj/item/clothing/suit/armor/riot/skinsuit_armor/dropped(mob/user) + . = ..() + check_tail(user) + update_appearance() + +/// Pick an icon_state that matches nicer with tails if one is found on the wearer +/obj/item/clothing/suit/armor/riot/skinsuit_armor/proc/check_tail(mob/living/carbon/human/user) + icon_state = base_icon_state + if(!user.dna.species.mutant_bodyparts["tail"]) + return + + icon_state = "skinsuitarmor_cutback" diff --git a/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm new file mode 100644 index 00000000000..370e51ff457 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/under/akula_jobs.dm @@ -0,0 +1,284 @@ +/// The DMI containing the tail overlay sprites +#define TAIL_OVERLAY_DMI 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' +/// The proper layer to render the tail overlays onto +#define TAIL_OVERLAY_LAYER 5.9 + +/obj/item/clothing/under/akula_wetsuit + name = "Shoredress wetsuit" + desc = "The 'Wetworks'-pattern Shoredress is a long-standing template upon which most Azulean 'wetsuits' are made. \ + This atmospheric exploration suit is a single form-fitting garment, designed to keep wearers comfortable in the harsh environment of dry land; \ + even sometimes worn underneath orbital suits such as MODs. \n\n\ + Shoredresses apply active thermal channels and motion-powered micropumps to allow for water of the wearer's temperature choice to circulate; \ + ensuring ample flow over not only the gills, but the rest of the wearer's skin, at the cost of occasional movement being needed when the wearer is still. \n\ + These suits are known to come with luminescent panels that take on a bright glow when underwater, meant for signalling as well as higher visibility in deep waters. \ + The system is meant to only be able to process water, fresh or otherwise; but unofficially, \ + a great many chemicals or even drinks have been loaded in by adventurous or careless explorers of the New Principalities-- at fantastic personal risk to their gills. " + icon_state = "default" + base_icon_state = "default" + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi' + armor_type = /datum/armor/wetsuit_under + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + can_adjust = FALSE + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + /// If an akula tail accessory is present, we can overlay an additional icon + var/tail_overlay + + +/obj/item/clothing/under/akula_wetsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + update_appearance() + +/obj/item/clothing/under/akula_wetsuit/Destroy() + . = ..() + var/mob/user = loc + if(!istype(user)) + return + + if(tail_overlay) + user.cut_overlay(tail_overlay) + tail_overlay = null + + qdel(GetComponent(/datum/component/wetsuit)) + +/obj/item/clothing/under/akula_wetsuit/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_ICLOTHING) + return + + check_physique(user) + add_tail_overlay(user) + update_appearance() + +/obj/item/clothing/under/akula_wetsuit/dropped(mob/user) + . = ..() + if(tail_overlay) + user.cut_overlay(tail_overlay) + tail_overlay = null + + update_appearance() + +/// This will check the wearer's bodytype and change the wetsuit worn sprite according to if its male/female +/obj/item/clothing/under/akula_wetsuit/proc/check_physique(mob/living/carbon/human/user) + icon_state = base_icon_state + if(user.physique == FEMALE) + icon_state = "[icon_state]_f" + return TRUE + +/// If the wearer has a compatible tail for the `tail_overlay` variable, render it +/obj/item/clothing/under/akula_wetsuit/proc/add_tail_overlay(mob/living/carbon/human/user) + if(!user.dna.species.mutant_bodyparts["tail"]) + return + + var/tail = user.dna.species.mutant_bodyparts["tail"][MUTANT_INDEX_NAME] + switch(tail) + if("Akula") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_akula", -(TAIL_OVERLAY_LAYER)) + if("Shark") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_shark", -(TAIL_OVERLAY_LAYER)) + if("Shark (No Fin)") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_shark_no_fin", -(TAIL_OVERLAY_LAYER)) + if("Fish") + tail_overlay = mutable_appearance(TAIL_OVERLAY_DMI, "overlay_fish", -(TAIL_OVERLAY_LAYER)) + else + tail_overlay = null + + if(tail_overlay) + user.add_overlay(tail_overlay) + + /// Suit armor +/datum/armor/wetsuit_under + bio = 10 + wound = 5 + +/obj/item/clothing/under/akula_wetsuit/job + /// Our large examine text + var/extended_desc = "The 'Wetworks'-pattern Shoredress is a long-standing template upon which most Azulean 'wetsuits' are made. \ + This atmospheric exploration suit is a single form-fitting garment, designed to keep wearers comfortable in the harsh environment of dry land; \ + even sometimes worn underneath orbital suits such as MODs. \n\n\ + Shoredresses apply active thermal channels and motion-powered micropumps to allow for water of the wearer's temperature choice to circulate; \ + ensuring ample flow over not only the gills, but the rest of the wearer's skin, at the cost of occasional movement being needed when the wearer is still. \n\ + These suits are known to come with luminescent panels that take on a bright glow when underwater, meant for signalling as well as higher visibility in deep waters. \ + The system is meant to only be able to process water, fresh or otherwise; but unofficially, \ + a great many chemicals or even drinks have been loaded in by adventurous or careless explorers of the New Principalities-- at fantastic personal risk to their gills." + +/obj/item/clothing/under/akula_wetsuit/job/examine(mob/user) + . = ..() + . += span_notice("This item could be examined further...") + +/obj/item/clothing/under/akula_wetsuit/job/examine_more(mob/user) + . = ..() + . += extended_desc + +/obj/item/clothing/under/akula_wetsuit/job/engineering + name = "engineer Shoredress wetsuit" + desc = "The 'Engineering'-Type Shoredress is a ubiquitous model used by a wide variety of companies, only hardly changed from its' original Azulean design. \n\ + The luminescent panels on the arms have been given higher flow of power for greater visibility, and the entire suit has been focused \ + first and foremost on the incorporation of heat-resistant alloys and skintight heatsinks to protect against fires. \n\ + Additionally, the materials used to construct this wetsuit have rendered it extremely hardy against corrosive liquids and gasses." + icon_state = "engi" + base_icon_state = "engi" + armor_type = /datum/armor/wetsuit_under/engineering + +/datum/armor/wetsuit_under/engineering + fire = 95 + acid = 95 + +/obj/item/clothing/under/akula_wetsuit/job/cargo + name = "cargo Shoredress wetsuit" + desc = "The 'Cargo'-Type Shoredress was made as a partnership between the Free Trade Union and the New Principalities of Agurkrral, predominantly \ + designed for comfort. \n\ + Warehouse workers on land and sea are treated to low-powered actuators meant to help distribute heavy loads when lifting, \ + and the plush interior of 'Medical'-Type Shoredresses has been expanded on three times over to ensure maximum cushioning for the wearer's body. \n\n\ + Systems around the neck are capable of slightly flavoring any Shoredress Glasses with over five hundred different choices, \ + and the temperature-control pumps are some of the best available to those that aren't royalty." + icon_state = "cargo" + base_icon_state = "cargo" + armor_type = /datum/armor/wetsuit_under/cargo + +/datum/armor/wetsuit_under/cargo + fire = 40 + +/obj/item/clothing/under/akula_wetsuit/job/science + name = "science Shoredress wetsuit" + desc = "The 'Science'-Type Shoredress is yet another model commissioned by NanoTrasen. This suit has been adapted from 'Ordnance'-Type Shoredresses \ + used in the New Principalities predominantly by mining teams. \n\ + It is made of a special polymer that provides some minor protection against explosives \ + such as abandoned naval or land-based mines, and features an inbuilt external sterilization field to protect against biohazards typically found in strange places." + icon_state = "sci" + base_icon_state = "sci" + armor_type = /datum/armor/wetsuit_under/science + +/datum/armor/wetsuit_under/science + bomb = 40 + acid = 95 + +/obj/item/clothing/under/akula_wetsuit/job/medical + name = "medical Shoredress wetsuit" + desc = "The 'Medical'-Type Shoredress is yet another model commissioned by NanoTrasen. This suit has been adapted from exploration \ + Shoredresses meant for use in murky or even outright toxic environments, being predominantly composed of self-sterilizing polymers with \ + a system able to filter out all sorts of hazardous particles in the air or water including fumes, smoke, allergens, or ocean-bound toxins. \n\ + This has made it convenient for the Company's medical division, let alone the plush interior to allow for greater comfortable standing hours." + icon_state = "medical" + base_icon_state = "medical" + armor_type = /datum/armor/wetsuit_under/medical + +/datum/armor/wetsuit_under/medical + acid = 95 + bio = 95 + +/obj/item/clothing/under/akula_wetsuit/job/security + name = "security Shoredress wetsuit" + desc = "The 'Security'-Type Shoredress is a model commissioned by Lopland; but the origins of this wetsuit lie in designs belonging to \ + rank-and-file warriors and fighters in the New Principalities. Designed to be protective over comfortable, these suits are no true \ + replacement for true armor, but make an excellent undersuit for even civilian plate carriers. \n\ + The systems inside have been reinforced to their logical endpoint, though their temperatures -- much like the attitude of their wearers, tends to run a bit hot due to a possible manufacturing defect." + icon_state = "sec" + base_icon_state = "sec" + armor_type = /datum/armor/rank_security + +/obj/item/clothing/under/akula_wetsuit/job/command + name = "command Shoredress wetsuit" + desc = "The 'Command'-Type Shoredress is yet another model commissioned by NanoTrasen; but the origins of this wetsuit lie in designs belonging to, \ + typically, high-ranking officials and managers in the Old Principalities. \n\ + The bright luminescent panels on the arms have been further set apart by similar paneling on the chest, meant to ensure the wearer looks distinct both in the water, on land, and even on camera. \n\ + The temperature systems have been upgraded, as well as the choice to use more comfortable fabrics in the construction." + icon_state = "command" + base_icon_state = "command" + + +/obj/item/clothing/head/helmet/space/akula_wetsuit + name = "\improper Shoredress helm" + desc = "Known simply as a 'Glass' throughout Azulean society as a whole, these spheroidal helmets are often the main source of comfort for workers on land; domestic and abroad. \ + More advanced than humans would ever give them credit for, a Shoredress's Glass is a piece of technology unto itself. \n\n\ + These helmets employ a near-invisible system of cameras and sensors to prevent refraction from the water kept inside. \ + The 'flexiglass' glass comprising the unit is chemically strengthened to be thin, light, and damage-resistant, but capable of bending even in half without shattering; all to allow you to touch your face. \n\ + Some have taken to putting electronic displays around the face to help express emotion, or to signal nonverbally. \ + These helms are normally attached to Shoredresses or Stardresses, but comes with a fitted neoprene collar to allow wear on essentially anything." + icon = 'modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi' + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT | HEADINTERNALS + icon_state = "helmet" + inhand_icon_state = "helmet" + strip_delay = 6 SECONDS + armor_type = /datum/armor/wetsuit_helmet + resistance_flags = FIRE_PROOF + /// Variable for storing hats which are worn inside the bubble helmet + var/obj/item/clothing/head/attached_hat + flags_inv = null + flags_cover = HEADCOVERSMOUTH | PEPPERPROOF + + /// Helmet armor +/datum/armor/wetsuit_helmet + bio = 100 + fire = 100 + +/obj/item/clothing/head/helmet/space/akula_wetsuit/Initialize(mapload) + . = ..() + AddComponent(/datum/component/wetsuit) + update_appearance() + +/obj/item/clothing/head/helmet/space/akula_wetsuit/Destroy() + . = ..() + var/mob/user = loc + if(attached_hat) + attached_hat.forceMove(drop_location()) + + if(!istype(user)) + return + + qdel(GetComponent(/datum/component/wetsuit)) + +// Wearing hats inside the wetworks helmet +/obj/item/clothing/head/helmet/space/akula_wetsuit/examine() + . = ..() + if(attached_hat) + . += span_notice("There's [attached_hat] placed in the helmet.") + . += span_bold("Right-click to remove it.") + else + . += span_notice("There's nothing placed in the helmet.") + +/obj/item/clothing/head/helmet/space/akula_wetsuit/attackby(obj/item/hitting_item, mob/living/user) + . = ..() + if(!istype(hitting_item, /obj/item/clothing/head)) + return + var/obj/item/clothing/hitting_hat = hitting_item + if(hitting_hat.clothing_flags & PLASMAMAN_HELMET_EXEMPT) + balloon_alert(user, "doesn't fit!") + return + if(attached_hat) + balloon_alert(user, "already something inside!") + return + + attached_hat = hitting_hat + balloon_alert(user, "[hitting_hat] put inside") + hitting_hat.forceMove(src) + icon_state = "empty" + update_appearance() + +/obj/item/clothing/head/helmet/space/akula_wetsuit/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!attached_hat || isinhands) + return + + var/mutable_appearance/attached_hat_appearance = mutable_appearance(attached_hat.worn_icon, attached_hat.icon_state, -(HEAD_LAYER-0.1)) + attached_hat_appearance.add_overlay(mutable_appearance(worn_icon, "helmet", -HEAD_LAYER)) + . += attached_hat_appearance + + +/obj/item/clothing/head/helmet/space/akula_wetsuit/attack_hand_secondary(mob/user) + ..() + if(!attached_hat) + return + + user.put_in_active_hand(attached_hat) + balloon_alert(user, "[attached_hat] removed") + attached_hat = null + icon_state = "helmet" + update_appearance() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +#undef TAIL_OVERLAY_DMI +#undef TAIL_OVERLAY_LAYER diff --git a/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm b/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm new file mode 100644 index 00000000000..faaba2f476b --- /dev/null +++ b/modular_skyrat/master_files/code/modules/clothing/under/akula_official.dm @@ -0,0 +1,35 @@ +/obj/item/clothing/under/rank/azulean + icon_state = "oldblood" + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi' + female_sprite_flags = NO_FEMALE_UNIFORM + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/under/rank/azulean/old_blood + name = "\improper Agurkrral Oldblood's royal regalia" + desc = "A service dress uniform of the Old Principalities of Agurkrral, a fashion shared by the majority of the nobility. \ + These outfits are known to normally be accessorized with gold trims and other rare metals, \ + constructed and treated specially for use in underwater environments; the dwellings of most of the crown's old guard. \n\n\ + Actual fish-leather is often used for the subtle pattern of scaling, and to ensure proper hydrodynamics while swimming. \ + Due to being constructed for comfort and flash rather than practicality, the technology used in Shoredresses to hydrate the wearer could not be implemented; \ + only a mount for a Shoredress's helm." + icon_state = "oldblood" + +/obj/item/clothing/under/rank/azulean/old_blood/skirt + name = "\improper Agurkrral Oldblood's royal regalia" + icon_state = "oldblood_skirt" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + +/obj/item/clothing/under/rank/azulean/upstart + name = "\improper Agurkrral Upstart's noble getup" + desc = "Patterned off the dress uniforms of the Old Principalities, this sort of style belongs to the border princes of the New Principalities. \ + These outfits rebuke tradition to incorporate the use of imported leather, using reinforced clasps instead of shiny golden buttons. \n\n\ + Few decorations are normally seen in these clothing, owing to the tendency of their wearers to 'gallivant.' \ + Due to being constructed for a degree of expendability, the technology used in Shoredresses to hydrate the wearer is \ + an extremely rare sight in these outfits; only the mount for a Shoredress's helm." + icon_state = "upstart" + +/obj/item/clothing/under/rank/azulean/upstart/skirt + name = "\improper Agurkrral Upstart's noble getup" + icon_state = "upstart_skirt" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm index 6340f10676f..c8fae95ee49 100644 --- a/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/_job.dm @@ -1,2 +1,5 @@ /datum/job + /// The job's outfit that will be assigned for Vox var/vox_outfit = null + /// The job's outfit that will be assigned for Akula + var/akula_outfit = null diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm new file mode 100644 index 00000000000..a5de93b45dc --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/_job_attire.dm @@ -0,0 +1,183 @@ +// For now its just Akulas +/datum/job/assistant + akula_outfit = /datum/outfit/akula/assistant + +/datum/job/atmospheric_technician + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/bartender + akula_outfit = /datum/outfit/akula + +/datum/job/botanist + akula_outfit = /datum/outfit/akula + +/datum/job/captain + akula_outfit = /datum/outfit/akula/command + +/datum/job/cargo_technician + akula_outfit = /datum/outfit/akula/cargo_technician + +/datum/job/chaplain + akula_outfit = /datum/outfit/akula + +/datum/job/chemist + akula_outfit = /datum/outfit/akula + +/datum/job/chief_engineer + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/chief_medical_officer + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/clown + akula_outfit = /datum/outfit/akula + +/datum/job/cook + akula_outfit = /datum/outfit/akula + +/datum/job/curator + akula_outfit = /datum/outfit/akula + +/datum/job/detective + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/geneticist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/head_of_personnel + akula_outfit = /datum/outfit/akula/command + +/datum/job/head_of_security + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/janitor + akula_outfit = /datum/outfit/akula + +/datum/job/lawyer + akula_outfit = /datum/outfit/akula + +/datum/job/doctor + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/mime + akula_outfit = /datum/outfit/akula + +/datum/job/paramedic + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/prisoner + akula_outfit = /datum/outfit/akula + +/datum/job/quartermaster + akula_outfit = /datum/outfit/akula/cargo_technician + +/datum/job/research_director + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/roboticist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/scientist + akula_outfit = /datum/outfit/akula/scientist + +/datum/job/security_officer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/shaft_miner + akula_outfit = /datum/outfit/akula + +/datum/job/station_engineer + akula_outfit = /datum/outfit/akula/station_engineer + +/datum/job/virologist + akula_outfit = /datum/outfit/akula/doctor + +/datum/job/warden + akula_outfit = /datum/outfit/akula/security_officer + +// Im not certain if having these matter +/datum/job/syndicate_cybersun_captain + akula_outfit = /datum/outfit/akula + +/datum/job/syndicate_cybersun + akula_outfit = /datum/outfit/akula + +/datum/job/battlecruiser_captain + akula_outfit = /datum/outfit/akula + +/datum/job/battlecruiser_crew + akula_outfit = /datum/outfit/akula + +/datum/job/hotel_staff + akula_outfit = /datum/outfit/akula + +/datum/job/escaped_prisoner + akula_outfit = /datum/outfit/akula + +/datum/job/space_syndicate + akula_outfit = /datum/outfit/akula + +/datum/job/space_bar_patron + akula_outfit = /datum/outfit/akula + +/datum/job/exile + akula_outfit = /datum/outfit/akula + +/datum/job/beach_bum + akula_outfit = /datum/outfit/akula + +/datum/job/hermit + akula_outfit = /datum/outfit/akula + +// Modular jobs +/datum/job/blueshield + akula_outfit = /datum/outfit/akula + +/datum/job/nanotrasen_consultant + akula_outfit = /datum/outfit/akula + +/datum/job/barber + akula_outfit = /datum/outfit/akula + +/datum/job/corrections_officer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/orderly + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/science_guard + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/customs_agent + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/bouncer + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/engineering_guard + akula_outfit = /datum/outfit/akula/security_officer + +/datum/job/fleetmaster + akula_outfit = /datum/outfit/akula + +/datum/job/operations_inspector + akula_outfit = /datum/outfit/akula + +/datum/job/deck_crew + akula_outfit = /datum/outfit/akula + +/datum/job/bridge_officer + akula_outfit = /datum/outfit/akula + +/datum/job/freighter_crew + akula_outfit = /datum/outfit/akula + +/datum/job/tarkon + akula_outfit = /datum/outfit/akula + +/datum/job/blackmarket + akula_outfit = /datum/outfit/akula + +/datum/job/ds2 + akula_outfit = /datum/outfit/akula + diff --git a/modular_skyrat/master_files/code/modules/language/language_holder.dm b/modular_skyrat/master_files/code/modules/language/language_holder.dm index 6e90b80ba54..cf85ac7bad1 100644 --- a/modular_skyrat/master_files/code/modules/language/language_holder.dm +++ b/modular_skyrat/master_files/code/modules/language/language_holder.dm @@ -83,7 +83,8 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/siiktajr = list(LANGUAGE_ATOM), - /datum/language/canilunzt = list(LANGUAGE_ATOM) + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM) ) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/uncommon = list(LANGUAGE_ATOM), @@ -110,6 +111,7 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language/terrum = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM), /datum/language/siiktajr = list(LANGUAGE_ATOM), - /datum/language/canilunzt = list(LANGUAGE_ATOM) + /datum/language/canilunzt = list(LANGUAGE_ATOM), + /datum/language/akulan = list(LANGUAGE_ATOM) ) diff --git a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm index a4fc43f6f36..e3c87270afc 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species.dm @@ -11,3 +11,22 @@ /// Adding a language type to this in the form of /datum/language will allow the language to be displayed in preferences for that species, even if it is a secret language. /// Currently used for ashtongue in ashwalkers. var/list/language_prefs_whitelist + ///Clothing offsets. If a species has a different body than other species, you can offset clothing so they look less weird. + var/list/offset_features = list( + OFFSET_UNIFORM = list(0,0), + OFFSET_ID = list(0,0), + OFFSET_GLOVES = list(0,0), + OFFSET_GLASSES = list(0,0), + OFFSET_EARS = list(0,0), + OFFSET_SHOES = list(0,0), + OFFSET_S_STORE = list(0,0), + OFFSET_FACEMASK = list(0,0), + OFFSET_HEAD = list(0,0), + OFFSET_FACE = list(0,0), + OFFSET_BELT = list(0,0), + OFFSET_BACK = list(0,0), + OFFSET_SUIT = list(0,0), + OFFSET_NECK = list(0,0), + OFFSET_ACCESSORY = list(0, 0), + OFFSET_HAIR = list(0, 0), + ) diff --git a/modular_skyrat/master_files/code/modules/reagents/chemistry/reagents.dm b/modular_skyrat/master_files/code/modules/reagents/chemistry/reagents.dm index 78ba1e196a1..00dfe2063f0 100644 --- a/modular_skyrat/master_files/code/modules/reagents/chemistry/reagents.dm +++ b/modular_skyrat/master_files/code/modules/reagents/chemistry/reagents.dm @@ -2,3 +2,6 @@ /// Modular version of `chemical_flags`, so we don't have to worry about /// it causing conflicts in the future. var/chemical_flags_skyrat = NONE + +/datum/reagent/drug/nicotine + addiction_types = list(/datum/addiction/nicotine = 4) // 1.6 per 2 seconds diff --git a/modular_skyrat/master_files/code/modules/reagents/withdrawal/generic_addictions.dm b/modular_skyrat/master_files/code/modules/reagents/withdrawal/generic_addictions.dm index 098f57e0d3a..ff6795a1d61 100644 --- a/modular_skyrat/master_files/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/modular_skyrat/master_files/code/modules/reagents/withdrawal/generic_addictions.dm @@ -1,47 +1,52 @@ +// Alters nicotine withdrawal /datum/addiction/nicotine name = "nicotine" - addiction_relief_treshold = 0.03 // This used to be 0.01. withdrawal_stage_messages = list("Feel like having a smoke...", "I really need a smoke now...", "I can't take it, I really need a smoke now!") medium_withdrawal_moodlet = /datum/mood_event/nicotine_withdrawal_moderate severe_withdrawal_moodlet = /datum/mood_event/nicotine_withdrawal_severe -/datum/addiction/nicotine/proc/trigger_random_side_effect(mob/living/carbon/affected_carbon, seconds_per_tick, strength) - switch(rand(1, 10)) - if(1 to 3) +/datum/addiction/nicotine/proc/trigger_random_side_effect(mob/living/carbon/affected_carbon, seconds_per_tick, strength = 1) + switch(rand(1, 4)) + if(1) if(!HAS_TRAIT(affected_carbon, TRAIT_NOHUNGER)) - affected_carbon.adjust_nutrition(-seconds_per_tick * 10 * strength) - if(3 to 5) - affected_carbon.emote("cough") - if(5 to 7) + affected_carbon.adjust_nutrition(-10 * REM * seconds_per_tick) + if(2) to_chat(affected_carbon, span_warning("Your head hurts.")) - affected_carbon.adjustStaminaLoss(4 * strength) - if(8) + affected_carbon.adjustStaminaLoss(50 * REM * seconds_per_tick) + if(3) if(strength >= 2) to_chat(affected_carbon, span_warning("You feel a little dizzy.")) affected_carbon.set_dizzy(strength * 6 SECONDS) - if(8 to 10) - to_chat(affected_carbon, span_warning("You feel tired.")) - affected_carbon.adjustStaminaLoss(6 * strength) + if(4) + if(strength >= 2) + to_chat(affected_carbon, span_warning("You feel tired.")) + affected_carbon.adjustStaminaLoss(75 * REM * seconds_per_tick) /datum/addiction/nicotine/withdrawal_enters_stage_1(mob/living/carbon/affected_carbon, seconds_per_tick) . = ..() - affected_carbon.set_jitter_if_lower(10 SECONDS) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[1]]")) /datum/addiction/nicotine/withdrawal_enters_stage_2(mob/living/carbon/affected_carbon, seconds_per_tick) . = ..() - affected_carbon.set_jitter_if_lower(20 SECONDS) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[2]]")) /datum/addiction/nicotine/withdrawal_enters_stage_3(mob/living/carbon/affected_carbon, seconds_per_tick) . = ..() - affected_carbon.set_jitter_if_lower(30 SECONDS) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[3]]")) + +/datum/addiction/nicotine/withdrawal_stage_1_process(mob/living/carbon/affected_carbon, seconds_per_tick) + if(SPT_PROB(0.3, seconds_per_tick)) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[1]]")) /datum/addiction/nicotine/withdrawal_stage_2_process(mob/living/carbon/affected_carbon, seconds_per_tick) - . = ..() - if(SPT_PROB(3, seconds_per_tick)) + if(SPT_PROB(0.5, seconds_per_tick)) trigger_random_side_effect(affected_carbon, seconds_per_tick, 1) + if(SPT_PROB(0.5, seconds_per_tick)) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[2]]")) /datum/addiction/nicotine/withdrawal_stage_3_process(mob/living/carbon/affected_carbon, seconds_per_tick) - . = ..() - if(SPT_PROB(5, seconds_per_tick)) + if(SPT_PROB(0.7, seconds_per_tick)) trigger_random_side_effect(affected_carbon, seconds_per_tick, 2) + if(SPT_PROB(0.7, seconds_per_tick)) + to_chat(affected_carbon, span_danger("[withdrawal_stage_messages[3]]")) diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi index afec444d880..43116dbdd26 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi index 5b0f37b0f3d..0f0882cf036 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi index ce141e98765..072d3aacf95 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi index 22d99ae9e6e..fb97244b3d6 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi differ diff --git a/modular_skyrat/master_files/icons/misc/language.dmi b/modular_skyrat/master_files/icons/misc/language.dmi index 94169b0ada6..b6af8960841 100644 Binary files a/modular_skyrat/master_files/icons/misc/language.dmi and b/modular_skyrat/master_files/icons/misc/language.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi b/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi new file mode 100644 index 00000000000..eb85e94098d Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi new file mode 100644 index 00000000000..0a126826c75 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/head/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi b/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi new file mode 100644 index 00000000000..ff3d693439a Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/head/akula_official.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi new file mode 100644 index 00000000000..c565785da0c Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/suits/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi new file mode 100644 index 00000000000..6a6eccfa8a8 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/clothing/under/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi index 24275dcdf09..df2e12adf8b 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/centcom.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/species/podperson_hair.dmi b/modular_skyrat/master_files/icons/mob/species/podperson_hair.dmi new file mode 100644 index 00000000000..cb3c00453d2 Binary files /dev/null and b/modular_skyrat/master_files/icons/mob/species/podperson_hair.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi index 80cd4284997..0becc238d51 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi new file mode 100644 index 00000000000..2c3c2836796 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/head/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi b/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi new file mode 100644 index 00000000000..43fe78e0981 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/head/akula_official.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi new file mode 100644 index 00000000000..57c5e3efe6d Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/suits/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi new file mode 100644 index 00000000000..e7096dd2c77 Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/clothing/under/akula.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi index 1c0903c37a3..a54bb2a29a6 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi and b/modular_skyrat/master_files/icons/obj/clothing/under/centcom.dmi differ diff --git a/modular_skyrat/modules/Syndie_edits/code/syndie_edits.dm b/modular_skyrat/modules/Syndie_edits/code/syndie_edits.dm index 3ab38229e44..65e017dc9aa 100644 --- a/modular_skyrat/modules/Syndie_edits/code/syndie_edits.dm +++ b/modular_skyrat/modules/Syndie_edits/code/syndie_edits.dm @@ -57,6 +57,7 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/mask.dmi' icon_state = "balaclava_ds" flags_inv = HIDEHAIR | HIDEFACE | HIDEEARS | HIDEFACIALHAIR + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets; yes, that's below hair, but it already has HIDEHAIR /obj/item/clothing/mask/gas/sechailer/syndicate name = "neck gaiter" diff --git a/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm b/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm index 5e3170797de..e8e4a431989 100644 --- a/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm +++ b/modular_skyrat/modules/aesthetics/flag/code/signs_flags.dm @@ -70,6 +70,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/nri, 32) +/obj/structure/sign/flag/azulea + name = "flag of the Azulean Nation" + desc = "The foundations of this banner stretch back almost a millennium, devised by the first King among the Azulean people to unite them under it. \n\ + Dark blue, representing the seas of Azulean worlds, and light blue, representing the seas inbetween. \ + Both make waves on each other, but both are pulled in and swallowed by all of the people of Agurkrral coming together as one; as one violent, restless maelstrom. \n\n\ + It's common to see this banner just about everywhere in both the Old and New Principalities, reminding all of their purpose and unity." + icon_state = "flag_azulea" + item_flag = /obj/item/sign/flag/azulea + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/azulea, 32) + /// Please, for the love of God, use this in Black Mesa ONLY. NOWHERE ELSE. It's the only reason it was allowed in the game. /obj/structure/sign/flag/usa name = "flag of the United States of America" @@ -148,6 +159,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/flag/syndicate, 32) icon_state = "folded_nri" sign_path = /obj/structure/sign/flag/nri +/obj/item/sign/flag/azulea + name = "folded flag of Azulea" + desc = "The folded flag of the Akulan nation Azulea." + icon_state = "folded_azulea" + sign_path = /obj/structure/sign/flag/azulea + /// Please, for the love of God, use this in Black Mesa ONLY. NOWHERE ELSE. It's the only reason it was allowed in the game. /obj/item/sign/flag/usa name = "folded flag of the United States of America" diff --git a/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi b/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi index f9904caef13..4d2c7bd471a 100644 Binary files a/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi and b/modular_skyrat/modules/aesthetics/flag/icons/flags.dmi differ diff --git a/modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm b/modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm new file mode 100644 index 00000000000..069fb58e5fb --- /dev/null +++ b/modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm @@ -0,0 +1,46 @@ +/obj/item/crafting_conversion_kit + name = "base conversion kit" + desc = "It's a set of parts, for something. This shouldn't be here, and you should probably throw this away, since it's not going to be very useful." + icon = 'icons/obj/storage/box.dmi' + icon_state = "secbox" + // the inhands are just what the box uses + inhand_icon_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + +/obj/item/crafting_conversion_kit/mosin_pro + name = "\improper FTU 'Archangel' precision rifle stock (desert tan)" + desc = "It's a plastic rifle stock, an extended .244 Acia magazine, and some off-brand sight. Unfortunately, it lacks the actual bits that make it go bang. \ + It's probably a safe assumption that fixing that is an exercise left to the buyer." + icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' + icon_state = "bubba_wit_no_bubba" + +/datum/crafting_recipe/mosin_pro + name = "Sportiv to FTU 'Archangel' Conversion" + desc = "It's actually really easy to change the stock on your Sportiv. Anyone can do it. It takes roughly thirty seconds and a screwdriver." + result = /obj/item/gun/ballistic/rifle/boltaction/sporterized/empty + reqs = list( + /obj/item/gun/ballistic/rifle/boltaction = 1, + /obj/item/crafting_conversion_kit/mosin_pro = 1 + ) + steps = list( + "Empty the rifle", + "Leave the bolt open" + ) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 30 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/mosin_pro/New() + ..() + blacklist |= subtypesof(/obj/item/gun/ballistic/rifle/boltaction) - list(/obj/item/gun/ballistic/rifle/boltaction/surplus) + +/datum/crafting_recipe/mosin_pro/check_requirements(mob/user, list/collected_requirements) + var/obj/item/gun/ballistic/rifle/boltaction/the_piece = collected_requirements[/obj/item/gun/ballistic/rifle/boltaction][1] + if(!the_piece.bolt_locked) + return FALSE + if(LAZYLEN(the_piece.magazine.stored_ammo)) + return FALSE + return ..() diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index 8af5779b32b..c85b5f90c20 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -329,7 +329,7 @@ There was probably a reason it wasn't manufactured this short to begin with, especially not after what can only be assumed was years of negligence. \ It still feels uncomfortably moist." -/obj/item/gun/ballistic/rifle/boltaction/quartermaster +/obj/item/gun/ballistic/rifle/boltaction/sporterized name = "\improper FTU 'Archangel' precision rifle" desc = "A very... \"modernized\" Sportiv rifle, the frame even feels a little flimsy. This thing was probably built with a conversion kit from a shady NTnet site.\

\ @@ -340,13 +340,19 @@ mag_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba can_be_sawn_off = FALSE +/obj/item/gun/ballistic/rifle/boltaction/sporterized/empty + bolt_locked = TRUE // so the bolt starts visibly open + mag_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba/empty + /obj/item/ammo_box/magazine/internal/boltaction/bubba name = "sportiv extended internal magazine" desc = "How did you get it out?" ammo_type = /obj/item/ammo_casing/a762 caliber = CALIBER_A762 max_ammo = 8 - multiload = TRUE + +/obj/item/ammo_box/magazine/internal/boltaction/bubba/empty + start_empty = TRUE /obj/item/gun/ballistic/automatic/surplus name = "\improper Type-69 surplus rifle" diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi index 3e507b09c9b..38cd8e563fa 100644 Binary files a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi and b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi differ diff --git a/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dm b/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dm deleted file mode 100644 index 1ae013c9c50..00000000000 --- a/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dm +++ /dev/null @@ -1,66 +0,0 @@ -//TIER 1 -/obj/item/stock_parts/capacitor - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/manipulator - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/micro_laser - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/matter_bin - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/scanning_module - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -//TIER 2 - -/obj/item/stock_parts/capacitor/adv - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/scanning_module/adv - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/manipulator/nano - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/micro_laser/high - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/matter_bin/adv - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -//TIER 3 - -/obj/item/stock_parts/capacitor/super - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/scanning_module/phasic - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/manipulator/pico - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/micro_laser/ultra - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/matter_bin/super - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -//TIER 4 - -/obj/item/stock_parts/capacitor/quadratic - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/scanning_module/triphasic - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/manipulator/femto - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/micro_laser/quadultra - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' - -/obj/item/stock_parts/matter_bin/bluespace - icon = 'modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi' diff --git a/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi b/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi deleted file mode 100644 index ee3dee9d547..00000000000 Binary files a/modular_skyrat/modules/aesthetics/stock_parts/stock_parts.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/telescience/telescience.dm b/modular_skyrat/modules/aesthetics/telescience/telescience.dm index e07cd5b51b9..739038a3f03 100644 --- a/modular_skyrat/modules/aesthetics/telescience/telescience.dm +++ b/modular_skyrat/modules/aesthetics/telescience/telescience.dm @@ -1,11 +1,2 @@ /obj/item/gps icon = 'modular_skyrat/modules/aesthetics/telescience/telescience.dmi' - -/obj/item/stack/telecrystal - icon = 'modular_skyrat/modules/aesthetics/telescience/telescience.dmi' - -/obj/item/stack/ore/bluespace_crystal - icon = 'modular_skyrat/modules/aesthetics/telescience/telescience.dmi' - -/obj/item/stack/sheet/bluespace_crystal - icon = 'modular_skyrat/modules/aesthetics/telescience/telescience.dmi' diff --git a/modular_skyrat/modules/aesthetics/telescience/telescience.dmi b/modular_skyrat/modules/aesthetics/telescience/telescience.dmi index 9e84fe505e5..63aac3da214 100644 Binary files a/modular_skyrat/modules/aesthetics/telescience/telescience.dmi and b/modular_skyrat/modules/aesthetics/telescience/telescience.dmi differ diff --git a/modular_skyrat/modules/akula/code/wetsuit.dm b/modular_skyrat/modules/akula/code/wetsuit.dm new file mode 100644 index 00000000000..07135607096 --- /dev/null +++ b/modular_skyrat/modules/akula/code/wetsuit.dm @@ -0,0 +1,41 @@ +/// How many wetstacks does the clothing's status effect apply to its wearer +#define STATUS_EFFECT_STACKS 5 + +/datum/component/wetsuit + dupe_mode = COMPONENT_DUPE_UNIQUE + +/datum/component/wetsuit/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(apply_wetsuit_status_effect)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(remove_wetsuit_status_effect)) + +/datum/component/wetsuit/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + )) + +/// A proc for all akula clothing which has the 'special tech' to keep their wearers slippery +/datum/component/wetsuit/proc/apply_wetsuit_status_effect(obj/item/source, mob/living/user, slot) + if(slot == ITEM_SLOT_HANDS) + return FALSE + if(!HAS_TRAIT(user, TRAIT_SLICK_SKIN)) + return FALSE + + user.apply_status_effect(/datum/status_effect/grouped/wetsuit, REF(source)) + +/// A proc to remove the wetsuit status effect +/datum/component/wetsuit/proc/remove_wetsuit_status_effect(obj/item/source, mob/living/user, slot) + user.remove_status_effect(/datum/status_effect/grouped/wetsuit, REF(source)) + +/// The status effect which `apply_wetsuit_status_effect` gives +/datum/status_effect/grouped/wetsuit + id = "wetsuit" + alert_type = null + tick_interval = 10 SECONDS + +/datum/status_effect/grouped/wetsuit/tick() + owner.set_wet_stacks(STATUS_EFFECT_STACKS) + +#undef STATUS_EFFECT_STACKS diff --git a/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm b/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm index 1341c3104ad..2b4d0a0151a 100644 --- a/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm +++ b/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm @@ -67,7 +67,7 @@ cost = 4 /datum/armament_entry/hecu/utility/breaching_hammer //Mesa more like R6S amirite - item_type = /obj/item/melee/hammer + item_type = /obj/item/melee/breaching_hammer max_purchase = 1 cost = 4 diff --git a/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm index 7d48f7fddb9..afb1233b783 100644 --- a/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm +++ b/modular_skyrat/modules/bodyparts/code/akula_bodyparts.dm @@ -2,6 +2,7 @@ /obj/item/bodypart/head/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED /obj/item/bodypart/chest/mutant/akula icon_greyscale = BODYPART_ICON_AKULA @@ -18,17 +19,7 @@ /obj/item/bodypart/leg/left/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA - digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/akula /obj/item/bodypart/leg/right/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA - digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/akula - -/obj/item/bodypart/leg/left/digitigrade/akula - icon_greyscale = BODYPART_ICON_AKULA - base_limb_id = SPECIES_AKULA - -/obj/item/bodypart/leg/right/digitigrade/akula - icon_greyscale = BODYPART_ICON_AKULA - base_limb_id = SPECIES_AKULA diff --git a/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm new file mode 100644 index 00000000000..4cbd97838c9 --- /dev/null +++ b/modular_skyrat/modules/bodyparts/code/aquatic_bodyparts.dm @@ -0,0 +1,33 @@ +// Akulas! +/obj/item/bodypart/head/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED + +/obj/item/bodypart/chest/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/arm/left/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/arm/right/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + +/obj/item/bodypart/leg/left/digitigrade/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + +/obj/item/bodypart/leg/right/digitigrade/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + +/obj/item/bodypart/leg/left/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/aquatic + +/obj/item/bodypart/leg/right/mutant/aquatic + icon_greyscale = BODYPART_ICON_AQUATIC + limb_id = SPECIES_AQUATIC + digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/aquatic diff --git a/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi b/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi index 68cc71e5cc0..323178aff36 100644 Binary files a/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi and b/modular_skyrat/modules/bodyparts/icons/akula_parts_greyscale.dmi differ diff --git a/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi b/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi new file mode 100644 index 00000000000..a2bb6891a5e Binary files /dev/null and b/modular_skyrat/modules/bodyparts/icons/aquatic_parts_greyscale.dmi differ diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm index 765627e6bb8..79d5060e21f 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -5,12 +5,19 @@ #define PRICE_FIRST_AID_PREMIUM_LOWER 0.6 #define PRICE_FIRST_AID_PREMIUM_HIGHER 0.7 -#define PRICE_CHEM_CHEAP_LOWER 5.7 -#define PRICE_CHEM_CHEAP_HIGHER 4.8 -#define PRICE_CHEM_MEDIUM_LOWER 4.4 -#define PRICE_CHEM_MEDIUM_HIGHER 4 -#define PRICE_CHEM_PREMIUM_LOWER 3.5 -#define PRICE_CHEM_PREMIUM_HIGHER 3 +#define PRICE_CHEM_CHEAP_LOWER 4.8 +#define PRICE_CHEM_CHEAP_HIGHER 5.7 +#define PRICE_CHEM_MEDIUM_LOWER 4 +#define PRICE_CHEM_MEDIUM_HIGHER 4.4 +#define PRICE_CHEM_PREMIUM_LOWER 3 +#define PRICE_CHEM_PREMIUM_HIGHER 3.5 +#define PRICE_CYBER_ORGAN_LOWER 2 +#define PRICE_CYBER_ORGAN_HIGHER 5 +#define PRICE_CYBER_AUGMENT_LOWER 3 +#define PRICE_CYBER_AUGMENT_HIGHER 6 + +#define MODULE_MID_LOWER 2 +#define MODULE_MID_UPPER 3 //I stole these from nakamura, bite me /datum/armament_entry/company_import/deforest category = DEFOREST_MEDICAL_NAME @@ -204,59 +211,88 @@ interest_addition = COMPANY_INTEREST_GAIN_BIG interest_required = COMPANY_HIGH_INTEREST +// Modsuit Modules from the medical category, here instead of in Nakamura because nobody buys from this company + +/datum/armament_entry/company_import/deforest/medical_modules + subcategory = "MOD Medical Modules" + interest_required = COMPANY_SOME_INTEREST + lower_cost = CARGO_CRATE_VALUE * MODULE_MID_LOWER + upper_cost = CARGO_CRATE_VALUE * MODULE_MID_UPPER + +/datum/armament_entry/company_import/deforest/medical_modules/injector + name = "MOD injector module" + item_type = /obj/item/mod/module/injector + +/datum/armament_entry/company_import/deforest/medical_modules/organ_thrower + name = "MOD organ thrower module" + item_type = /obj/item/mod/module/organ_thrower + +/datum/armament_entry/company_import/deforest/medical_modules/patient_transport + name = "MOD patient transport module" + item_type = /obj/item/mod/module/criminalcapture/patienttransport + +/datum/armament_entry/company_import/deforest/medical_modules/thread_ripper + name = "MOD thread ripper module" + item_type = /obj/item/mod/module/thread_ripper + +/datum/armament_entry/company_import/deforest/medical_modules/surgical_processor + name = "MOD surgical processor module" + item_type = /obj/item/mod/module/surgical_processor + // Various advanced cybernetic organs, organ replacements for the rich /datum/armament_entry/company_import/deforest/cyber_organs subcategory = "Premium Cybernetic Organs" + lower_cost = CARGO_CRATE_VALUE * PRICE_CYBER_ORGAN_LOWER + upper_cost = CARGO_CRATE_VALUE * PRICE_CYBER_ORGAN_HIGHER + interest_addition = COMPANY_INTEREST_GAIN_AVERAGE + interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/eyes name = "shielded cybernetic eyes" item_type = /obj/item/storage/organbox/advanced_cyber_eyes - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/ears name = "upgraded cybernetic ears" item_type = /obj/item/storage/organbox/advanced_cyber_ears - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/heart name = "upgraded cybernetic heart" item_type = /obj/item/storage/organbox/advanced_cyber_heart - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/liver name = "upgraded cybernetic liver" item_type = /obj/item/storage/organbox/advanced_cyber_liver - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/lungs name = "upgraded cybernetic lungs" item_type = /obj/item/storage/organbox/advanced_cyber_lungs - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST /datum/armament_entry/company_import/deforest/cyber_organs/stomach name = "upgraded cybernetic stomach" item_type = /obj/item/storage/organbox/advanced_cyber_stomach - lower_cost = CARGO_CRATE_VALUE * 2 - upper_cost = CARGO_CRATE_VALUE * 5 - interest_addition = COMPANY_INTEREST_GAIN_AVERAGE - interest_required = COMPANY_SOME_INTEREST +/datum/armament_entry/company_import/deforest/cyber_organs/augments + lower_cost = CARGO_CRATE_VALUE * PRICE_CYBER_AUGMENT_LOWER + upper_cost = CARGO_CRATE_VALUE * PRICE_CYBER_AUGMENT_HIGHER + interest_addition = COMPANY_INTEREST_GAIN_BIG + interest_required = COMPANY_HIGH_INTEREST + +/datum/armament_entry/company_import/deforest/cyber_organs/augments/nutriment + name = "Nutriment pump implant" + item_type = /obj/item/organ/internal/cyberimp/chest/nutriment + +/datum/armament_entry/company_import/deforest/cyber_organs/augments/reviver + name = "Reviver implant" + item_type = /obj/item/organ/internal/cyberimp/chest/reviver + +/datum/armament_entry/company_import/deforest/cyber_organs/augments/surgery_implant + name = "surgical toolset implant" + item_type = /obj/item/organ/internal/cyberimp/arm/surgery + +/datum/armament_entry/company_import/deforest/cyber_organs/augments/breathing_tube + name = "breathing tube implant" + item_type = /obj/item/organ/internal/cyberimp/mouth/breathing_tube #undef PRICE_FIRST_AID_BASIC_LOWER #undef PRICE_FIRST_AID_BASIC_HIGHER @@ -271,3 +307,11 @@ #undef PRICE_CHEM_MEDIUM_HIGHER #undef PRICE_CHEM_PREMIUM_LOWER #undef PRICE_CHEM_PREMIUM_HIGHER + +#undef MODULE_MID_LOWER +#undef MODULE_MID_UPPER + +#undef PRICE_CYBER_ORGAN_LOWER +#undef PRICE_CYBER_ORGAN_HIGHER +#undef PRICE_CYBER_AUGMENT_LOWER +#undef PRICE_CYBER_AUGMENT_HIGHER diff --git a/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm b/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm index cec359ca63e..a65f4a57416 100644 --- a/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm +++ b/modular_skyrat/modules/customization/modules/clothing/masks/breath.dm @@ -14,7 +14,7 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_SMALL - w_class = WEIGHT_CLASS_SMALL + alternate_worn_layer = LOW_FACEMASK_LAYER //This lets it layer below glasses and headsets - WILL LAYER BELOW HAIR IF HIDEHAIR IS NOT UPDATING CORRECTLY var/open = 0 //0 = full, 1 = head only, 2 = face only /obj/item/clothing/mask/balaclavaadjust/proc/adjust_mask(mob/living/carbon/human/user) @@ -33,7 +33,7 @@ to_chat(user, "You adjust the balaclava up to cover your mouth.") open = 2 else - flags_inv = HIDEFACE|HIDEHAIR + flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDEHAIR icon_state = initial(icon_state) to_chat(user, "You pull the balaclava up to cover your whole head.") open = 0 diff --git a/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm b/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm new file mode 100644 index 00000000000..739e4675477 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/clothing/outfits/akula.dm @@ -0,0 +1,38 @@ +/datum/outfit/akula + name = "Akula" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + +/datum/outfit/akula/assistant + name = "Akula Assistant" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit + +/datum/outfit/akula/station_engineer + name = "Akula Engineer" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/engineering + +/datum/outfit/akula/cargo_technician + name = "Akula Cargo-Technician" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/cargo + +/datum/outfit/akula/scientist + name = "Akula Scientist" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/science + +/datum/outfit/akula/doctor + name = "Akula Doctor" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/medical + +/datum/outfit/akula/security_officer + name = "Akula Security-Officer" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/security + +/datum/outfit/akula/command + name = "Akula Command" + head = /obj/item/clothing/head/helmet/space/akula_wetsuit + uniform = /obj/item/clothing/under/akula_wetsuit/job/command diff --git a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm index 5df4d0c4d5c..6d645ae5893 100644 --- a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm +++ b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm @@ -253,19 +253,52 @@ // Donation reward for Farsighted Nightlight /obj/item/clothing/mask/gas/nightlight - name = "FAR-14C IRU" - desc = "A close-fitting respirator designed by Forestiian Armories, commonly used by Military and Civilian Personnel alike. It reeks of Militarism." + name = "FIR-36 Rebreather" + desc = "A close-fitting respirator designed by Forestfel Intersystem Industries and originally meant for Ixian Tajarans, the FIR-36 Rebreather is commonly used by Military and Civilian Personnel alike. It reeks of Militarism." icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi' icon_state = "far14c" + actions_types = list(/datum/action/item_action/adjust) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS //same flags as actual sec hailer gas mask - flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + flags_inv = HIDEFACE | HIDESNOUT flags_cover = NONE visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS - visor_flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDESNOUT + visor_flags_inv = HIDEFACE | HIDESNOUT w_class = WEIGHT_CLASS_SMALL tint = 0 +/obj/item/clothing/mask/gas/nightlight/attack_self(mob/user) + adjustmask(user) + +/obj/item/clothing/mask/gas/nightlight/AltClick(mob/user) + ..() + if(user.can_perform_action(src, NEED_DEXTERITY)) + adjustmask(user) + +/obj/item/clothing/mask/gas/nightlight/examine(mob/user) + . = ..() + . += span_notice("Alt-click [src] to adjust it.") + +/obj/item/clothing/mask/gas/nightlight/alldono //different itempath so regular donators can have it, too + +// Donation reward for ChillyLobster +/obj/item/clothing/suit/jacket/brasspriest + name = "brasspriest coat" + desc = "A reddish coat with brass-clad parts embed into said coat. You can hear the faint noise of some cogs turning from time to time inside." + icon_state = "brasspriest" + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi' + body_parts_covered = CHEST|GROIN|LEGS|ARMS + cold_protection = CHEST|GROIN|LEGS|ARMS + +// Donation reward for ChillyLobster +/obj/item/clothing/suit/jacket/hydrogenrobes + name = "metallic-hydrogen robes" + desc = "An incredibly shiny dress that seems to be covered in a very thin sheet of metallic hydrogen all over the textiles. Not very protective." + icon_state = "hydrogenrobes" + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi' + // Donation reward for TheOOZ /obj/item/clothing/mask/animal/kindle name = "wolf mask" diff --git a/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm b/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm new file mode 100644 index 00000000000..c7a94272aa1 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/language/te_velu_akko.dm @@ -0,0 +1,24 @@ +/datum/language/akulan + name = "Te Velu Akko" + desc = "Translating to 'The Song of The King,' this language was singlehandedly invented and promulgated by the third King of Agurkrral, Akko the Uniter. \ + Records show that the King had personally created it so that those with little education, including aliens, could integrate easier with Azulean society. \ + To this end, the language is known for its rapid pace of learning, the written portion being readily mastered within two weeks, a tongue characterized by hard consonants followed by soft vowel strings. \ + An underwater component exists, fleshed out and codified by deepwater reformists in the later portions of Akko the Uniter's life; featuring great emphasis on close physical proximity, variations of pitch, high-frequency sounds, and clicking. \ + Alien tourists frequently either seek temporary genemods, or specialized organisms that dwell in the throat to be able to speak this portion., \n\n\ + Differences exist in dialect between the Old Principalities and New Principalities; \ + The Old sounds far slower and smoother, words flowing into each other in a very melodic way; befitting of the language's name. \ + The New is much faster, more harsh, and more aggressive in an attempt to be more efficient; however, rapidly adopting new loanwords from alien tongues. \ + A common greeting no matter where one is in Agurkrral is to essentially bump noses, allowing the other Azulean to feel the speaker's bioelectric field." + + + key = "Z" + flags = TONGUELESS_SPEECH + space_chance = 70 + // Syllables derived from the Maori language. + syllables = list ( + "ā", "ē", "ī", "ō", "a", "e", "i", "o", "u", "ha", "he", "hi", "ho", "hu", "ka", "ke", "ki", "ko", "ku", "ma", "me", "mi", "mo", "mu", "na", "ne", "ni", "no", "nu", + "nga", "nge", "ngi", "ngo", "ngu", "pa", "pe", "pi", "po", "pu", "ra", "re", "ri", "ro", "ru", "ta", "te", "ti", "to", "tu", "wa", "we", "wi", "wo", "wu", "wha", "whe", "whi", + ) + icon_state = "azulean" + icon = 'modular_skyrat/master_files/icons/misc/language.dmi' + default_priority = 94 diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm index c3ba09f5632..dab4129ed4f 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_marking_sets.dm @@ -195,6 +195,14 @@ name = "Plain" body_marking_list = list("Plain") +//AKULA MARKINGS +/datum/body_marking_set/akula + recommended_species = list(SPECIES_AKULA) + +/datum/body_marking_set/akula/akula + name = "Akula" + body_marking_list = list("Akula", "Akula Highlight") + //VOX MARKINGS /datum/body_marking_set/vox recommended_species = list(SPECIES_VOX) diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm new file mode 100644 index 00000000000..327f927e0e0 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/body_markings/body_markings_akula.dm @@ -0,0 +1,14 @@ +/datum/body_marking/akula + icon = 'modular_skyrat/master_files/icons/mob/body_markings/akula_markings.dmi' + +/datum/body_marking/akula/secondary + name = "Akula" + icon_state = "akula" + affected_bodyparts = ARM_LEFT | ARM_RIGHT | HAND_LEFT | HAND_RIGHT | LEG_RIGHT | LEG_LEFT | CHEST | HEAD + default_color = DEFAULT_SECONDARY + +/datum/body_marking/akula/tertiary + name = "Akula Highlight" + icon_state = "akula_highlight" + affected_bodyparts = ARM_LEFT | ARM_RIGHT | LEG_RIGHT | LEG_LEFT | CHEST | HEAD + default_color = DEFAULT_TERTIARY diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm index 423a6b9ef9c..d0cc1c8f123 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm @@ -143,6 +143,7 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) /datum/sprite_accessory/pod_hair name = "None" + icon = 'modular_skyrat/master_files/icons/mob/species/podperson_hair.dmi' icon_state = "None" key = "pod_hair" recommended_species = list(SPECIES_PODPERSON, SPECIES_PODPERSON_WEAK) diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm index 290e3536e86..e6c856c5d96 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -163,10 +163,6 @@ icon_state = "fennec" fluffy = TRUE -/datum/sprite_accessory/tails/mammal/wagging/fish - name = "Fish" - icon_state = "fish" - /datum/sprite_accessory/tails/mammal/wagging/vulpkanin/fox name = "Fox" icon_state = "fox" @@ -313,6 +309,10 @@ name = "Shade (Striped)" icon_state = "shadekinlongstriped_large" +/datum/sprite_accessory/tails/mammal/wagging/akula/akula + name = "Akula" + icon_state = "akula" + /datum/sprite_accessory/tails/mammal/wagging/akula/shark name = "Shark" icon_state = "shark" @@ -321,6 +321,10 @@ name = "Shark (No Fin)" icon_state = "sharknofin" +/datum/sprite_accessory/tails/mammal/wagging/akula/fish + name = "Fish" + icon_state = "fish" + /datum/sprite_accessory/tails/mammal/wagging/shepherd name = "Shepherd" icon_state = "shepherd" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm index 41c6803c4a9..cc7b0fd9d9c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -1,6 +1,23 @@ +/// How long the akula will stay wet for, AKA how long until they get a mood debuff +#define DRY_UP_TIME 10 MINUTES +/// How many wetstacks an Akula will get upon creation +#define WETSTACK_INITIAL 5 +/// How many wetstacks an Akula needs to activate the TRAIT_SLIPPERY trait +#define WETSTACK_THRESHOLD 3 + /datum/species/akula name = "Akula" id = SPECIES_AKULA + lore_protected = TRUE + offset_features = list( + OFFSET_GLASSES = list(0, 1), + OFFSET_EARS = list(0, 2), + OFFSET_FACEMASK = list(0, 2), + OFFSET_HEAD = list(0, 2), + OFFSET_HAIR = list(0, 1), + ) + eyes_icon = 'modular_skyrat/modules/organs/icons/akula_eyes.dmi' + mutanteyes = /obj/item/organ/internal/eyes/akula species_traits = list( MUTCOLORS, EYECOLOR, @@ -13,15 +30,15 @@ TRAIT_CAN_USE_FLIGHT_POTION, TRAIT_LITERATE, TRAIT_WATER_BREATHING, + TRAIT_SLICK_SKIN, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID mutant_bodyparts = list() default_mutant_bodyparts = list( "tail" = ACC_RANDOM, - "snout" = ACC_RANDOM, - "ears" = ACC_RANDOM, "legs" = "Normal Legs" ) + outfit_important_for_life = /datum/outfit/akula payday_modifier = 0.75 liked_food = SEAFOOD | RAW disliked_food = CLOTH | DAIRY @@ -35,55 +52,120 @@ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/akula, BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/akula, ) - lore_protected = TRUE - -/datum/species/akula/randomize_features(mob/living/carbon/human/human_mob) - var/main_color - var/second_color - var/random = rand(1,5) - //Choose from a variety of sharkish colors, with a whiter secondary and tertiary - switch(random) - if(1) - main_color = "#668899" - second_color = "#BBCCDD" - if(2) - main_color = "#334455" - second_color = "#DDDDEE" - if(3) - main_color = "#445566" - second_color = "#DDDDEE" - if(4) - main_color = "#666655" - second_color = "#DDDDEE" - if(5) - main_color = "#444444" - second_color = "#DDDDEE" - human_mob.dna.features["mcolor"] = main_color - human_mob.dna.features["mcolor2"] = second_color - human_mob.dna.features["mcolor3"] = second_color - -/datum/species/akula/get_random_body_markings(list/passed_features) - var/name = "Shark" - var/datum/body_marking_set/BMS = GLOB.body_marking_sets[name] - var/list/markings = list() - if(BMS) - markings = assemble_body_markings_from_set(BMS, passed_features, src) - return markings + /// This variable stores the timer datum which appears if the mob becomes wet + var/dry_up_timer = TIMER_ID_NULL /datum/species/akula/get_species_description() return placeholder_description /datum/species/akula/get_species_lore() - return list(placeholder_lore) + return list("The Azuleans, known as 'Akulas' or 'Akulans' to humans, are a strong-willed and monarchist culture. A vast nation, the Kingdom of Agurkrral has achieved its status largely by sheer tenacity; Azuleans forcing themselves upwards from the depths of their home seas all the way to a monarchy that even dwarfs the Sol Federation. They are known to be an expansionist culture, collectivist opportunists that are driven by history and culture to push further, and to push onward. To keep moving, or to suffocate and stagnate.", + "Beginning their prehistory with total defeat of another intelligent species set to keep them in their waters forever, the Azuleans have forged themselves into a pioneering people willing to exploit even the most hostile lands; and turn foreign places, flora and fauna, and even people to their advantage. New colonies are being terraformed into 'Agurkrral-A-Likes' every day, strange bioengineered creatures released into the wilds and massive treatment machines being ran in the waters to accomodate the new biosphere. Even some foreign citizens have been forcibly turned into Azuleans through genemodding, before having their genes locked and unable to be altered by anyone else.", + "Their drive for constant expansion and 'the next great thing' has made the Kingdom a divided one; a culture split in two. Generations of Azuleans are separated not by age-based cohorts, but by distance; the 'Near' generations growing up in the Old Principalities, and the 'Far' generations growing up in the New Principalities.", + "The Old Principalities, coreward around their Homeworld, are a burgeoning place slowly falling victim to stagnation. The core worlds still cling to ancient traditions, ceremonies and expectation; old aristocratic houses, tracing their power from ancient ancestors placed to protect and shepherd their assigned lands, still thrive; and the King still rules over many systems of old. Constant reforms and false shake-ups of the status quo demand more and more. Longer bouts of service to achieve citizenship, reformation camps to 'iron out' those with physical and mental defects, and high reliance on exams, education, and pomp to create a hierarchy within its society.", + "The New Principalities, created and commandeered by edgerunning 'border princes' dwelling around the furthest reaches of the Kingdom, embody the Azulean spirit of opportunism and adventurism. Warlord-style nobles reign free, able to outswim any checks meant to control their power and influence. A laissez-faire approach is taken here, where anyone can do anything to become somebody; ambition and self-evolution valued far more than any birthright. Sprawling casino cities, pirate ports, and even luxurious resorts are known to be built up overnight, anyone being able to make money and become wealthy and even command naval ships on charisma and strength alone; fear being the second state currency right behind credits. Even some SolFed citizens are known to come here and profit as mercenaries, investors, gamblers, or even 'border princes.'", + "These generations split apart by distance are known for their animosity towards the other. To those in the New Principalities, their coreward cousins have lost the 'Azulean spirit;' rotting apart in their palaces, sitting in waters choked with ennui. Their forever expansion into the frontier colonies, their use of every useful material and lifeform is what they believe their Kingdom is fueled by. But to those in the Old Principalities, their edgeward descendants have lost their minds. They believe the spiritual and societal importance of their Homeworld has fallen on deaf ears, and the lackadaisical attitude about the core mechanisms and noble structures holding the Kingdom together has become nothing short of infuriating. It is the belief of many high-ranking members of the Monarchy that the ongoing terraforming processes in the frontiers are proof of the arrogance of the 'border princes' controlling them; each and every world made in the image of a planet the King himself is meant to protect.", + "Yet, despite their differences, all Agurkrral citizens swim freely in their kingdom's waters. Even the most controlling border princes, even those in the Old Principalities working the slave trade, know better than to openly erode a citizen's right to life, property, and speech. Any alien species can become an Agurkrral citizen, and even non-citizens enjoy the right to life, with executions outright banned. The aristocracy remains well-educated, even the edgerunner warlords of the New Principalities, and the Kingdom as a whole enjoys its status as a nation that's now a true rival to Sol. Larger, more populated, and better developed; though, having to 'integrate' Solarian technologies, goods, and peoples to fully succeed. The Azuleans are even known as an environmentally-focused people; although they hold no care for lands they cannot make use of, modern nobles are still in charge of maintaining the biosphere of lands they control, to allow their strangely engineered flora and fauna to thrive, and for the people to have healthy and clean waters to live in.", + ) -/datum/species/akula/prepare_human_for_preview(mob/living/carbon/human/human) - var/main_color = "#394b66" - var/secondary_color = "#818b9b" - human.dna.features["mcolor"] = main_color - human.dna.features["mcolor2"] = secondary_color - human.dna.features["mcolor3"] = secondary_color - human.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Shark", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - human.dna.mutant_bodyparts["snout"] = list(MUTANT_INDEX_NAME = "hShark", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - human.dna.mutant_bodyparts["ears"] = list(MUTANT_INDEX_NAME = "Sergal", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, secondary_color)) - regenerate_organs(human, src, visual_only = TRUE) - human.update_body(TRUE) +/datum/species/akula/randomize_features(mob/living/carbon/human/human_mob) + var/main_color + var/secondary_color + var/tertiary_color + var/random = rand(1, 4) + switch(random) + if(1) + main_color = "#1CD3E5" + secondary_color = "#6AF1D6" + tertiary_color = "#CCF6E2" + if(2) + main_color = "#CF3565" + secondary_color = "#d93554" + tertiary_color = "#fbc2dd" + if(3) + main_color = "#FFC44D" + secondary_color = "#FFE85F" + tertiary_color = "#FFF9D6" + if(4) + main_color = "#DB35DE" + secondary_color = "#BE3AFE" + tertiary_color = "#F5E2EE" + human_mob.dna.features["mcolor"] = main_color + human_mob.dna.features["mcolor2"] = secondary_color + human_mob.dna.features["mcolor3"] = tertiary_color + +/datum/species/akula/prepare_human_for_preview(mob/living/carbon/human/akula) + var/main_color = "#1CD3E5" + var/secondary_color = "#6AF1D6" + var/tertiary_color = "#CCF6E2" + akula.dna.features["mcolor"] = main_color + akula.dna.features["mcolor2"] = secondary_color + akula.dna.features["mcolor3"] = tertiary_color + akula.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Akula", MUTANT_INDEX_COLOR_LIST = list(main_color, secondary_color, tertiary_color)) + akula.dna.features["legs"] = "Normal Legs" + regenerate_organs(akula, src, visual_only = TRUE) + akula.update_body(TRUE) + +/obj/item/organ/internal/eyes/akula + // Eyes over hair as bandaid for the low amounts of head matching hair + eyes_layer = HAIR_LAYER-0.1 + +/datum/species/akula/get_random_body_markings(list/passed_features) + var/datum/body_marking_set/body_marking_set = GLOB.body_marking_sets["Akula"] + var/list/markings = list() + if(body_marking_set) + markings = assemble_body_markings_from_set(body_marking_set, passed_features, src) + return markings + +/datum/species/akula/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) + if(job?.akula_outfit) + equipping.equipOutfit(job.akula_outfit, visuals_only) + else + give_important_for_life(equipping) + +// Wet_stacks handling +// more about grab_resists in `code\modules\mob\living\living.dm` at li 1119 +// more about slide_distance in `code\game\turfs\open\_open.dm` at li 233 +/// Lets register the signal which calls when we are above 10 wet_stacks +/datum/species/akula/on_species_gain(mob/living/carbon/akula, datum/species/old_species, pref_load) + . = ..() + RegisterSignal(akula, COMSIG_MOB_TRIGGER_WET_SKIN, PROC_REF(wetted), akula) + // lets give 15 wet_stacks on initial + akula.set_wet_stacks(WETSTACK_INITIAL, remove_fire_stacks = FALSE) + +/// Remove the signal on species loss +/datum/species/akula/on_species_loss(mob/living/carbon/akula, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(akula, COMSIG_MOB_TRIGGER_WET_SKIN) + +/// This proc is called when a mob with TRAIT_SLICK_SKIN gains over 10 wet_stacks +/datum/species/akula/proc/wetted(mob/living/carbon/akula) + SIGNAL_HANDLER + // Apply the slippery trait if its not there yet + if(!HAS_TRAIT(akula, TRAIT_SLIPPERY)) + ADD_TRAIT(akula, TRAIT_SLIPPERY, SPECIES_TRAIT) + + // Relieve the negative moodlet + akula.clear_mood_event("dry_skin") + // The timer which will initiate above 10 wet_stacks, and call dried() once the timer runs out + dry_up_timer = addtimer(CALLBACK(src, PROC_REF(dried), akula), DRY_UP_TIME, TIMER_UNIQUE | TIMER_STOPPABLE) + +/// This proc is called after a mob with the TRAIT_SLIPPERY has its related timer run out +/datum/species/akula/proc/dried(mob/living/carbon/akula) + // A moodlet which will not go away until the user gets wet + akula.add_mood_event("dry_skin", /datum/mood_event/dry_skin) + +/// A simple overwrite which calls parent to listen to wet_stacks +/datum/status_effect/fire_handler/wet_stacks/tick(delta_time) + . = ..() + if(!owner) + return + if(HAS_TRAIT(owner, TRAIT_SLICK_SKIN) && stacks >= WETSTACK_THRESHOLD) + SEND_SIGNAL(owner, COMSIG_MOB_TRIGGER_WET_SKIN) + + if(HAS_TRAIT(owner, TRAIT_SLIPPERY) && stacks <= 0.5) // Removed just before we hit 0 and delete the /status_effect/ + REMOVE_TRAIT(owner, TRAIT_SLIPPERY, SPECIES_TRAIT) + +#undef DRY_UP_TIME +#undef WETSTACK_INITIAL +#undef WETSTACK_THRESHOLD diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm index 7836cf010ea..775af3bfe41 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm @@ -1,5 +1,5 @@ /datum/species/aquatic - name = "Aquatic" + name = "Akula (Generic)" id = SPECIES_AQUATIC species_traits = list( MUTCOLORS, @@ -32,12 +32,12 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_AKULA bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/akula, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/akula, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/akula, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/akula, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/akula, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/akula, + BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/aquatic, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/mutant/aquatic, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mutant/aquatic, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mutant/aquatic, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mutant/aquatic, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mutant/aquatic, ) /datum/species/aquatic/randomize_features(mob/living/carbon/human/human_mob) diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/pod.dm b/modular_skyrat/modules/customization/modules/surgery/organs/pod.dm new file mode 100644 index 00000000000..e545f3f17c0 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/surgery/organs/pod.dm @@ -0,0 +1,44 @@ +/obj/item/organ/external/pod_hair + name = "podperson hair" + desc = "Base for many-o-salads." + + mutantpart_key = "pod_hair" + mutantpart_info = list(MUTANT_INDEX_NAME = "Ivy", MUTANT_INDEX_COLOR_LIST = list("#ffffff", "#ffffff", "#ffffff")) + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_POD_HAIR + + bodypart_overlay = /datum/bodypart_overlay/mutant/pod_hair + +/datum/bodypart_overlay/mutant/pod_hair + layers = EXTERNAL_FRONT_OVER|EXTERNAL_FRONT_ABOVE_HAIR + color_swapped_layer = EXTERNAL_FRONT_OVER + color_source = ORGAN_COLOR_OVERRIDE + +/datum/bodypart_overlay/mutant/pod_hair/override_color(rgb_value) + return draw_color + +/datum/bodypart_overlay/mutant/pod_hair/color_images(list/image/overlays, draw_layer, obj/item/bodypart/limb) + if(draw_layer != bitflag_to_layer(color_swapped_layer)) + return ..() + + for(var/index_to_color in overlay_indexes_to_color) + if(index_to_color > length(overlays)) + break + + var/list/rgb_list + if(istext(draw_color) || length(draw_color) == 1) // legacy single-color mode, we just invert it + rgb_list = list() + for(var/col in rgb2num(islist(draw_color) ? draw_color[1] : draw_color)) + rgb_list += (color_inverse_base - col) //inversa da color + else if(length(draw_color) >= 2) + rgb_list = rgb2num(draw_color[2]) + + if(rgb_list) + overlays[index_to_color].color = rgb(rgb_list[1], rgb_list[2], rgb_list[3]) + else + overlays[index_to_color].color = null + +/datum/bodypart_overlay/mutant/pod_hair/randomize_appearance() + . = ..() + draw_color = list("#[random_color()]", "#[random_color()]", "#FFFFFF") // currently only two colors are used diff --git a/modular_skyrat/modules/inflatables/code/inflatable.dm b/modular_skyrat/modules/inflatables/code/inflatable.dm index 813ea27d499..f58b4dde172 100644 --- a/modular_skyrat/modules/inflatables/code/inflatable.dm +++ b/modular_skyrat/modules/inflatables/code/inflatable.dm @@ -2,8 +2,8 @@ #define TAPE_REQUIRED_TO_FIX 2 #define INFLATABLE_DOOR_OPENED FALSE #define INFLATABLE_DOOR_CLOSED TRUE -#define BOX_DOOR_AMOUNT 8 -#define BOX_WALL_AMOUNT 16 +#define BOX_DOOR_AMOUNT 7 +#define BOX_WALL_AMOUNT 14 /obj/structure/inflatable name = "inflatable wall" @@ -66,15 +66,15 @@ /obj/structure/inflatable/proc/deflate(violent) if(has_been_deflated) // We do not ever want to deflate more than once. return - + has_been_deflated = TRUE - + playsound(src, 'sound/machines/hiss.ogg', 75, 1) if(!violent) balloon_alert_to_viewers("slowly deflates!") addtimer(CALLBACK(src, PROC_REF(slow_deflate_finish)), manual_deflation_time) return - + var/turf/inflatable_loc = get_turf(src) inflatable_loc.balloon_alert_to_viewers("[src] rapidly deflates!") // just so we don't balloon alert from the qdeleted inflatable object if(torn_type) @@ -214,18 +214,26 @@ /obj/item/inflatable/door/torn torn = TRUE -// The box full of inflatables +/// The storage for the inflatables box. +/datum/storage/inflatables_box + max_slots = (BOX_DOOR_AMOUNT + BOX_WALL_AMOUNT) + max_specific_storage = WEIGHT_CLASS_SMALL + max_total_storage = (BOX_DOOR_AMOUNT + BOX_WALL_AMOUNT) * WEIGHT_CLASS_SMALL + + +/// The box full of inflatables /obj/item/storage/inflatable icon = 'modular_skyrat/modules/more_briefcases/icons/briefcases.dmi' name = "inflatable barrier box" desc = "Contains inflatable walls and doors." icon_state = "briefcase_inflate" w_class = WEIGHT_CLASS_NORMAL + storage_type = /datum/storage/inflatables_box /obj/item/storage/inflatable/Initialize(mapload) . = ..() - atom_storage.max_total_storage = 21 + atom_storage.set_holdable(typesof(/obj/item/inflatable)) /obj/item/storage/inflatable/PopulateContents() for(var/i = 0, i < BOX_DOOR_AMOUNT, i++) diff --git a/modular_skyrat/modules/large_doors/code/large_doors.dm b/modular_skyrat/modules/large_doors/code/large_doors.dm index 628543391c6..799968fcb8e 100644 --- a/modular_skyrat/modules/large_doors/code/large_doors.dm +++ b/modular_skyrat/modules/large_doors/code/large_doors.dm @@ -1,11 +1,32 @@ +/** + * Returns the size of the sprite in tiles. + * Takes the icon size and divides it by the world icon size (default 32). + * This gives the size of the sprite in tiles. + * + * @return size of the sprite in tiles + */ +/proc/get_size_in_tiles(obj/target) + var/icon/size_check = icon(target.icon, target.icon_state) + var/size = size_check.Width() / world.icon_size + + return size + /obj/machinery/door/airlock - var/multi_tile = FALSE - var/width = 1 + /// Whether or not the door is a multi-tile airlock. + var/multi_tile + /// A filler object used to fill the space of multi-tile airlocks. var/obj/airlock_filler_object/filler +/obj/machinery/door/airlock/Initialize(mapload) + . = ..() + multi_tile = get_size_in_tiles(src) > 1 + if(multi_tile) + set_bounds() + update_overlays() + /obj/machinery/door/airlock/Move() if(multi_tile) - SetBounds() + set_bounds() return ..() /obj/machinery/door/airlock/Destroy() @@ -14,35 +35,65 @@ filler = null return ..() -/obj/machinery/door/airlock/proc/SetBounds() +/** + * Sets the bounds of the airlock. For use with multi-tile airlocks. + * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. + * If the airlock doesn't already have a filler object, it will create one. + * If the airlock already has a filler object, it will move it to the correct location. + */ +/obj/machinery/door/airlock/proc/set_bounds() if(!multi_tile) return - if(dir in list(NORTH, SOUTH)) - bound_width = width * world.icon_size - bound_height = world.icon_size - if(!filler) - filler = new(get_step(src,EAST)) - filler.parent_airlock = src - else - filler.loc = get_step(src,EAST) + var/size = get_size_in_tiles(src) + bound_width = (get_adjusted_dir(dir) == NORTH) ? world.icon_size : size * world.icon_size + bound_height = (get_adjusted_dir(dir) == NORTH) ? size * world.icon_size : world.icon_size + if(!filler) + filler = new(get_step(src, get_adjusted_dir(dir))) + filler.parent_airlock = src else - bound_width = world.icon_size - bound_height = width * world.icon_size - if(!filler) - filler = new(get_step(src,NORTH)) - filler.parent_airlock = src - else - filler.loc = get_step(src,NORTH) + filler.loc = get_step(src, get_adjusted_dir(dir)) + filler.density = density filler.set_opacity(opacity) + +/** + * Checks which way the airlock is facing and adjusts the direction accordingly. + * For use with multi-tile airlocks. + * + * @param dir direction to adjust + * @return adjusted direction + */ +/obj/machinery/door/proc/get_adjusted_dir(dir) + if(dir in list(NORTH, SOUTH)) + return EAST + else + return NORTH + +/** + * Returns a list of turfs that the door occupies. + * If the door is multi-tile, it will return a list of turfs that the door occupies. + * If the door is not multi-tile, it will return only the current turf. + * + * @return list of turfs the door occupies + */ +/obj/machinery/door/airlock/proc/get_turfs() + var/turf/current_turf = get_turf(src) + if(!multi_tile) + return current_turf + var/list/occupied_turfs = list() + for(var/i in 1 to get_size_in_tiles(src)) + occupied_turfs += current_turf + current_turf = get_step(current_turf, get_adjusted_dir(dir)) + return occupied_turfs + + /obj/machinery/door/airlock/multi_tile multi_tile = TRUE - width = 2 has_environment_lights = FALSE /obj/machinery/door/airlock/multi_tile/glass - name = "Large Glass Airlock" + name = "large glass airlock" icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi' overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi' opacity = FALSE @@ -51,7 +102,7 @@ assemblytype = /obj/structure/door_assembly/multi_tile/glass /obj/machinery/door/airlock/multi_tile/metal - name = "Large Airlock" + name = "large airlock" icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi' overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi' assemblytype = /obj/structure/door_assembly/multi_tile/metal @@ -89,36 +140,50 @@ //ASSEMBLYS! /obj/structure/door_assembly/multi_tile dir = EAST - var/width = 1 + /// Whether or not the assembly is for a multi-tile airlock. + var/multi_tile /obj/structure/door_assembly/multi_tile/Initialize(mapload) . = ..() - update_dir() + multi_tile = get_size_in_tiles(src) > 1 + if(multi_tile) + set_bounds() + update_overlays() + /obj/structure/door_assembly/multi_tile/Move() . = ..() - update_dir() + set_bounds() + + +/** + * Updates the bounds of the airlock assembly + * Sets the bounds of the airlock assembly according to the direction. + * This ensures that the bounds are always correct, even if the airlock is rotated. + */ +/obj/structure/door_assembly/multi_tile/proc/set_bounds() + var/size = get_size_in_tiles(src) -/obj/structure/door_assembly/multi_tile/proc/update_dir() if(dir in list(NORTH, SOUTH)) - bound_width = width * world.icon_size + bound_width = size * world.icon_size bound_height = world.icon_size else bound_width = world.icon_size - bound_height = width * world.icon_size + bound_height = size * world.icon_size + /obj/structure/door_assembly/multi_tile/metal - name = "Large Airlock Assembly" + name = "large airlock assembly" + base_name = "large airlock" icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi' - base_name = "Large Airlock" overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi' airlock_type = /obj/machinery/door/airlock/multi_tile/metal glass_type = /obj/machinery/door/airlock/multi_tile/glass /obj/structure/door_assembly/multi_tile/glass - name = "Large Glass Airlock Assembly" + name = "large glass airlock assembly" + base_name = "large glass airlock" icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi' - base_name = "Large Glass Airlock" overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi' airlock_type = /obj/machinery/door/airlock/multi_tile/glass diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm index 98d6d745074..943f88fd8e2 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_turf.dm @@ -248,7 +248,7 @@ //Consider making all of these behaviours a smart component/element? Something that's only applied wherever it needs to be //Could probably have the variables on the turf level, and the behaviours being activated/deactived on the component level as the vars are updated /turf/open/CanPass(atom/movable/mover, turf/location) - if(isliving(mover)) + if(isliving(mover) && !(mover.movement_type & (FLYING | FLOATING))) var/turf/current_turf = get_turf(mover) if(current_turf && current_turf.turf_height - turf_height <= -TURF_HEIGHT_BLOCK_THRESHOLD) return FALSE diff --git a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm index 19c10d966ea..9757619e909 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/_loadout_datum.dm @@ -50,6 +50,8 @@ GLOBAL_LIST_EMPTY(all_loadout_datums) var/list/ckeywhitelist /// If set, is a list of job names of which can get the loadout item var/list/restricted_roles + /// If set, is a list of species which can get the loadout item + var/list/restricted_species /// Whether the item is restricted to supporters var/donator_only /// Whether the item requires a specific season in order to be available diff --git a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm index f81b1023eb0..9d7add3ca09 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm @@ -110,7 +110,7 @@ /datum/loadout_item/head/anahelm name = "Azulean's Enviro-Helmet" item_path = /obj/item/clothing/head/helmet/space/plasmaman/candlejax2 - ckeywhitelist = list("candlejax") +// ckeywhitelist = list("candlejax") /datum/loadout_item/under/jumpsuit/emissionsuit name = "Emission's Suit" @@ -120,7 +120,7 @@ /datum/loadout_item/under/jumpsuit/anasuit name = "Azulean's Enviro-Suit" item_path = /obj/item/clothing/under/plasmaman/candlejax2 - ckeywhitelist = list("candlejax") +// ckeywhitelist = list("candlejax") /datum/loadout_item/suit/jacket/cherno name = "Blue-Silvered Coat" @@ -153,9 +153,19 @@ //ckeywhitelist = list("enzoman") /datum/loadout_item/mask/nightlight_mask - name = "FAR-14C IRU" + name = "FIR-36 Rebreather" item_path = /obj/item/clothing/mask/gas/nightlight - //ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371") +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee") + +/datum/loadout_item/suit/brasspriest + name = "Brasspriest Coat" + item_path = /obj/item/clothing/suit/jacket/brasspriest +// ckeywhitelist = list("ChillyLobster") + +/datum/loadout_item/suit/hydrogenrobes + name = "Metallic-Hydrogen robes" + item_path = /obj/item/clothing/suit/jacket/hydrogenrobes +// ckeywhitelist = list("ChillyLobster") /datum/loadout_item/mask/kindle_mask name = "Kindle's mask" @@ -483,17 +493,17 @@ /datum/loadout_item/toys/CFBonnie name = "Chunko Fop: Blue Bunny Plushie" item_path = /obj/item/toy/plush/skyrat/chunko/bonnie - donator_only = TRUE +// donator_only = TRUE /datum/loadout_item/toys/CFAndrew name = "Chunko Fop: Green Bunny Plushie" item_path = /obj/item/toy/plush/skyrat/chunko/andrew - donator_only = TRUE +// donator_only = TRUE /datum/loadout_item/toys/CFInessa name = "Chunko Fop: Medical Bear Plushie" item_path = /obj/item/toy/plush/skyrat/chunko/inessa - donator_only = TRUE +// donator_only = TRUE /datum/loadout_item/toys/plushie_chiara name = "Commanding Fox Plushie" @@ -560,7 +570,7 @@ /datum/loadout_item/toys/plushie_razurath/second name = "Dwarf Shark Plushie" item_path = /obj/item/toy/plush/skyrat/plushie_razurath/second - ckeywhitelist = list("razurath") +// ckeywhitelist = list("razurath") /datum/loadout_item/toys/plushie_elofy name = "Bumbling Wolfgirl Plushie" @@ -570,23 +580,23 @@ /datum/loadout_item/suit/elofy name = "Solar Admiral Coat" item_path = /obj/item/clothing/suit/armor/hos/elofy - ckeywhitelist = list("october23") +// ckeywhitelist = list("october23") restricted_roles = list(JOB_HEAD_OF_SECURITY) /datum/loadout_item/gloves/elofy name = "Solar Admiral Gloves" item_path = /obj/item/clothing/gloves/elofy - ckeywhitelist = list("october23") +// ckeywhitelist = list("october23") /datum/loadout_item/shoes/elofy name = "Solar Admiral Boots" item_path = /obj/item/clothing/shoes/jackboots/elofy - ckeywhitelist = list("october23") +// ckeywhitelist = list("october23") /datum/loadout_item/pocket_items/transponder name = "Broken Helian Transponder" item_path = /obj/item/donator/transponder - ckeywhitelist = list("glacii") +// ckeywhitelist = list("glacii") /datum/loadout_item/glasses/goldaviator name = "Purple and Gold Aviators" @@ -682,14 +692,14 @@ /datum/loadout_item/suit/colorblockhoodie name = "Color-Block Hoodie" item_path = /obj/item/clothing/suit/hooded/colorblockhoodie - ckeywhitelist = list("lolpopomg101") +// ckeywhitelist = list("lolpopomg101") /datum/loadout_item/inhand/officialcat name = "Official Cat Stamp" item_path = /obj/item/stamp/cat - ckeywhitelist = list("kathrinbailey") +// ckeywhitelist = list("kathrinbailey") /datum/loadout_item/inhand/hardlight_wheelchair name = "Hardlight Wheelchair Projector" item_path = /obj/item/holosign_creator/hardlight_wheelchair - ckeywhitelist = list("sqnztb") +// ckeywhitelist = list("sqnztb") diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm index 87f46bdfbe4..f48b9341ffa 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_heads.dm @@ -292,6 +292,10 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea name = "Witch Hat" item_path = /obj/item/clothing/head/wizard/marisa/fake +/datum/loadout_item/head/akula_helmet + name = "Shoredress Helmet" + item_path = /obj/item/clothing/head/helmet/space/akula_wetsuit + /* * MISC */ @@ -537,6 +541,18 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea item_path = /obj/item/clothing/head/hats/imperial/white restricted_roles = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_RESEARCH_DIRECTOR, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_CHIEF_ENGINEER) +/datum/loadout_item/head/azulea_oldblood + name = "Oldblood's Royal cap" + item_path = /obj/item/clothing/head/hats/caphat/azulean/old_blood + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/head/azulea_upstart + name = "Upstart's Noble cap" + item_path = /obj/item/clothing/head/hats/caphat/azulean/upstart + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + /* * JOB BERETS */ diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm index 78859a46803..021923154eb 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_inhands.dm @@ -94,3 +94,7 @@ GLOBAL_LIST_INIT(loadout_inhand_items, generate_loadout_items(/datum/loadout_ite /datum/loadout_item/inhand/flag_nri name = "Folded Novaya Rossiyskaya Imperiya Flag" item_path = /obj/item/sign/flag/nri + +/datum/loadout_item/inhand/flag_azulea + name = "Folded Azulea Flag" + item_path = /obj/item/sign/flag/azulea diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm index 14d4db86d37..a92764d3074 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_masks.dm @@ -137,3 +137,16 @@ GLOBAL_LIST_INIT(loadout_masks, generate_loadout_items(/datum/loadout_item/mask) /datum/loadout_item/mask/balaclava name = "Balaclava" item_path = /obj/item/clothing/mask/balaclava + + +/* +* DONATOR +*/ + +/datum/loadout_item/mask/donator + donator_only = TRUE + + +/datum/loadout_item/mask/donator/nightlight_mask/alldono + name = "Commercial FIR-36 Rebreather" + item_path = /obj/item/clothing/mask/gas/nightlight/alldono diff --git a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm index 125caf12e78..75a8d094faa 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/under/loadout_datum_under.dm @@ -59,6 +59,10 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Rainbow Jumpskirt" item_path = /obj/item/clothing/under/color/jumpskirt/rainbow +/datum/loadout_item/under/jumpsuit/akula_wetsuit + name = "Shoredress Wetsuit" + item_path = /obj/item/clothing/under/akula_wetsuit + /datum/loadout_item/under/jumpsuit/impcap name = "Captain's Naval Jumpsuit" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial @@ -859,6 +863,30 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Green Pencilskirt" item_path = /obj/item/clothing/under/suit/skyrat/pencil/green +/datum/loadout_item/under/formal/azulea_oldblood + name = " Oldblood's Royal regalia" + item_path = /obj/item/clothing/under/rank/azulean/old_blood + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_oldblood/skirt + name = " Oldblood's Royal regalia (Skirt)" + item_path = /obj/item/clothing/under/rank/azulean/old_blood/skirt + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_upstart + name = "Upstart's Noble Getup" + item_path = /obj/item/clothing/under/rank/azulean/upstart + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + +/datum/loadout_item/under/formal/azulea_upstart/skirt + name = "Upstart's Noble Getup (Skirt)" + item_path = /obj/item/clothing/under/rank/azulean/upstart/skirt + restricted_roles = list(JOB_CAPTAIN, JOB_NT_REP) + restricted_species = list(SPECIES_AKULA) + /// DONATOR /datum/loadout_item/under/donator donator_only = TRUE diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm index 0fbdb262446..3603301a758 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_manager.dm @@ -100,6 +100,7 @@ if("display_restrictions") display_job_restrictions(interacted_item) + display_species_restrictions(interacted_item) // Clears the loadout list entirely. if("clear_all_items") @@ -225,12 +226,23 @@ owner.prefs.loadout_list[item.item_path] -= INFO_NAMED /datum/loadout_manager/proc/display_job_restrictions(datum/loadout_item/item) + if(!length(item.restricted_roles)) + return var/composed_message = span_boldnotice("The [initial(item.item_path.name)] is restricted to the following roles:
") for(var/job_type in item.restricted_roles) composed_message += span_green("[job_type]
") to_chat(owner, examine_block(composed_message)) +/// If only a certain species is allowed to equip this loadout item, display which +/datum/loadout_manager/proc/display_species_restrictions(datum/loadout_item/item) + if(!length(item.restricted_species)) + return + var/composed_message = span_boldnotice("\The [initial(item.item_path.name)] is restricted to the following species:
") + for(var/species_type in item.restricted_species) + composed_message += span_green("[species_type]
") + + to_chat(owner, examine_block(composed_message)) /// Rotate the dummy [DIR] direction, or reset it to SOUTH dir if we're showing all dirs at once. /datum/loadout_manager/proc/rotate_model_dir(dir) @@ -330,6 +342,7 @@ formatted_item["is_greyscale"] = !!(initial(loadout_atom.greyscale_config) && initial(loadout_atom.greyscale_colors) && (initial(loadout_atom.flags_1) & IS_PLAYER_COLORABLE_1)) formatted_item["is_renamable"] = item.can_be_named formatted_item["is_job_restricted"] = !isnull(item.restricted_roles) + formatted_item["is_species_restricted"] = !isnull(item.restricted_species) formatted_item["is_donator_only"] = !isnull(item.donator_only) formatted_item["is_ckey_whitelisted"] = !isnull(item.ckeywhitelist) if(LAZYLEN(item.additional_tooltip_contents)) diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm index 5fdf41fe2db..fc75d9688f1 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm @@ -44,6 +44,11 @@ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!")) continue + if(item.restricted_species && !(dna.species.id in item.restricted_species)) + if(client) + to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!")) + continue + new item.item_path(briefcase) briefcase.name = "[preference_source.read_preference(/datum/preference/name/real_name)]'s travel suitcase" @@ -56,6 +61,11 @@ to_chat(src, span_warning("You were unable to get a loadout item([initial(item.item_path.name)]) due to job restrictions!")) continue + if(item.restricted_species && !(dna.species.id in item.restricted_species)) + if(client) + to_chat(src, span_warning("You were unable to get a loadout item ([initial(item.item_path.name)]) due to species restrictions!")) + continue + // Make sure the item is not overriding an important for life outfit item var/datum/outfit/outfit_important_for_life = dna.species.outfit_important_for_life if(!outfit_important_for_life || !item.pre_equip_item(equipped_outfit, outfit_important_for_life, src, visuals_only)) diff --git a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm index fd20246128f..d28efa3e119 100644 --- a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm +++ b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm @@ -43,7 +43,7 @@ /obj/item/gun/ballistic/shotgun/toy/give_manufacturer_examine() AddComponent(/datum/component/manufacturer_examine, COMPANY_DONK) -/obj/item/gun/ballistic/rifle/boltaction/quartermaster/give_manufacturer_examine() +/obj/item/gun/ballistic/rifle/boltaction/sporterized/give_manufacturer_examine() return /obj/item/gun/ballistic/rifle/boltaction/prime/give_manufacturer_examine() diff --git a/modular_skyrat/modules/marines/code/mod.dm b/modular_skyrat/modules/marines/code/mod.dm index 07a91c48ccd..33d432ca198 100644 --- a/modular_skyrat/modules/marines/code/mod.dm +++ b/modular_skyrat/modules/marines/code/mod.dm @@ -26,7 +26,7 @@ /obj/item/assembly/flash, /obj/item/melee/baton, /obj/item/gun/ballistic, - /obj/item/melee/hammer, + /obj/item/melee/breaching_hammer, ) skins = list( "marine" = list( diff --git a/modular_skyrat/modules/modular_ert/code/marine_override/modified_equipment.dm b/modular_skyrat/modules/modular_ert/code/marine_override/modified_equipment.dm index d1485e30c22..ce899b18fc8 100644 --- a/modular_skyrat/modules/modular_ert/code/marine_override/modified_equipment.dm +++ b/modular_skyrat/modules/modular_ert/code/marine_override/modified_equipment.dm @@ -43,7 +43,7 @@ r_hand = null /datum/outfit/centcom/ert/marine/engineer //engineer - suit_store = /obj/item/melee/hammer //doesn't need a rifle + suit_store = /obj/item/melee/breaching_hammer //doesn't need a rifle back = /obj/item/mod/control/pre_equipped/marine/engineer backpack_contents = list( /obj/item/storage/box/survival/engineer/marine = 1, diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm index 9c660f5f7db..fc26b143b91 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm @@ -397,5 +397,8 @@ GLOBAL_LIST_EMPTY(soulcatchers) if(!soulcatcher_action_given) return + if(locate(/datum/action/innate/join_soulcatcher) in actions) + return + var/datum/action/innate/join_soulcatcher/new_join_action = new new_join_action.Grant(src) diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm index 0db14835713..7f2acf6ddde 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm @@ -21,6 +21,8 @@ var/able_to_emote = TRUE /// Is the soul able to speak inside the soulcatcher room? var/able_to_speak = TRUE + /// Is the soul able to change their own name? + var/able_to_rename = TRUE /// Is the soul able to leave the soulcatcher? var/able_to_leave = TRUE @@ -40,6 +42,11 @@ var/datum/action/innate/leave_soulcatcher/leave_action = new leave_action.Grant(src) + var/datum/action/innate/soulcatcher_user/soulcatcher_action = new + soulcatcher_action.Grant(src) + var/datum/component/soulcatcher_user/user_component = AddComponent(/datum/component/soulcatcher_user) + soulcatcher_action.soulcatcher_user_component = WEAKREF(user_component) + /// Toggles whether or not the soul inside the soulcatcher can see the outside world. Returns the state of the `outside_sight` variable. /mob/living/soulcatcher_soul/proc/toggle_sight() outside_sight = !outside_sight @@ -60,6 +67,21 @@ return outside_hearing +/// Changes the soul's name based off `new_name`. Returns `TRUE` if the name has been changed, otherwise returns `FALSE`. +/mob/living/soulcatcher_soul/proc/change_name(new_name) + if(!new_name || (round_participant && body_scan_needed)) + return FALSE + + name = new_name + return TRUE + +/// Attempts to reset the soul's name to it's name in prefs. Returns `TRUE` if the name is reset, otherwise returns `FALSE`. +/mob/living/soulcatcher_soul/proc/reset_name() + if(!mind?.name || change_name(mind.name)) + return FALSE + + return TRUE + /// Checks if the mob wants to leave the soulcatcher. If they do and are able to leave, they are booted out. /mob/living/soulcatcher_soul/verb/leave_soulcatcher() set name = "Leave Soulcatcher" @@ -172,3 +194,20 @@ return FALSE parent_soul.leave_soulcatcher() + +/datum/action/innate/soulcatcher_user + name = "Soulcatcher" + background_icon = 'modular_skyrat/master_files/icons/mob/actions/action_backgrounds.dmi' + background_icon_state = "android" + button_icon = 'modular_skyrat/master_files/icons/mob/actions/actions_nif.dmi' + button_icon_state = "soulcatcher" + /// What soulcatcher user component are we bringing up the menu for? + var/datum/weakref/soulcatcher_user_component + +/datum/action/innate/soulcatcher_user/Activate() + . = ..() + var/datum/component/soulcatcher_user/user_component = soulcatcher_user_component.resolve() + if(!user_component) + return FALSE + + user_component.ui_interact(owner) diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm index b553d5188bf..b59cee1f7ad 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_tgui.dm @@ -38,7 +38,9 @@ "outside_sight" = soul.outside_sight, "able_to_emote" = soul.able_to_emote, "able_to_speak" = soul.able_to_speak, - "ooc_notes" = soul.ooc_notes + "able_to_rename" = soul.able_to_rename, + "ooc_notes" = soul.ooc_notes, + "scan_needed" = soul.body_scan_needed, ) room_data["souls"] += list(soul_list) @@ -189,6 +191,24 @@ return TRUE + if("toggle_soul_renaming") + target_soul.able_to_rename = !target_soul.able_to_rename + return TRUE + + if("change_name") + var/new_name = tgui_input_text(usr, "Enter a new name for [target_soul]", "Soulcatcher", target_soul) + if(!new_name) + return FALSE + + target_soul.change_name(new_name) + return TRUE + + if("reset_name") + if(tgui_alert(usr, "Do you wish to reset [target_soul]'s name to default?", "Soulcatcher", list("Yes", "No")) != "Yes") + return FALSE + + target_soul.reset_name() + if("send_message") var/message_to_send = "" var/emote = params["emote"] @@ -203,3 +223,90 @@ target_room.send_message(message_to_send, message_sender, emote) return TRUE + +/datum/component/soulcatcher_user/New() + . = ..() + var/mob/living/soulcatcher_soul/parent_soul = parent + if(!istype(parent_soul)) + return COMPONENT_INCOMPATIBLE + + return TRUE + +/datum/component/soulcatcher_user/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(usr, src, ui) + if(!ui) + ui = new(usr, src, "SoulcatcherUser") + ui.open() + +/datum/component/soulcatcher_user/ui_state(mob/user) + return GLOB.conscious_state + +/datum/component/soulcatcher_user/ui_data(mob/user) + var/list/data = list() + + var/mob/living/soulcatcher_soul/user_soul = parent + if(!istype(user_soul)) + return FALSE //uhoh + + data["user_data"] = list( + "name" = user_soul.name, + "description" = user_soul.soul_desc, + "reference" = REF(user_soul), + "internal_hearing" = user_soul.internal_hearing, + "internal_sight" = user_soul.internal_sight, + "outside_hearing" = user_soul.outside_hearing, + "outside_sight" = user_soul.outside_sight, + "able_to_emote" = user_soul.able_to_emote, + "able_to_speak" = user_soul.able_to_speak, + "able_to_rename" = user_soul.able_to_rename, + "ooc_notes" = user_soul.ooc_notes, + "scan_needed" = user_soul.body_scan_needed, + ) + + var/datum/soulcatcher_room/current_room = user_soul.current_room.resolve() + data["current_room"] = list( + "name" = html_decode(current_room.name), + "description" = html_decode(current_room.room_description), + "reference" = REF(current_room), + "color" = current_room.room_color, + "owner" = current_room.outside_voice, + ) + + for(var/mob/living/soulcatcher_soul/soul in current_room.current_souls) + if(soul == user_soul) + continue + + var/list/soul_list = list( + "name" = soul.name, + "description" = soul.soul_desc, + "ooc_notes" = soul.ooc_notes, + "reference" = REF(soul), + ) + data["souls"] += list(soul_list) + + return data + +/datum/component/soulcatcher_user/ui_act(action, list/params) + . = ..() + if(.) + return + + var/mob/living/soulcatcher_soul/user_soul = parent + if(!istype(user_soul)) + return FALSE + + switch(action) + if("change_name") + var/new_name = tgui_input_text(usr, "Enter a new name", "Soulcatcher", user_soul.name) + if(!new_name) + return FALSE + + user_soul.change_name(new_name) + return TRUE + + if("reset_name") + if(tgui_alert(usr, "Do you wish to reset your name to default?", "Soulcatcher", list("Yes", "No")) != "Yes") + return FALSE + + user_soul.reset_name() + diff --git a/modular_skyrat/modules/organs/icons/akula_eyes.dmi b/modular_skyrat/modules/organs/icons/akula_eyes.dmi new file mode 100644 index 00000000000..518ee0440c1 Binary files /dev/null and b/modular_skyrat/modules/organs/icons/akula_eyes.dmi differ diff --git a/modular_skyrat/modules/sec_haul/code/misc/vending.dm b/modular_skyrat/modules/sec_haul/code/misc/vending.dm index 442d89b4cb9..63acadc1926 100644 --- a/modular_skyrat/modules/sec_haul/code/misc/vending.dm +++ b/modular_skyrat/modules/sec_haul/code/misc/vending.dm @@ -3,10 +3,6 @@ desc = "An Armadyne peacekeeper equipment vendor." product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" icon = 'modular_skyrat/modules/sec_haul/icons/vending/vending.dmi' - icon_state = "sec" - icon_deny = "sec-deny" - light_mask = "sec-light-mask" - req_access = list(ACCESS_SECURITY) products = list( /obj/item/restraints/handcuffs = 8, /obj/item/restraints/handcuffs/cable/zipties = 12, @@ -17,10 +13,6 @@ /obj/item/flashlight/seclite = 6, /obj/item/restraints/legcuffs/bola/energy = 10, ) - contraband = list( - /obj/item/clothing/glasses/sunglasses = 2, - /obj/item/storage/fancy/donut_box = 2, - ) premium = list( /obj/item/storage/belt/security/webbing = 4, /obj/item/storage/belt/security/webbing/peacekeeper = 4, @@ -32,18 +24,6 @@ /obj/item/watertank/pepperspray = 2 ) refill_canister = /obj/item/vending_refill/security_peacekeeper - default_price = PAYCHECK_CREW - extra_price = PAYCHECK_COMMAND * 1.5 - payment_department = ACCOUNT_SEC - -/obj/machinery/vending/security/pre_throw(obj/item/I) - if(istype(I, /obj/item/grenade)) - var/obj/item/grenade/G = I - G.arm_grenade() - else if(istype(I, /obj/item/flashlight)) - var/obj/item/flashlight/F = I - F.on = TRUE - F.update_brightness() /obj/item/vending_refill/security_peacekeeper icon_state = "refill_sec" diff --git a/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_hammer.dm b/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_hammer.dm index a4319105220..37bf649b7fd 100644 --- a/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_hammer.dm +++ b/modular_skyrat/modules/sec_haul/code/peacekeeper/peacekeeper_hammer.dm @@ -1,4 +1,4 @@ -/obj/item/melee/hammer +/obj/item/melee/breaching_hammer name = "D-4 tactical hammer" desc = "A metallic-plastic composite breaching hammer, looks like a whack with this would severly harm or tire someone." icon = 'modular_skyrat/modules/sec_haul/icons/peacekeeper/peacekeeper_items.dmi' @@ -26,7 +26,11 @@ /// the amount that the force is multiplied by , that is then applied as damage to the door. var/breaching_multipler = 2.5 -/obj/item/melee/hammer/afterattack(atom/target, mob/user, proximity) +/obj/item/melee/breaching_hammer/Initialize(mapload) + . = ..() + AddElement(/datum/element/kneecapping) + +/obj/item/melee/breaching_hammer/afterattack(atom/target, mob/user, proximity) . = ..() if(!proximity) return @@ -42,7 +46,7 @@ breaching_target = target /// Removes any form of tracking from the user and the item , make sure to call it on he proper item -/obj/item/melee/hammer/proc/remove_track(mob/living/carbon/human/user) +/obj/item/melee/breaching_hammer/proc/remove_track(mob/living/carbon/human/user) SIGNAL_HANDLER if(!registered) return FALSE @@ -55,7 +59,7 @@ breacher = null /// Does the checks for breaching -/obj/item/melee/hammer/proc/try_breaching(obj/target, mob/living/carbon/human/user) +/obj/item/melee/breaching_hammer/proc/try_breaching(obj/target, mob/living/carbon/human/user) SIGNAL_HANDLER if(breaching || (user == breacher)) return FALSE @@ -64,20 +68,20 @@ return NONE var/mob/living/carbon/human/breach_buddy = breacher var/target_item = breach_buddy.held_items.Find(src, 1, 0) - var/obj/item/melee/hammer/second_hammer = null + var/obj/item/melee/breaching_hammer/second_hammer = null if(target_item) second_hammer = breach_buddy.held_items[target_item] if(!second_hammer) remove_track(user) return FALSE breaching = TRUE - INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/item/melee/hammer, breaching_loop ), user, target) - INVOKE_ASYNC(second_hammer, TYPE_PROC_REF(/obj/item/melee/hammer, breaching_loop ), breacher, target) + INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/item/melee/breaching_hammer, breaching_loop ), user, target) + INVOKE_ASYNC(second_hammer, TYPE_PROC_REF(/obj/item/melee/breaching_hammer, breaching_loop ), breacher, target) to_chat(breacher , text = "You begin forcefully smashing the [target]") to_chat(user, text = "You begin forcefully smashing the [target]") /// Keeps looping under the door is no more , or someone moves , gets shot , dies , incapacitated , stunned , etc -/obj/item/melee/hammer/proc/breaching_loop(mob/living/user, obj/target) +/obj/item/melee/breaching_hammer/proc/breaching_loop(mob/living/user, obj/target) if(user.stat || !target) remove_track(user) return FALSE diff --git a/modular_skyrat/modules/station_traits/code/station_traits.dm b/modular_skyrat/modules/station_traits/code/station_traits.dm index 6842cd1ad3e..40643bd75f7 100644 --- a/modular_skyrat/modules/station_traits/code/station_traits.dm +++ b/modular_skyrat/modules/station_traits/code/station_traits.dm @@ -20,4 +20,4 @@ log_game("[src.name] attempted to run, but was disabled.") /datum/station_trait/birthday - weight = 10 + weight = 3 diff --git a/modular_skyrat/modules/time_clock/code/console_tgui.dm b/modular_skyrat/modules/time_clock/code/console_tgui.dm index 98ba0ec5ef2..06869536fb7 100644 --- a/modular_skyrat/modules/time_clock/code/console_tgui.dm +++ b/modular_skyrat/modules/time_clock/code/console_tgui.dm @@ -46,7 +46,7 @@ /obj/item/defibrillator/compact/loaded, \ /obj/item/storage/hypospraykit/cmo, \ /obj/item/mod/control/pre_equipped/rescue, \ - /obj/item/gun/ballistic/rifle/boltaction/quartermaster, \ + /obj/item/gun/ballistic/rifle/boltaction/sporterized, \ /obj/item/clothing/glasses/hud/gun_permit/sunglasses, \ /obj/item/card/id/departmental_budget/car, \ /obj/item/clothing/suit/armor/reactive/teleport, \ diff --git a/sound/ambience/ambispace5.ogg b/sound/ambience/ambispace5.ogg new file mode 100644 index 00000000000..df8dd5b87d1 Binary files /dev/null and b/sound/ambience/ambispace5.ogg differ diff --git a/sound/items/barcodebeep.ogg b/sound/items/barcodebeep.ogg new file mode 100644 index 00000000000..e1939537fb9 Binary files /dev/null and b/sound/items/barcodebeep.ogg differ diff --git a/sound/items/click.ogg b/sound/items/click.ogg new file mode 100644 index 00000000000..366ed0f8cc1 Binary files /dev/null and b/sound/items/click.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index b712297dc19..3fb758dd87a 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -141,6 +141,7 @@ As an Engineer, your departmental protolathe and circuit printer can manufacture As an Engineer, your RCD can be reloaded with iron, glass or plasteel sheets instead of just compressed matter cartridges. As an Engineering Cyborg, you can attach air alarm/fire alarm/APC frames to walls by placing them on the floor and using a screwdriver on them. As the AI, you can click on people's names to look at them. This only works if there are cameras that can see them, they aren't wearing agent IDs and aren't using digital camouflage as changelings. +As the AI, you can emote to change the status displays near your core. Some emotes can even be used to change the status displays across the entire station. As the AI, you can quickly open and close doors by holding shift while clicking them, bolt them when holding ctrl, and even shock them while holding alt. As the AI, you can take pictures with your camera and upload them to newscasters. As the AI, you can use CTRL + 1-9 to set a location hotkey for your camera, allowing you to save the location and jump to it at will. Tilde and zero will return you to the last spot you jumped from, and the numpad numbers act as aliases to the regular number keys. diff --git a/tgstation.dme b/tgstation.dme index a59b1d85055..fec2ca013a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1,6 +1,7 @@ // DM Environment file for tgstation.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. +// interface\skin.dmf needs to be at the very end of the file. // BEGIN_INTERNALS // END_INTERNALS @@ -412,6 +413,7 @@ #include "code\__DEFINES\~skyrat_defines\_globalvars\lists\mapping.dm" #include "code\__DEFINES\~skyrat_defines\_HELPERS\atmos_mapping_helpers.dm" #include "code\__DEFINES\~skyrat_defines\_HELPERS\lighting.dm" +#include "code\__DEFINES\~skyrat_defines\_HELPERS\offset_index.dm" #include "code\__DEFINES\~~bubber_defines\access.dm" #include "code\__DEFINES\~~bubber_defines\jobs.dm" #include "code\__DEFINES\~~bubber_defines\quirk_whitelist.dm" @@ -726,6 +728,7 @@ #include "code\controllers\subsystem\processing\aura_healing.dm" #include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\conveyors.dm" +#include "code\controllers\subsystem\processing\digital_clock.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fire_burning.dm" #include "code\controllers\subsystem\processing\greyscale.dm" @@ -1346,6 +1349,7 @@ #include "code\datums\elements\unfriend_attacker.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" +#include "code\datums\elements\uplink_reimburse.dm" #include "code\datums\elements\venomous.dm" #include "code\datums\elements\volatile_gas_storage.dm" #include "code\datums\elements\waddling.dm" @@ -1642,6 +1646,7 @@ #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" #include "code\game\machinery\deployable.dm" +#include "code\game\machinery\digital_clock.dm" #include "code\game\machinery\dish_drive.dm" #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\droneDispenser.dm" @@ -1656,6 +1661,7 @@ #include "code\game\machinery\hologram.dm" #include "code\game\machinery\hypnochair.dm" #include "code\game\machinery\igniter.dm" +#include "code\game\machinery\incident_display.dm" #include "code\game\machinery\iv_drip.dm" #include "code\game\machinery\launch_pad.dm" #include "code\game\machinery\lightswitch.dm" @@ -3140,6 +3146,8 @@ #include "code\modules\client\preferences\admin.dm" #include "code\modules\client\preferences\age.dm" #include "code\modules\client\preferences\ai_core_display.dm" +#include "code\modules\client\preferences\ai_emote_display.dm" +#include "code\modules\client\preferences\ai_hologram_display.dm" #include "code\modules\client\preferences\ambient_occlusion.dm" #include "code\modules\client\preferences\assets.dm" #include "code\modules\client\preferences\auto_fit_viewport.dm" @@ -4237,6 +4245,7 @@ #include "code\modules\mob\living\silicon\silicon_defense.dm" #include "code\modules\mob\living\silicon\silicon_movement.dm" #include "code\modules\mob\living\silicon\silicon_say.dm" +#include "code\modules\mob\living\silicon\ai\_preferences.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" @@ -5285,6 +5294,7 @@ #include "code\modules\vending\nutrimax.dm" #include "code\modules\vending\plasmaresearch.dm" #include "code\modules\vending\robotics.dm" +#include "code\modules\vending\runic_vendor.dm" #include "code\modules\vending\security.dm" #include "code\modules\vending\snack.dm" #include "code\modules\vending\sovietsoda.dm" @@ -5427,10 +5437,13 @@ #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\ze_genesis_call\genesis_call.dm" -#include "interface\fonts.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" +#include "interface\fonts\fonts_datum.dm" +#include "interface\fonts\grand_9k.dm" +#include "interface\fonts\tiny_unicode.dm" +#include "interface\fonts\vcr_osd_mono.dm" #include "interface\skin.dmf" #include "modular_skyrat\master_files\code\_globalvars\configuration.dm" #include "modular_skyrat\master_files\code\_globalvars\religion.dm" @@ -5455,6 +5468,7 @@ #include "modular_skyrat\master_files\code\datums\id_trim\jobs.dm" #include "modular_skyrat\master_files\code\datums\id_trim\solfed.dm" #include "modular_skyrat\master_files\code\datums\id_trim\syndicate.dm" +#include "modular_skyrat\master_files\code\datums\mood_events\generic_negative_events.dm" #include "modular_skyrat\master_files\code\datums\mood_events\needs_events.dm" #include "modular_skyrat\master_files\code\datums\mutations\_mutations.dm" #include "modular_skyrat\master_files\code\datums\mutations\hulk.dm" @@ -5514,6 +5528,7 @@ #include "modular_skyrat\master_files\code\modules\buildmode\bm_mode.dm" #include "modular_skyrat\master_files\code\modules\buildmode\submodes\offercontrol.dm" #include "modular_skyrat\master_files\code\modules\cargo\exports\traitor.dm" +#include "modular_skyrat\master_files\code\modules\cargo\markets\market_items\weapons.dm" #include "modular_skyrat\master_files\code\modules\client\playtime.dm" #include "modular_skyrat\master_files\code\modules\client\preferences.dm" #include "modular_skyrat\master_files\code\modules\client\preferences_savefile.dm" @@ -5546,7 +5561,6 @@ #include "modular_skyrat\master_files\code\modules\client\preferences\middleware\species_additional_changes.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\species_features\digitigrade_legs.dm" #include "modular_skyrat\master_files\code\modules\client\preferences\species_features\generate_side_shots.dm" -#include "modular_skyrat\master_files\code\modules\client\preferences\species_features\pod.dm" #include "modular_skyrat\master_files\code\modules\clothing\anthro_clothes.dm" #include "modular_skyrat\master_files\code\modules\clothing\base_clothes.dm" #include "modular_skyrat\master_files\code\modules\clothing\chameleon.dm" @@ -5561,6 +5575,7 @@ #include "modular_skyrat\master_files\code\modules\clothing\glasses\_glasses.dm" #include "modular_skyrat\master_files\code\modules\clothing\glasses\nerve_staple.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\_head.dm" +#include "modular_skyrat\master_files\code\modules\clothing\head\akula_official.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\cowboy.dm" #include "modular_skyrat\master_files\code\modules\clothing\head\monkey_magnification_helmet.dm" #include "modular_skyrat\master_files\code\modules\clothing\masks\_masks.dm" @@ -5571,9 +5586,12 @@ #include "modular_skyrat\master_files\code\modules\clothing\shoes\wheelys.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\_suits.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\labcoat.dm" +#include "modular_skyrat\master_files\code\modules\clothing\suits\skinsuits.dm" #include "modular_skyrat\master_files\code\modules\clothing\suits\wintercoats.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\_under.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\accessories.dm" +#include "modular_skyrat\master_files\code\modules\clothing\under\akula_jobs.dm" +#include "modular_skyrat\master_files\code\modules\clothing\under\akula_official.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\color.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\costume.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\misc.dm" @@ -5593,6 +5611,7 @@ #include "modular_skyrat\master_files\code\modules\food_and_drinks\recipes\food_mixtures.dm" #include "modular_skyrat\master_files\code\modules\jobs\departments\departments.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\_job.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\_job_attire.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\blackmarket.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\chaplain.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\clown.dm" @@ -5708,6 +5727,7 @@ #include "modular_skyrat\modules\aesthetics\flag\code\signs_flags.dm" #include "modular_skyrat\modules\aesthetics\floors\code\floors.dm" #include "modular_skyrat\modules\aesthetics\furniture\bed.dm" +#include "modular_skyrat\modules\aesthetics\guns\code\conversion_kits.dm" #include "modular_skyrat\modules\aesthetics\guns\code\guns.dm" #include "modular_skyrat\modules\aesthetics\guns\code\magazine.dm" #include "modular_skyrat\modules\aesthetics\heater\code\spaceheater.dm" @@ -5728,7 +5748,6 @@ #include "modular_skyrat\modules\aesthetics\spaceship_navigation_beacon\spaceship_navigation_beacon.dm" #include "modular_skyrat\modules\aesthetics\stationobjs\stationobjs.dm" #include "modular_skyrat\modules\aesthetics\status_display\code\status_display.dm" -#include "modular_skyrat\modules\aesthetics\stock_parts\stock_parts.dm" #include "modular_skyrat\modules\aesthetics\storage\storage.dm" #include "modular_skyrat\modules\aesthetics\surgery\surgery.dm" #include "modular_skyrat\modules\aesthetics\syringe\syringe.dm" @@ -5739,6 +5758,7 @@ #include "modular_skyrat\modules\aesthetics\washing_machine\code\washing_machine.dm" #include "modular_skyrat\modules\aesthetics\windows\code\windows.dm" #include "modular_skyrat\modules\airlock_override\code\airlock_override.dm" +#include "modular_skyrat\modules\akula\code\wetsuit.dm" #include "modular_skyrat\modules\alerts\code\alert_sound_to_playing.dm" #include "modular_skyrat\modules\alerts\code\config.dm" #include "modular_skyrat\modules\alerts\code\default_announcer.dm" @@ -5898,6 +5918,7 @@ #include "modular_skyrat\modules\bluespace_miner\code\bluespace_miner.dm" #include "modular_skyrat\modules\bodyparts\code\_mutant_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\akula_bodyparts.dm" +#include "modular_skyrat\modules\bodyparts\code\aquatic_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\ghoul_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\golem_bodyparts.dm" #include "modular_skyrat\modules\bodyparts\code\human_bodyparts.dm" @@ -6139,6 +6160,7 @@ #include "modular_skyrat\modules\customization\modules\clothing\neck\_neck.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\cloaks.dm" #include "modular_skyrat\modules\customization\modules\clothing\neck\collars.dm" +#include "modular_skyrat\modules\customization\modules\clothing\outfits\akula.dm" #include "modular_skyrat\modules\customization\modules\clothing\outfits\vox.dm" #include "modular_skyrat\modules\customization\modules\clothing\shoes\shoes.dm" #include "modular_skyrat\modules\customization\modules\clothing\storage\backpacks.dm" @@ -6191,6 +6213,7 @@ #include "modular_skyrat\modules\customization\modules\language\siiktajr.dm" #include "modular_skyrat\modules\customization\modules\language\skrell.dm" #include "modular_skyrat\modules\customization\modules\language\spacer.dm" +#include "modular_skyrat\modules\customization\modules\language\te_velu_akko.dm" #include "modular_skyrat\modules\customization\modules\language\terrum.dm" #include "modular_skyrat\modules\customization\modules\language\vox.dm" #include "modular_skyrat\modules\customization\modules\language\xerxian.dm" @@ -6199,6 +6222,7 @@ #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\sprite_accessories.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_marking_sets.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings.dm" +#include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_akula.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_moth.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_synthliz.dm" #include "modular_skyrat\modules\customization\modules\mob\dead\new_player\body_markings\body_markings_vox.dm" @@ -6282,6 +6306,7 @@ #include "modular_skyrat\modules\customization\modules\surgery\organs\neck_accessory.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\nif.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\organ.dm" +#include "modular_skyrat\modules\customization\modules\surgery\organs\pod.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\skrell_hair.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\spines.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\synth_antenna.dm" diff --git a/tgui/packages/tgui/interfaces/Cargo.js b/tgui/packages/tgui/interfaces/Cargo.js index 7a29a4948b5..2850272932c 100644 --- a/tgui/packages/tgui/interfaces/Cargo.js +++ b/tgui/packages/tgui/interfaces/Cargo.js @@ -276,7 +276,6 @@ export const CargoCatalog = (props, context) => { onClick={() => act('add', { id: pack.id, - amount: 1, }) }> {formatMoney( diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx index 578feadb8e2..bbef2ad3f87 100644 --- a/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx +++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialAccessBar.tsx @@ -1,6 +1,6 @@ import { sortBy } from 'common/collections'; import { classes } from 'common/react'; -import { useLocalState } from '../../backend'; +import { useLocalState, useBackend } from '../../backend'; import { Flex, Button, Stack, AnimatedNumber } from '../../components'; import { formatSiUnit } from '../../format'; import { MaterialIcon } from './MaterialIcon'; @@ -72,6 +72,8 @@ type MaterialCounterProps = { const MaterialCounter = (props: MaterialCounterProps, context) => { const { material, onEjectRequested } = props; + const { data } = useBackend(context); + const { SHEET_MATERIAL_AMOUNT } = data; const [hovering, setHovering] = useLocalState( context, @@ -79,7 +81,7 @@ const MaterialCounter = (props: MaterialCounterProps, context) => { false ); - const canEject = material.amount > 2_000; + const canEject = material.amount > SHEET_MATERIAL_AMOUNT; return (
{ const { amount, available, material, onEject } = props; + const { data } = useBackend(context); + const { SHEET_MATERIAL_AMOUNT } = data; return ( + + +