diff --git a/.github/workflows/build_milla.yml b/.github/workflows/build_rust.yml similarity index 86% rename from .github/workflows/build_milla.yml rename to .github/workflows/build_rust.yml index ca269a33dda1..1292c93dcb5b 100644 --- a/.github/workflows/build_milla.yml +++ b/.github/workflows/build_rust.yml @@ -1,13 +1,13 @@ -name: Build MILLA +name: Build Rust library on: issue_comment: types: created jobs: - build-milla: + build-rust: if: | github.event.issue.pull_request && - (github.event.comment.body == '!build_milla') && + (github.event.comment.body == '!build_rust') && ((github.event.sender.id == github.event.issue.user.id) || (github.event.comment.author_association == 'COLLABORATOR') || (github.event.comment.author_association == 'MEMBER') || @@ -53,7 +53,7 @@ jobs: ref: ${{ env.PR_BRANCH }} token: ${{ env.GH_TOKEN }} - - name: Build MILLA + - name: Build rustlibs env: BASE_BRANCH: ${{ github.event.repository.default_branch }} BASE_REPOSITORY: ${{ github.repository }} @@ -65,7 +65,7 @@ jobs: git pull origin "$PR_BRANCH" --depth=$((ahead_by + 1)) git remote add upstream "https://github.com/$BASE_REPOSITORY.git" git fetch upstream "$BASE_BRANCH" --depth=$((behind_by + 1)) - cd milla + cd rust # Get dependencies. rustup target add i686-unknown-linux-gnu @@ -79,13 +79,13 @@ jobs: cargo build --release --target i686-pc-windows-gnu # Copy the built targets to their checked-in locations. - cp target/i686-unknown-linux-gnu/release/libmilla.so ../tools/ci/libmilla_ci.so - cp target/i686-pc-windows-gnu/release/milla.dll ../milla.dll + cp target/i686-unknown-linux-gnu/release/librustlibs.so ../tools/ci/librustlibs_ci.so + cp target/i686-pc-windows-gnu/release/rustlibs.dll ../rustlibs.dll - git commit -a -m "Build MILLA" --allow-empty + git commit -a -m "Build Rust library" --allow-empty git push origin - name: Notify Failure if: failure() && env.FAIL_NOTIFIED != 'true' run: | - gh pr comment ${{ github.event.issue.html_url }} -b 'Building MILLA failed, see the action run log for details: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}' + gh pr comment ${{ github.event.issue.html_url }} -b 'Building Rust library failed, see the action run log for details: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}' diff --git a/.gitignore b/.gitignore index e1a2a1e9325b..537444105657 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,7 @@ $RECYCLE.BIN *.swp # Rust output. -/milla/target/* +/rust/target/* # mkdocs output. site diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm index fbdf10f74a1c..6eddc1288d95 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/abandoned_sec_shuttle.dmm @@ -9,10 +9,10 @@ /turf/simulated/floor/plating/airless, /area/ruin/space/sec_shuttle) "c" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "109" + name = "Shuttle Hatch" }, /turf/simulated/floor/plasteel/airless{ icon_state = "dark" @@ -176,10 +176,10 @@ }, /area/ruin/space/sec_shuttle) "T" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "109" + name = "Shuttle Hatch" }, /turf/simulated/floor/plating/airless, /area/ruin/space/sec_shuttle) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index b8f979a2f43e..848637b6e12e 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -275,9 +275,8 @@ /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) "aR" = ( -/obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/highsecurity, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -771,9 +770,8 @@ }, /area/ruin/space/deepstorage) "co" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /obj/structure/barricade/wooden/crude{ layer = 4 }, @@ -1029,9 +1027,8 @@ }, /area/ruin/space/deepstorage) "eq" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/space/deepstorage) "es" = ( @@ -1440,8 +1437,8 @@ /turf/simulated/floor/plating, /area/ruin/space/deepstorage) "hp" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/hatch{ - req_access_txt = "512"; name = "Guard Wing" }, /obj/structure/barricade/wooden/crude{ @@ -1692,8 +1689,8 @@ /turf/simulated/floor/plasteel, /area/ruin/space/deepstorage) "jj" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512"; name = "Guard Store Room" }, /obj/effect/decal/cleanable/dirt, @@ -1856,9 +1853,9 @@ /area/ruin/space/deepstorage) "jT" = ( /obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/vault{ - locked = 1; - req_access_txt = "512" + locked = 1 }, /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) @@ -2170,9 +2167,8 @@ /obj/structure/barricade/wooden/crude{ layer = 4 }, -/obj/machinery/door/airlock/centcom{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/centcom, /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) "mf" = ( @@ -2690,8 +2686,8 @@ /turf/simulated/floor/plating/asteroid/basalt/airless, /area/ruin/space/unpowered) "pz" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/command/glass{ - req_access_txt = "512"; name = "Floor Administrator's Office" }, /obj/effect/mapping_helpers/airlock/polarized{ @@ -2743,9 +2739,8 @@ /obj/structure/barricade/wooden/crude{ layer = 4 }, -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "podfloor" @@ -2975,9 +2970,8 @@ /area/ruin/space/deepstorage) "rK" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "podfloor" @@ -3777,9 +3771,8 @@ /turf/simulated/wall/indestructible/riveted, /area/ruin/space/deepstorage) "wH" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /obj/machinery/door/poddoor/shutters/preopen{ dir = 2; id_tag = "DS_Quartermaster" @@ -3859,8 +3852,8 @@ }, /area/ruin/space/deepstorage) "xC" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512"; name = "Interrogation Room" }, /turf/simulated/floor/plasteel{ @@ -4111,9 +4104,9 @@ /turf/simulated/floor/mineral/titanium, /area/ruin/space/deepstorage) "zh" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/highsecurity{ - name = "Incinerator"; - req_access_txt = "512" + name = "Incinerator" }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -4172,9 +4165,9 @@ /turf/simulated/floor/plating, /area/ruin/space/deepstorage) "zy" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/vault{ - locked = 1; - req_access_txt = "512" + locked = 1 }, /obj/structure/fans/tiny, /turf/simulated/floor/catwalk, @@ -4195,9 +4188,8 @@ /obj/structure/barricade/wooden/crude{ layer = 4 }, -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -4324,9 +4316,9 @@ /area/ruin/space/deepstorage) "As" = ( /obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/vault{ - name = "Auxiliary Power Room"; - req_access_txt = "512" + name = "Auxiliary Power Room" }, /obj/machinery/door/poddoor/multi_tile/impassable{ id_tag = "DS_Engineering" @@ -4359,8 +4351,8 @@ }, /area/ruin/space/deepstorage) "AA" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512"; name = "Evidence Storage" }, /turf/simulated/floor/plasteel{ @@ -5373,9 +5365,8 @@ }, /area/ruin/space/deepstorage) "Hx" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -6902,9 +6893,8 @@ }, /area/ruin/space/deepstorage) "To" = ( -/obj/machinery/door/airlock/centcom{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/centcom, /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) "Tq" = ( @@ -6930,9 +6920,8 @@ }, /area/ruin/space/deepstorage) "TK" = ( -/obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/highsecurity, /obj/machinery/door/poddoor/multi_tile/impassable{ id_tag = "DS_Storage" }, @@ -7008,9 +6997,8 @@ /obj/structure/barricade/wooden/crude{ layer = 4 }, -/obj/machinery/door/airlock/highsecurity{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/highsecurity, /obj/machinery/door/poddoor/multi_tile/impassable{ id_tag = "DS_Storage" }, @@ -7925,9 +7913,8 @@ /turf/simulated/floor/engine/airless, /area/ruin/space/unpowered) "ZW" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "512" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "podfloor" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm index 091de72050ef..87472fd1364e 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/listeningpost.dmm @@ -63,9 +63,9 @@ /turf/simulated/floor/plating/airless, /area/ruin/space/syndicate_listening_station/asteroid) "kE" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/structure/cable{ d1 = 4; @@ -242,9 +242,9 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/space/syndicate_listening_station) "zb" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/structure/fans/tiny, /obj/effect/decal/cleanable/dirt, @@ -472,9 +472,9 @@ /turf/simulated/floor/mineral/silver, /area/ruin/space/syndicate_listening_station) "Ow" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, @@ -513,9 +513,9 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/space/syndicate_listening_station) "TS" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/structure/cable{ d1 = 4; diff --git a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm index 13a10e310035..4c3d28f03fbc 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/moonoutpost19.dmm @@ -290,8 +290,8 @@ /turf/simulated/wall, /area/ruin/space/moonbase19) "aN" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/medical/glass{ - req_access_txt = "271"; name = "Storage Room" }, /turf/simulated/floor/plasteel, @@ -390,16 +390,15 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awaymlock" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/medical/glass{ - req_access_txt = "271"; name = "Medical Ward" }, /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "ba" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/multi_tile/glass, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -846,9 +845,8 @@ }, /area/ruin/space/moonbase19) "cx" = ( -/obj/machinery/door/airlock/security/glass{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/security/glass, /obj/structure/barricade/wooden/crude{ layer = 4 }, @@ -909,9 +907,8 @@ layer = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/universal, -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "cI" = ( @@ -1198,8 +1195,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awaycontlockdown" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "271"; name = "Specimen Containtment Zone" }, /turf/simulated/floor/catwalk, @@ -1394,8 +1391,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awaymlock" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Medical Ward" }, /turf/simulated/floor/catwalk, @@ -1574,9 +1571,8 @@ /obj/structure/barricade/wooden/crude{ layer = 4 }, -/obj/machinery/door/airlock/external{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/external, /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "eZ" = ( @@ -1672,9 +1668,8 @@ }, /area/ruin/space/moonbase19) "fn" = ( -/obj/machinery/door/airlock/centcom{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/centcom, /turf/simulated/floor/plasteel, /area/ruin/space/moonbase19) "fp" = ( @@ -1819,8 +1814,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Cafeteria" }, /turf/simulated/floor/catwalk, @@ -2934,8 +2929,8 @@ d2 = 2; icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/engineering/glass{ - req_access_txt = "271"; name = "Workshop" }, /turf/simulated/floor/catwalk, @@ -3335,8 +3330,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awayscilock" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Research Division" }, /turf/simulated/floor/catwalk, @@ -3548,9 +3543,8 @@ /turf/simulated/floor/engine, /area/ruin/space/moonbase19) "kW" = ( -/obj/machinery/door/airlock/centcom{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/centcom, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "caution" @@ -3628,9 +3622,8 @@ }, /area/ruin/space/moonbase19) "lq" = ( -/obj/machinery/door/airlock{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4181,8 +4174,8 @@ /turf/simulated/floor/carpet, /area/ruin/space/moonbase19) "nx" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Engineering Division" }, /turf/simulated/floor/plasteel, @@ -4813,8 +4806,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awayscilock" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Research Division" }, /turf/simulated/floor/catwalk, @@ -4968,8 +4961,8 @@ }, /area/ruin/space/moonbase19) "qx" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Cafeteria" }, /turf/simulated/floor/catwalk, @@ -5354,8 +5347,8 @@ }, /area/ruin/space/moonbase19) "rV" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock{ - req_access_txt = "271"; name = "Dorms" }, /turf/simulated/floor/plasteel{ @@ -5379,9 +5372,8 @@ }, /area/ruin/space/moonbase19) "rZ" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "sa" = ( @@ -7070,7 +7062,7 @@ /area/ruin/space/moonbase19) "zV" = ( /obj/machinery/economy/vending/medical{ - req_access_txt = "271" + req_access = list(271) }, /turf/simulated/floor/plasteel{ icon_state = "whitecorner"; @@ -7095,8 +7087,8 @@ }, /area/ruin/space/moonbase19) "Af" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/command/glass{ - req_access_txt = "271"; name = "Senior Researcher's Office" }, /obj/effect/mapping_helpers/airlock/polarized{ @@ -7487,7 +7479,7 @@ /obj/structure/table/reinforced, /obj/machinery/door/window/reinforced/normal{ dir = 4; - req_access_txt = "271" + req_access = list(271) }, /obj/machinery/door/poddoor/shutters/preopen{ id_tag = "awayscilock2" @@ -7512,9 +7504,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awayscilock" }, -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "BK" = ( @@ -7523,8 +7514,8 @@ /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "BO" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/engineering/glass{ - req_access_txt = "271"; name = "Engineering Division" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -7602,8 +7593,8 @@ /obj/machinery/door/poddoor/impassable{ id_tag = "awaycontlockdown" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "271"; name = "Specimen Containtment Zone" }, /turf/simulated/floor/catwalk, @@ -7617,9 +7608,8 @@ }, /area/ruin/space/moonbase19) "Ct" = ( -/obj/machinery/door/airlock/highsecurity{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/highsecurity, /obj/machinery/door/poddoor/preopen{ id_tag = "awayscilock1" }, @@ -7641,8 +7631,8 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Engineering Division" }, /turf/simulated/floor/plasteel, @@ -7878,9 +7868,8 @@ }, /area/ruin/space/moonbase19) "Dt" = ( -/obj/machinery/door/airlock/medical/glass{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/medical/glass, /obj/effect/decal/cleanable/blood/tracks/mapped, /turf/simulated/floor/plasteel{ icon_state = "darkfull"; @@ -8492,8 +8481,8 @@ }, /area/ruin/space/moonbase19) "Gk" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/medical/glass{ - req_access_txt = "271"; name = "Operation Room" }, /turf/simulated/floor/plasteel{ @@ -8841,8 +8830,8 @@ /turf/simulated/floor/engine, /area/ruin/space/moonbase19) "HO" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "271"; name = "Chamber #1" }, /obj/effect/turf_decal/delivery, @@ -9066,8 +9055,8 @@ /area/ruin/space/moonbase19) "IU" = ( /obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/highsecurity{ - req_access_txt = "271"; name = "Chamber #2" }, /turf/simulated/floor/plasteel{ @@ -9193,9 +9182,8 @@ }, /area/ruin/space/moonbase19) "JE" = ( -/obj/machinery/door/airlock/external{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/external, /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) "JG" = ( @@ -9835,9 +9823,8 @@ }, /area/ruin/space/moonbase19) "Mx" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/ruin/space/moonbase19) @@ -10574,8 +10561,8 @@ }, /area/ruin/space/moonbase19) "PF" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/security{ - req_access_txt = "271"; name = "Security Checkpoint" }, /turf/simulated/floor/plasteel{ @@ -10884,8 +10871,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Cafeteria" }, /turf/simulated/floor/catwalk, @@ -10975,9 +10962,8 @@ }, /area/ruin/space/moonbase19) "Rg" = ( -/obj/machinery/door/airlock/freezer{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/freezer, /turf/simulated/floor/plasteel{ icon_state = "showroomfloor"; temperature = 273.15 @@ -11056,9 +11042,8 @@ /turf/simulated/floor/engine, /area/ruin/space/moonbase19) "RD" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/multi_tile/glass, /obj/structure/barricade/wooden/crude{ layer = 4 }, @@ -11295,9 +11280,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/door/airlock/centcom{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/centcom, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel{ icon_state = "caution" @@ -11361,8 +11345,8 @@ }, /area/ruin/space/moonbase19) "Ti" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/command/glass{ - req_access_txt = "271"; name = "Senior Researcher's Office" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -11587,8 +11571,8 @@ "Ue" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock{ - req_access_txt = "271"; name = "Dorms" }, /turf/simulated/floor/plasteel{ @@ -11691,9 +11675,8 @@ /obj/effect/decal/cleanable/blood/tracks/mapped{ dir = 8 }, -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "UA" = ( @@ -12039,9 +12022,8 @@ /turf/simulated/floor/plating, /area/ruin/space/moonbase19) "We" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/maintenance_hatch, /obj/machinery/door/poddoor/impassable{ id_tag = "awayscilock" }, @@ -12149,9 +12131,9 @@ }, /area/ruin/space/moonbase19) "WG" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/vault{ - locked = 1; - req_access_txt = "271" + locked = 1 }, /turf/simulated/floor/catwalk, /area/ruin/space/moonbase19) @@ -12553,8 +12535,8 @@ /area/ruin/space/moonbase19) "Yj" = ( /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/engineering/glass{ - req_access_txt = "271"; name = "Engineering Division" }, /turf/simulated/floor/plasteel, @@ -12639,8 +12621,8 @@ id_tag = "awaymlock" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/centcom{ - req_access_txt = "271"; name = "Medical Ward" }, /turf/simulated/floor/catwalk, @@ -12684,8 +12666,8 @@ }, /area/ruin/space/moonbase19) "YM" = ( +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, /obj/machinery/door/airlock/engineering/glass{ - req_access_txt = "271"; name = "Workshop" }, /turf/simulated/floor/catwalk, @@ -12944,9 +12926,8 @@ /turf/simulated/floor/engine, /area/ruin/space/moonbase19) "ZP" = ( -/obj/machinery/door/airlock/medical/glass{ - req_access_txt = "271" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19, +/obj/machinery/door/airlock/medical/glass, /obj/structure/barricade/wooden{ layer = 4 }, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm index 9dbdd2061f27..98f13edcf853 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/oldstation.dmm @@ -1960,9 +1960,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, /obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_one_access_txt = "301" + name = "Engineering External Access" }, /turf/simulated/floor/plating, /area/ruin/ancientstation/engi) @@ -3013,9 +3013,8 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/door/airlock/maintenance_hatch{ - req_one_access_txt = "301" - }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, +/obj/machinery/door/airlock/maintenance_hatch, /turf/simulated/floor/plating, /area/ruin/ancientstation/thetacorridor) "hF" = ( @@ -3090,9 +3089,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, /obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_one_access_txt = "301" + name = "Engineering External Access" }, /turf/simulated/floor/plating/airless, /area/ruin/ancientstation/engi) @@ -3792,9 +3791,9 @@ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, /obj/machinery/door/airlock/highsecurity{ - name = "Prototype Laboratory"; - req_access_txt = "301" + name = "Prototype Laboratory" }, /turf/simulated/floor/plasteel{ icon_state = "whitehall" @@ -3803,9 +3802,9 @@ "jv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta, /obj/machinery/door/airlock/highsecurity{ - name = "Prototype Laboratory"; - req_access_txt = "301" + name = "Prototype Laboratory" }, /turf/simulated/floor/plasteel{ icon_state = "whitehall" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm index 8e0bd98ae0e6..ee7e03df5065 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndicatedruglab.dmm @@ -241,8 +241,7 @@ id = "syndicatedruglab"; name = "Syndicate Drug Lab Hangar"; pixel_x = 24; - pixel_y = 4; - req_access_txt = null + pixel_y = 4 }, /turf/simulated/floor/plating, /area/ruin/space/syndicate_druglab) diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm index 29702b1da153..54445ed5d046 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndie_space_base.dmm @@ -78,8 +78,8 @@ name = "Vault Bolt Control"; normaldoorcontrol = 1; pixel_x = 24; - req_access_txt = "150"; - specialfunctions = 4 + specialfunctions = 4; + req_access = list(150) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -1082,7 +1082,7 @@ id = "SSBrestricted"; name = "Shutters Control"; pixel_x = -24; - req_access_txt = "151" + req_access = list(151) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -1274,8 +1274,7 @@ "gW" = ( /obj/machinery/door/window/classic/reversed{ name = "Animal Storage"; - req_access_txt = "150"; - req_one_access_txt = "150" + req_access = list(150) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -1553,7 +1552,7 @@ id = "SSBrestricted"; name = "Shutters Control"; pixel_x = 24; - req_access_txt = "151" + req_access = list(151) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -1581,7 +1580,7 @@ /area/ruin/unpowered/syndicate_space_base/toxtest) "iB" = ( /obj/structure/closet/crate/secure/gear{ - req_access_txt = "150" + req_access = list(150) }, /obj/item/clothing/suit/space/syndicate, /obj/item/clothing/suit/space/syndicate, @@ -1728,7 +1727,7 @@ /area/ruin/unpowered/syndicate_space_base/arrivals) "je" = ( /obj/structure/closet/crate/secure/gear{ - req_access_txt = "150" + req_access = list(150) }, /obj/item/clothing/suit/space/syndicate, /obj/item/clothing/suit/space/syndicate, @@ -4979,7 +4978,7 @@ dir = 4; network = list("SyndicateTestLab","SyndicateToxinsTest","SyndicateCaves","SyndicateInterior"); name = "syndicate security camera console"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -5290,7 +5289,7 @@ /area/ruin/unpowered/syndicate_space_base/atmos) "Ed" = ( /obj/structure/closet/crate/secure/gear{ - req_access_txt = "150" + req_access = list(150) }, /obj/machinery/light{ dir = 1 @@ -5332,8 +5331,7 @@ "Ei" = ( /obj/machinery/door/window/classic/reversed{ name = "Animal Storage"; - req_access_txt = "150"; - req_one_access_txt = "150" + req_access = list(150) }, /mob/living/simple_animal/chicken{ faction = list("neutral","syndicate") @@ -5456,10 +5454,10 @@ }, /area/ruin/unpowered/syndicate_space_base/genetics) "ES" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/vault{ id_tag = "syndie_lavaland_vault"; - locked = 1; - req_access_txt = "150" + locked = 1 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -6140,7 +6138,7 @@ /area/ruin/unpowered/syndicate_space_base/main) "Iz" = ( /obj/structure/closet/crate/secure/gear{ - req_access_txt = "150" + req_access = list(150) }, /obj/machinery/light, /obj/item/clothing/gloves/combat, @@ -6396,7 +6394,7 @@ pixel_y = -24; name = "Caves Turret Control Panel"; control_area = "Syndicate Space Base Cave"; - req_access_txt = "150" + req_access = list(150) }, /obj/structure/chair{ dir = 8 @@ -7028,8 +7026,7 @@ /area/ruin/unpowered/syndicate_space_base/toxlaunch) "NT" = ( /obj/structure/closet/secure_closet/medical1{ - req_access = null; - req_access_txt = "150" + req_access = list(150) }, /obj/structure/window/reinforced{ dir = 1 @@ -7692,7 +7689,7 @@ /area/ruin/unpowered/syndicate_space_base/engineering) "Sv" = ( /obj/structure/closet/crate/secure/weapon{ - req_access_txt = "150" + req_access = list(150) }, /obj/item/ammo_box/magazine/m10mm/hp, /obj/item/ammo_box/magazine/m10mm/hp, @@ -7793,7 +7790,7 @@ /area/ruin/unpowered/syndicate_space_base/storage) "SN" = ( /obj/structure/closet/crate/secure/weapon{ - req_access_txt = "150" + req_access = list(150) }, /obj/item/ammo_box/magazine/m10mm/hp, /obj/item/ammo_box/magazine/m10mm/hp, diff --git a/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm b/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm index 5ff98a049734..ce4becef7b45 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/syndiedepot.dmm @@ -442,17 +442,17 @@ }, /area/syndicate_depot/core) "bq" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/syndicate_depot/core) "br" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, @@ -561,9 +561,9 @@ name = "Sealed Doors"; protected = 0 }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -647,8 +647,7 @@ /obj/machinery/turretid/syndicate{ name = "external turret controls"; pixel_x = -32; - req_access = null; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel{ icon_state = "dark" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm index 9b02d8da89fd..dd84c082cba3 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm @@ -157,9 +157,7 @@ d2 = 4; icon_state = "2-4" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) "cJ" = ( @@ -417,13 +415,11 @@ d2 = 2; icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms Satellite"; - req_access_txt = "61" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" + name = "Telecoms Satellite" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/firedoor, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -512,9 +508,9 @@ /turf/simulated/floor/catwalk/airless, /area/ruin/space/telecomms/powercontrol) "ky" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms Power Control"; - req_access_txt = "61" + name = "Telecoms Power Control" }, /obj/structure/cable{ d1 = 4; @@ -1498,9 +1494,9 @@ /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/computer) "xL" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms Lounge"; - req_access_txt = "61" + name = "Telecoms Lounge" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/firedoor, @@ -1518,9 +1514,9 @@ /turf/simulated/floor/plating, /area/ruin/space/telecomms) "yl" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/maintenance_hatch{ - name = "Telecoms Storage"; - req_access_txt = "61" + name = "Telecoms Storage" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -1576,9 +1572,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms East Wing"; - req_access_txt = "61" + name = "Telecoms East Wing" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plasteel{ @@ -1670,9 +1666,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/telecomms_trap_tank, /obj/effect/abstract/cheese_trap, /turf/simulated/floor/catwalk, @@ -1762,9 +1756,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/abstract/bot_trap, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) @@ -2295,18 +2287,16 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) "IL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms West Wing"; - req_access_txt = "61" + name = "Telecoms West Wing" }, /obj/machinery/door/firedoor, /turf/simulated/floor/plasteel{ @@ -2383,9 +2373,7 @@ /area/ruin/space/telecomms/computer) "JQ" = ( /obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/window/reinforced{ dir = 8 }, @@ -2474,9 +2462,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/window/reinforced{ dir = 8 }, @@ -2733,9 +2719,9 @@ d2 = 2; icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/machinery/door/airlock/hatch{ - name = "Telecoms Satellite"; - req_access_txt = "61" + name = "Telecoms Satellite" }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -2839,18 +2825,6 @@ temperature = 80 }, /area/ruin/space/telecomms/chamber) -"QY" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, -/turf/simulated/floor/catwalk, -/area/ruin/space/telecomms) "QZ" = ( /obj/machinery/power/solar, /obj/structure/cable, @@ -3086,9 +3060,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = "0" - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) "UF" = ( @@ -6849,7 +6821,7 @@ UD oB BQ Zb -QY +nL ML ML AX @@ -8507,12 +8479,12 @@ nL vd Od xj -QY -QY -QY -QY -QY -QY +nL +nL +nL +nL +nL +nL vU Xf Ed diff --git a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm index b098bcc88a84..5265570fb7dd 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/ussp.dmm @@ -1065,6 +1065,10 @@ /obj/structure/sign/mech, /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, /area/ruin/space/derelict/arrival) +"cM" = ( +/obj/structure/sign/securearea, +/turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, +/area/ruin/space/derelict/arrival) "cN" = ( /obj/machinery/door/airlock/hatch{ desc = "A sturdy armoury door. If you listen closely, you can barely make out a soviet marching tune coming from the other side of the door."; @@ -1836,9 +1840,7 @@ name = "custom placement"; pixel_x = 30 }, -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "eJ" = ( @@ -1997,9 +1999,7 @@ /turf/simulated/floor/plating, /area/ruin/space/derelict/hallway/primary) "fb" = ( -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "fc" = ( @@ -2234,14 +2234,12 @@ }, /area/ruin/space/derelict/arrival) "fB" = ( -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, /obj/structure/cable{ d1 = 2; d2 = 4; icon_state = "2-4" }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "fC" = ( @@ -2253,12 +2251,12 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "fD" = ( -/obj/item/trash/spentcasing, /obj/structure/cable{ d1 = 1; d2 = 8; icon_state = "1-8" }, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "fE" = ( @@ -2386,14 +2384,12 @@ /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "fU" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "fV" = ( /obj/structure/chair/stool/bar, -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "fW" = ( @@ -2559,7 +2555,7 @@ }, /area/ruin/space/derelict/arrival) "gr" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "gs" = ( @@ -2685,7 +2681,7 @@ /turf/simulated/floor/wood, /area/ruin/space/derelict/crew_quarters) "gH" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel/grimy, /area/ruin/space/derelict/crew_quarters) "gI" = ( @@ -2711,9 +2707,7 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "gM" = ( -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/arrival) "gN" = ( @@ -3208,7 +3202,7 @@ d2 = 2; icon_state = "1-2" }, -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "ia" = ( @@ -3306,9 +3300,7 @@ }, /area/ruin/space/derelict/crew_quarters) "in" = ( -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "chapel" @@ -3353,9 +3345,7 @@ /area/ruin/space/derelict/arrival) "ix" = ( /obj/effect/decal/cleanable/blood/splatter, -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "iy" = ( @@ -3456,7 +3446,7 @@ }, /area/ruin/space/derelict/crew_quarters) "iL" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/crew_quarters) "iM" = ( @@ -3644,11 +3634,11 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/ruin/space/derelict/arrival) "jl" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; locked = 1; - name = "Shuttle Airlock"; - req_access_txt = "150" + name = "Shuttle Airlock" }, /turf/simulated/floor/plating, /area/ruin/space/derelict/arrival) @@ -3665,9 +3655,7 @@ /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "jo" = ( -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "jp" = ( @@ -3681,9 +3669,7 @@ /area/ruin/space/derelict/arrival) "jq" = ( /obj/effect/landmark/burnturf, -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "jr" = ( @@ -3701,7 +3687,7 @@ }, /area/ruin/space/derelict/hallway/primary) "jt" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "rampbottom" @@ -3910,9 +3896,7 @@ }, /area/ruin/space/derelict/arrival) "jX" = ( -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel{ icon_state = "derelict14" }, @@ -3988,9 +3972,7 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/hallway/primary) "kf" = ( @@ -4365,7 +4347,7 @@ }, /area/ruin/space/derelict/arrival) "kN" = ( -/obj/item/trash/spentcasing, +/obj/item/trash/spentcasing/shotgun, /turf/simulated/floor/plasteel{ icon_state = "derelict3" }, @@ -4409,9 +4391,7 @@ /area/ruin/space/derelict/arrival) "kU" = ( /obj/machinery/light/small, -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "redblue" @@ -4536,9 +4516,7 @@ /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/crew_quarters) "ll" = ( -/obj/item/trash/spentcasing{ - icon_state = "s-casing" - }, +/obj/item/trash/spentcasing/bullet, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/crew_quarters) "lm" = ( @@ -4886,9 +4864,7 @@ }, /area/ruin/space/derelict/arrival) "mf" = ( -/obj/item/trash/spentcasing{ - icon_state = "762-casing" - }, +/obj/item/trash/spentcasing/bullet/medium, /turf/simulated/floor/plasteel, /area/ruin/space/derelict/arrival) "mg" = ( @@ -7429,10 +7405,6 @@ }, /turf/simulated/floor/plasteel/dark, /area/ruin/space/derelict/crew_quarters) -"El" = ( -/obj/structure/sign/securearea, -/turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, -/area/ruin/space/derelict/arrival) "Mi" = ( /obj/effect/spawner/random/fungus/frequent, /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, @@ -7441,13 +7413,6 @@ /obj/effect/spawner/airlock, /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, /area/ruin/space/derelict/arrival) -"NK" = ( -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, -/turf/template_noop, -/area/template_noop) "Oh" = ( /obj/effect/spawner/airlock/w_to_e, /turf/simulated/wall/indestructible/titanium/soviet/nodiagonal, @@ -8624,7 +8589,7 @@ aW bn ed en -El +cM fg fB fX @@ -8900,7 +8865,7 @@ dQ do do cm -El +cM de fE fZ @@ -9443,7 +9408,7 @@ aW bn cm cA -El +cM cA do dD @@ -9627,7 +9592,7 @@ bF bT co cA -El +cM dg ds bn @@ -14052,7 +14017,7 @@ ac ac ac ac -NK +ac ac ac ac diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm index 4302706bd33c..a3047e86d7a3 100644 --- a/_maps/map_files/generic/Lavaland.dmm +++ b/_maps/map_files/generic/Lavaland.dmm @@ -565,8 +565,8 @@ /obj/machinery/access_button{ autolink_id = "labor_btn_ext"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = -21 + pixel_y = -21; + req_access = list(2) }, /obj/structure/cable{ d1 = 4; @@ -1163,10 +1163,10 @@ /obj/effect/turf_decal/delivery/hollow/right, /obj/machinery/door_control{ id = "mining_mechbay"; - req_access_txt = "54"; name = "Mech Bay Shutters"; pixel_x = 24; - pixel_y = 5 + pixel_y = 5; + req_access = list(54) }, /obj/machinery/light_switch{ pixel_x = 24; @@ -2452,9 +2452,9 @@ /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/unexplored/danger) "fU" = ( +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, /obj/machinery/door/airlock/titanium{ - id_tag = "s_docking_airlock"; - req_access_txt = "48" + id_tag = "s_docking_airlock" }, /obj/docking_port/mobile/mining, /obj/structure/fans/tiny, @@ -2916,7 +2916,7 @@ id = "gulagshuttleflasher"; name = "Flash Control"; pixel_y = -26; - req_access_txt = "1" + req_access = list(1) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/siberia) @@ -3093,8 +3093,8 @@ id = "Labor"; name = "Labor Camp Lockdown"; pixel_y = -22; - req_access_txt = "2"; - pixel_x = -7 + pixel_x = -7; + req_access = list(2) }, /obj/machinery/flasher_button{ id = "laborairlock"; @@ -3870,7 +3870,7 @@ /obj/machinery/flasher_button{ id = "gulagshuttleflasher"; name = "Flash Control"; - req_access_txt = "1" + req_access = list(1) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/siberia) @@ -4466,8 +4466,8 @@ /obj/machinery/access_button{ autolink_id = "labor_btn_int"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = -21 + pixel_y = -21; + req_access = list(2) }, /obj/structure/cable{ d1 = 4; @@ -5999,8 +5999,8 @@ /obj/machinery/access_button{ autolink_id = "labor_btn_ext"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = 21 + pixel_y = 21; + req_access = list(2) }, /obj/machinery/door/poddoor/preopen{ id_tag = "Labor"; @@ -6077,8 +6077,8 @@ /obj/machinery/access_button{ autolink_id = "labor_btn_int"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = 21 + pixel_y = 21; + req_access = list(2) }, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/security/brig, diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index e463797b0a34..fb4d98bb742e 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -19,9 +19,9 @@ /turf/simulated/wall/indestructible/fakedoor, /area/ninja/holding) "ah" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ - name = "CentCom Security"; - req_access_txt = "101" + name = "CentCom Security" }, /turf/simulated/floor/plasteel/dark, /area/centcom/evac) @@ -434,7 +434,7 @@ /area/ninja/holding) "bO" = ( /obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" + req_access = list(25) }, /turf/simulated/floor/plasteel/freezer, /area/ninja/holding) @@ -862,6 +862,9 @@ "ds" = ( /turf/simulated/wall/indestructible/syndicate, /area/centcom) +"dt" = ( +/turf/simulated/floor/plasteel/stairs/right, +/area/syndicate_mothership) "du" = ( /obj/structure/table, /obj/item/reagent_containers/drinks/shaker, @@ -906,12 +909,12 @@ "dD" = ( /obj/machinery/airlock_controller/air_cycler{ pixel_x = 25; - req_access_txt = "150"; vent_link_id = "syndishuttle_vent"; ext_door_link_id = "syndishuttle_door_ext"; int_door_link_id = "syndishuttle_door_int"; ext_button_link_id = "syndishuttle_btn_ext"; - int_button_link_id = "syndishuttle_btn_int" + int_button_link_id = "syndishuttle_btn_int"; + req_access = list(150) }, /obj/machinery/light{ dir = 4 @@ -1069,10 +1072,10 @@ }, /area/ninja/holding) "ei" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Workshop"; - req_access_txt = "101" + name = "Workshop" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -1934,10 +1937,10 @@ /turf/simulated/floor/plasteel, /area/tdome/arena) "hl" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Airlock"; - req_access_txt = "150" + name = "Shuttle Airlock" }, /obj/machinery/door/poddoor{ density = 0; @@ -1945,7 +1948,7 @@ id_tag = "syndicate_sit_1"; name = "Side Hull Door"; opacity = 0; - req_access_txt = "150" + req_access = list(150) }, /obj/docking_port/mobile{ dir = 8; @@ -1960,7 +1963,7 @@ id = "syndicate_sit_1"; name = "Blast Doors"; pixel_y = -23; - req_access_txt = "150" + req_access = list(150) }, /obj/docking_port/stationary{ dir = 8; @@ -1976,9 +1979,9 @@ "hm" = ( /obj/machinery/door_control/no_emag/no_cyborg{ pixel_y = 24; - req_access_txt = "114"; name = "Engineering Storage Shutters"; - id = "SpecopsEngineering" + id = "SpecopsEngineering"; + req_access = list(114) }, /turf/simulated/floor/plasteel{ dir = 5; @@ -1999,7 +2002,7 @@ /obj/machinery/door_control/no_emag{ id = "tdome1"; pixel_x = 24; - req_access_txt = "102" + req_access = list(102) }, /turf/simulated/floor/plasteel{ dir = 9; @@ -2016,9 +2019,9 @@ /turf/simulated/floor/wood, /area/ghost_bar) "hq" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sit_away"; - req_access_txt = "150" + id_tag = "sit_away" }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2080,17 +2083,17 @@ /turf/simulated/floor/wood, /area/wizard_station) "hA" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "sst_away"; - req_access_txt = "150" + id_tag = "sst_away" }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) "hB" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Airlock"; - req_access_txt = "150" + name = "Shuttle Airlock" }, /obj/machinery/door/poddoor{ density = 0; @@ -2098,7 +2101,7 @@ id_tag = "syndicate_elite"; name = "Side Hull Door"; opacity = 0; - req_access_txt = "150" + req_access = list(150) }, /obj/docking_port/mobile{ dir = 4; @@ -2129,10 +2132,10 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate_sit) "hE" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/security, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Holding Cell"; - req_access_txt = "104" + name = "Holding Cell" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -2142,7 +2145,7 @@ name = "Shuttle Blast Doors"; pixel_x = -26; pixel_y = -2; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2179,7 +2182,7 @@ name = "Shuttle Blast Doors"; pixel_x = 26; pixel_y = -2; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2221,7 +2224,7 @@ /obj/machinery/door_control/no_emag{ id = "tdome2"; pixel_x = -24; - req_access_txt = "102" + req_access = list(102) }, /turf/simulated/floor/plasteel{ dir = 9; @@ -2246,16 +2249,16 @@ /turf/simulated/floor/plating/abductor, /area/abductor_ship) "hX" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Airlock"; - req_access_txt = "150" + name = "Shuttle Airlock" }, /obj/machinery/door_control/no_emag{ id = "syndicate_elite"; name = "Blast Doors"; pixel_x = -25; - req_access_txt = "150" + req_access = list(150) }, /obj/machinery/door/poddoor{ density = 0; @@ -2263,22 +2266,22 @@ id_tag = "syndicate_elite"; name = "Front Hull Door"; opacity = 0; - req_access_txt = "150" + req_access = list(150) }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/shuttle/syndicate_elite) "hY" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Airlock"; - req_access_txt = "150" + name = "Shuttle Airlock" }, /obj/machinery/door_control/no_emag{ id = "syndicate_sit_1"; name = "Blast Doors"; pixel_x = -25; - req_access_txt = "150" + req_access = list(150) }, /obj/structure/fans/tiny, /obj/machinery/door/poddoor{ @@ -2287,7 +2290,7 @@ id_tag = "syndicate_sit_1"; name = "Front Hull Door"; opacity = 0; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plating, /area/shuttle/syndicate_sit) @@ -2307,9 +2310,9 @@ }, /area/tdome/tdomeobserve) "ic" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/centcom{ - name = "Administrative Office"; - req_access_txt = "109" + name = "Administrative Office" }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) @@ -2448,14 +2451,14 @@ name = "SIT Base Access"; pixel_x = -6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /obj/machinery/door_control/no_emag{ id = "sit_tele"; name = "SIT Teleporter Access"; pixel_x = 6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2482,28 +2485,28 @@ name = "SST Extra Weapons"; pixel_x = -6; pixel_y = -4; - req_access_txt = "153" + req_access = list(153) }, /obj/machinery/door_control/no_emag{ id = "sst_ready"; name = "SST Base Access"; pixel_x = -6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /obj/machinery/door_control/no_emag{ id = "sst_tele"; name = "SST Teleporter Access"; pixel_x = 6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /obj/machinery/door_control/no_emag{ id = "sst_mechbay"; name = "SST Mech Bay"; pixel_x = 6; pixel_y = -4; - req_access_txt = "153" + req_access = list(153) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2667,11 +2670,11 @@ /obj/machinery/airlock_controller/access_controller{ name = "Syndicate Jail Access Controller"; pixel_y = 24; - req_access_txt = "150"; ext_door_link_id = "syndijail_door_ext"; int_door_link_id = "syndijail_door_int"; ext_button_link_id = "syndijail_btn_ext"; - int_button_link_id = "syndijail_btn_int" + int_button_link_id = "syndijail_btn_int"; + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2714,7 +2717,7 @@ /obj/machinery/door_control/no_emag{ id = "commandcenter"; name = "Privacy Shutters"; - req_access_txt = "153" + req_access = list(153) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2803,14 +2806,14 @@ name = "Nuclear Base Access"; pixel_x = -6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /obj/machinery/door_control/no_emag{ id = "nukeop_ready"; name = "Nuclear Shuttle Access"; pixel_x = 6; pixel_y = 6; - req_access_txt = "153" + req_access = list(153) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -2926,7 +2929,7 @@ /area/syndicate_mothership) "kk" = ( /obj/structure/closet/secure_closet{ - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -3263,16 +3266,16 @@ name = "Bolt Cell Doors"; normaldoorcontrol = 1; pixel_x = 6; - req_access_txt = "150"; - specialfunctions = 4 + specialfunctions = 4; + req_access = list(150) }, /obj/machinery/door_control/no_emag{ id = "syndicate_jail"; name = "Bolt Jail Door"; normaldoorcontrol = 1; pixel_x = -5; - req_access_txt = "150"; - specialfunctions = 4 + specialfunctions = 4; + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership/jail) @@ -3459,7 +3462,7 @@ /obj/machinery/door_control/no_emag{ id = "syndieshutters"; name = "remote shutter control"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -3830,9 +3833,9 @@ /turf/simulated/floor/carpet/arcade, /area/ghost_bar) "mT" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/centcom{ - name = "Restroom"; - req_access_txt = "150" + name = "Restroom" }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -3869,7 +3872,7 @@ "mX" = ( /obj/machinery/door/window{ name = "Cockpit"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -4153,7 +4156,7 @@ dir = 8; name = "Tactical Toilet"; opacity = 1; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plasteel/freezer, /area/syndicate_mothership) @@ -4342,7 +4345,7 @@ /obj/machinery/door/airlock/centcom{ aiControlDisabled = 1; name = "Assault Pod"; - req_one_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/plating, /area/shuttle/assault_pod) @@ -4535,9 +4538,9 @@ /turf/space/transit, /area/space/centcomm) "pg" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/traders, /obj/machinery/door/airlock/titanium/glass{ name = "trader shuttle airlock"; - req_access_txt = "160"; security_level = 6 }, /turf/simulated/floor/mineral/titanium/blue, @@ -4662,9 +4665,9 @@ /turf/simulated/floor/grass/jungle, /area/centcom/evac) "pK" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/commander, /obj/machinery/door/airlock/centcom{ - name = "Shuttle Control Office"; - req_access_txt = "114" + name = "Shuttle Control Office" }, /turf/simulated/floor/plasteel/dark, /area/centcom/gamma) @@ -4692,14 +4695,14 @@ normaldoorcontrol = 1; pixel_x = 24; pixel_y = -8; - req_access_txt = "160" + req_access = list(160) }, /obj/machinery/door_control/no_emag{ id = "trader_privacy"; name = "Privacy Shutters Control"; pixel_x = 24; pixel_y = 8; - req_access_txt = "160" + req_access = list(160) }, /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/trade/sol) @@ -4729,7 +4732,7 @@ id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; - req_access_txt = "101" + req_access = list(101) }, /obj/machinery/light{ dir = 8 @@ -4846,10 +4849,10 @@ name = "Security Doors"; opacity = 0 }, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/traders, /obj/machinery/door/airlock/titanium/glass{ id_tag = "soltrader_north"; name = "trader shuttle airlock"; - req_access_txt = "160"; security_level = 6 }, /turf/simulated/floor/mineral/titanium/blue, @@ -4941,7 +4944,7 @@ name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; - req_access_txt = "151" + req_access = list(151) }, /obj/item/kirbyplants, /turf/simulated/floor/plasteel{ @@ -5059,9 +5062,8 @@ /turf/simulated/floor/wood, /area/syndicate_mothership) "rc" = ( -/obj/machinery/door/airlock/external{ - req_access_txt = "150" - }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate, +/obj/machinery/door/airlock/external, /turf/simulated/floor/plasteel{ icon_state = "bar" }, @@ -5192,14 +5194,14 @@ name = "CentCom Security Shutters"; pixel_x = 8; pixel_y = 36; - req_access_txt = "101" + req_access = list(101) }, /obj/machinery/door_control/no_emag{ id = "CC"; name = "Thunderdome Shutters"; pixel_x = 8; pixel_y = 24; - req_access_txt = "114" + req_access = list(114) }, /obj/machinery/door_control/no_emag{ desc = "A remote control switch to connect the ready room to the rest of Centcom."; @@ -5207,7 +5209,7 @@ name = "Nanotrasen Asset Protection Shutters"; pixel_x = -8; pixel_y = 30; - req_access_txt = "109" + req_access = list(109) }, /turf/simulated/floor/wood, /area/centcom/control) @@ -5484,10 +5486,10 @@ /turf/simulated/floor/plasteel/dark, /area/tdome/tdomeobserve) "su" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Bridge"; - req_access_txt = "101" + name = "Bridge" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -5545,9 +5547,9 @@ /turf/simulated/floor/wood, /area/syndicate_mothership) "sE" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/multi_tile/glass{ - name = "Equipment Room"; - req_access_txt = "150" + name = "Equipment Room" }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -5566,7 +5568,7 @@ /turf/simulated/floor/plating, /area/shuttle/syndicate) "sK" = ( -/turf/simulated/floor/plasteel/stairs/old, +/turf/simulated/floor/plasteel/stairs/left, /area/syndicate_mothership) "sL" = ( /obj/machinery/mech_bay_recharge_port/upgraded/unsimulated, @@ -5641,7 +5643,7 @@ /obj/machinery/door/airlock/centcom{ aiControlDisabled = 1; name = "Assault Pod"; - req_one_access_txt = "150" + req_access = list(150) }, /obj/docking_port/mobile/assault_pod, /turf/simulated/floor/plating, @@ -5668,8 +5670,8 @@ "th" = ( /obj/machinery/door/window/reinforced/normal{ color = "#d70000"; - req_access_txt = "104"; - dir = 8 + dir = 8; + req_access = list(104) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -5809,7 +5811,7 @@ id = "ASSAULT"; name = "Mech Storage"; pixel_y = -24; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/plasteel{ icon_state = "darkred" @@ -5905,7 +5907,7 @@ /obj/machinery/door/window{ dir = 8; name = "Tool Storage"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -6015,7 +6017,7 @@ /obj/machinery/door/window{ dir = 1; name = "Secure Storage"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -6265,7 +6267,7 @@ normaldoorcontrol = 1; pixel_x = 24; pixel_y = 8; - req_access_txt = "160" + req_access = list(160) }, /obj/machinery/flasher_button{ id = "soltraderflash"; @@ -6285,10 +6287,10 @@ name = "Security Doors"; opacity = 0 }, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/traders, /obj/machinery/door/airlock/titanium/glass{ id_tag = "soltrader_south"; name = "trader shuttle airlock"; - req_access_txt = "160"; security_level = 6 }, /turf/simulated/floor/mineral/titanium/blue, @@ -6360,6 +6362,12 @@ /obj/item/dice/d20, /turf/simulated/floor/wood, /area/trader_station/sol) +"vC" = ( +/obj/machinery/photocopier/faxmachine/longrange{ + department = "Central Command" + }, +/turf/simulated/floor/plasteel, +/area/admin) "vD" = ( /obj/structure/railing, /obj/effect/landmark/spawner/trader, @@ -6906,6 +6914,12 @@ icon_state = "white" }, /area/centcom/control) +"xx" = ( +/obj/machinery/photocopier/faxmachine/longrange/syndie{ + department = "Syndicate" + }, +/turf/simulated/floor/plasteel, +/area/admin) "xy" = ( /obj/structure/bookcase/random, /obj/machinery/light/small, @@ -7148,10 +7162,10 @@ /turf/simulated/floor/grass, /area/centcom/control) "yZ" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/shuttles, /obj/machinery/door/airlock/external{ name = "Supply Shuttle"; - opacity = 0; - req_access_txt = "106" + opacity = 0 }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, @@ -7302,9 +7316,9 @@ "zK" = ( /obj/machinery/door_control/no_emag/no_cyborg{ pixel_x = 24; - req_access_txt = "114"; name = "Specops Teleporter Shutters"; - id = "CCTELE" + id = "CCTELE"; + req_access = list(114) }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) @@ -7347,8 +7361,8 @@ "zW" = ( /obj/machinery/door/window{ name = "Uplink Management Control"; - req_access_txt = "151"; - dir = 4 + dir = 4; + req_access = list(151) }, /turf/simulated/floor/wood, /area/syndicate_mothership) @@ -7423,8 +7437,8 @@ "Am" = ( /obj/machinery/door/window/classic/normal{ name = "cell door"; - req_access_txt = "150"; - dir = 1 + dir = 1; + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -7603,9 +7617,9 @@ /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/shuttle/supply) "AU" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/commander, /obj/machinery/door/airlock/centcom{ - name = "CentCom BSA Control"; - req_access_txt = "114" + name = "CentCom BSA Control" }, /turf/simulated/floor/plasteel/dark, /area/centcom/gamma) @@ -7648,9 +7662,9 @@ /turf/simulated/floor/catwalk, /area/shuttle/supply) "Be" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/shuttles, /obj/machinery/door/airlock/centcom{ - name = "CentCom Supply"; - req_access_txt = "106" + name = "CentCom Supply" }, /turf/simulated/floor/plasteel/dark, /area/centcom/suppy) @@ -7692,8 +7706,8 @@ base_state = "right"; icon_state = "right"; name = "Infirmary"; - req_access_txt = "150"; - dir = 4 + dir = 4; + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -7854,9 +7868,9 @@ /turf/simulated/floor/plasteel/dark, /area/tdome/tdomeobserve) "BV" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ - id_tag = "syndicate_away"; - req_access_txt = "150" + id_tag = "syndicate_away" }, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -8044,7 +8058,7 @@ /obj/machinery/door_control/no_emag{ id = "thunderdome"; name = "Main Blast Doors Control"; - req_access_txt = "102" + req_access = list(102) }, /obj/structure/table/reinforced, /turf/simulated/floor/plasteel{ @@ -8119,7 +8133,7 @@ id = "CCcustoms2"; name = "CentCom Inner Customs Shutters"; pixel_x = 24; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -8132,10 +8146,10 @@ /turf/simulated/floor/plasteel/dark, /area/centcom/control) "CM" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/shuttles, /obj/machinery/door/airlock/external{ name = "Supply Shuttle"; - opacity = 0; - req_access_txt = "106" + opacity = 0 }, /turf/simulated/floor/plating, /area/centcom/suppy) @@ -8230,14 +8244,14 @@ name = "Privacy Shutters"; pixel_x = 6; pixel_y = 10; - req_access_txt = "114" + req_access = list(114) }, /obj/machinery/door_control/no_emag{ pixel_x = -6; pixel_y = -17; name = "Engineering Storage"; id = "SpecopsEngineering"; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/carpet, /area/centcom/specops) @@ -8426,9 +8440,9 @@ /turf/simulated/floor/plasteel/freezer, /area/ghost_bar) "DV" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/commander, /obj/machinery/door/airlock/centcom{ - name = "Administrative Office"; - req_access_txt = "114" + name = "Administrative Office" }, /obj/machinery/door/poddoor/impassable{ id_tag = "specopsoffice"; @@ -8459,9 +8473,9 @@ }, /area/centcom/specops) "Ea" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/centcom{ - name = "Shuttle Control Office"; - req_access_txt = "109" + name = "Shuttle Control Office" }, /turf/simulated/floor/plasteel{ dir = 8; @@ -8507,7 +8521,7 @@ "Ej" = ( /obj/machinery/door/window/reinforced/normal{ name = "Cell Door"; - req_access_txt = "150" + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate_sit) @@ -8517,13 +8531,13 @@ /area/shuttle/administration) "El" = ( /obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ aiControlDisabled = 1; auto_close_time = 25; hackProof = 1; max_integrity = 3000; - name = "Escape Pod Dock"; - req_access_txt = "101" + name = "Escape Pod Dock" }, /turf/simulated/floor/wood, /area/centcom/evac) @@ -8774,8 +8788,8 @@ "Fp" = ( /obj/machinery/door/window/classic/reversed{ name = "Tool Storage"; - req_access_txt = "150"; - dir = 8 + dir = 8; + req_access = list(150) }, /obj/machinery/light/spot{ dir = 1 @@ -8803,8 +8817,8 @@ "Ft" = ( /obj/machinery/door/window{ name = "Infirmary"; - req_access_txt = "150"; - dir = 4 + dir = 4; + req_access = list(150) }, /obj/machinery/light/spot{ dir = 1 @@ -8994,7 +9008,7 @@ /obj/structure/table/wood, /obj/machinery/photocopier{ icon_state = "fax"; - name = "fax machine" + name = "fake fax machine" }, /obj/item/photo{ name = "butts" @@ -9202,7 +9216,7 @@ /obj/machinery/door/window{ dir = 1; name = "Cell A"; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel/dark, /area/admin) @@ -9212,9 +9226,9 @@ "GO" = ( /obj/machinery/door_control/no_emag{ pixel_y = -24; - req_access_txt = "114"; name = "Engineering Storage Shutters"; - id = "SpecopsEngineering" + id = "SpecopsEngineering"; + req_access = list(114) }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) @@ -9614,7 +9628,7 @@ id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -9859,10 +9873,10 @@ }, /area/centcom/specops) "Jb" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "109" + name = "Shuttle Hatch" }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, @@ -9954,7 +9968,7 @@ /area/centcom/suppy) "Jq" = ( /obj/structure/table/wood, -/obj/item/storage/box/beanbag, +/obj/item/storage/fancy/shell/beanbag, /obj/item/gun/projectile/revolver/doublebarrel, /turf/simulated/floor/plasteel{ icon_state = "bar" @@ -10095,7 +10109,7 @@ id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = 32; - req_access_txt = "114" + req_access = list(114) }, /obj/structure/filingcabinet/filingcabinet, /turf/simulated/floor/plasteel{ @@ -10535,7 +10549,7 @@ /obj/machinery/door_control/no_emag{ id = "thunderdomehea"; name = "Heavy Supply Control"; - req_access_txt = "102" + req_access = list(102) }, /obj/structure/table/reinforced, /turf/simulated/floor/plasteel{ @@ -10573,7 +10587,7 @@ id = "ASSAULT"; name = "Mech Storage"; pixel_y = -24; - req_access_txt = "114" + req_access = list(114) }, /obj/effect/turf_decal/caution/stand_clear{ dir = 4 @@ -10816,7 +10830,7 @@ /obj/machinery/door_control/no_emag{ id = "thunderdomegen"; name = "General Supply Control"; - req_access_txt = "102" + req_access = list(102) }, /obj/structure/table/reinforced, /turf/simulated/floor/plasteel{ @@ -10839,9 +10853,9 @@ /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "Mn" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/commander, /obj/machinery/door/airlock/centcom{ - name = "Gamma Armory"; - req_access_txt = "114" + name = "Gamma Armory" }, /obj/machinery/door/poddoor/impassable{ id_tag = "CCGAMMA"; @@ -10945,9 +10959,9 @@ /area/centcom/specops) "Mz" = ( /obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/shuttles, /obj/machinery/door/airlock/centcom{ - name = "CentCom Supply"; - req_access_txt = "106" + name = "CentCom Supply" }, /turf/simulated/floor/plasteel/dark, /area/centcom/suppy) @@ -11039,28 +11053,28 @@ name = "Station Access"; pixel_x = -6; pixel_y = 6; - req_access_txt = "114" + req_access = list(114) }, /obj/machinery/door_control/no_emag{ id = "CCGAMMA"; name = "Gamma Lockdown"; pixel_x = -6; pixel_y = -3; - req_access_txt = "114" + req_access = list(114) }, /obj/machinery/door_control/no_emag{ id = "ASSAULT"; name = "Mech Storage"; pixel_x = 6; pixel_y = 6; - req_access_txt = "114" + req_access = list(114) }, /obj/machinery/door_control/no_emag{ id = "CCDOCK2"; name = "Special Operations Secondary Dock"; pixel_x = 6; pixel_y = -3; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/carpet, /area/centcom/specops) @@ -11072,10 +11086,10 @@ }, /area/holodeck/source_desert) "MS" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "syndishuttle_door_ext"; - name = "Ship External Access"; - req_access_txt = "150" + name = "Ship External Access" }, /obj/machinery/door/poddoor{ density = 0; @@ -11089,7 +11103,7 @@ name = "External Door Control"; pixel_x = -26; pixel_y = 2; - req_access_txt = "150" + req_access = list(150) }, /obj/docking_port/mobile{ dheight = 9; @@ -11656,8 +11670,8 @@ "OM" = ( /obj/machinery/door/window/classic/reversed{ name = "In"; - req_access_txt = "150"; - dir = 1 + dir = 1; + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -11692,12 +11706,12 @@ /obj/machinery/door/poddoor/preopen{ id_tag = "adminshuttleblast"; name = "Blast Doors"; - req_access_txt = "101" + req_access = list(101) }, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "General Access"; - req_access_txt = "101" + name = "General Access" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -11719,7 +11733,7 @@ id = "CCDOCK2"; name = "Special Operations Secondary Dock"; pixel_y = 24; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/plasteel{ dir = 6; @@ -12365,8 +12379,8 @@ "Rl" = ( /obj/machinery/door/window/classic/normal{ name = "Out"; - req_access_txt = "150"; - dir = 1 + dir = 1; + req_access = list(150) }, /turf/simulated/floor/plasteel/dark, /area/syndicate_mothership) @@ -12467,7 +12481,7 @@ name = "Hanger Bay Shutters"; pixel_x = 24; pixel_y = null; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) @@ -12552,7 +12566,7 @@ id = "CCcustoms2"; name = "CentCom Inner Customs Shutters"; pixel_x = -24; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -12587,7 +12601,7 @@ id = "CCcustoms1"; name = "CentCom Outer Customs Shutters"; pixel_x = 24; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -12693,7 +12707,7 @@ name = "Specops Teleporter Shutters"; pixel_x = -24; pixel_y = null; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -12995,7 +13009,7 @@ id = "SpecopsFerry"; name = "Hanger Bay Shutters"; pixel_y = 24; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel{ dir = 5; @@ -13090,9 +13104,9 @@ }, /area/centcom/control) "Uj" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/centcom{ - name = "CentCom Bridge"; - req_access_txt = "109" + name = "CentCom Bridge" }, /turf/simulated/floor/wood, /area/centcom/control) @@ -13151,10 +13165,10 @@ }, /area/shuttle/escape) "Us" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Medbay"; - req_access_txt = "101" + name = "Medbay" }, /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) @@ -13361,8 +13375,8 @@ base_state = "right"; icon_state = "right"; name = "Equipment Room"; - req_access_txt = "150"; - dir = 4 + dir = 4; + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -13592,7 +13606,7 @@ id = "CCcustoms1"; name = "CentCom Outer Customs Shutters"; pixel_x = -24; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -13696,10 +13710,10 @@ /turf/simulated/floor/plasteel, /area/admin) "WD" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "109" + name = "Shuttle Hatch" }, /obj/docking_port/mobile{ dir = 8; @@ -13991,7 +14005,7 @@ id = "SPECOPS"; name = "Nanotrasen Asset Protection Shutters"; pixel_y = -24; - req_access_txt = "109" + req_access = list(109) }, /turf/simulated/floor/plasteel{ dir = 10; @@ -14232,7 +14246,7 @@ id = "CCDOCK2"; name = "Special Operations Secondary Dock"; pixel_y = -24; - req_access_txt = "114" + req_access = list(114) }, /turf/simulated/floor/plasteel/dark, /area/centcom/specops) @@ -14294,8 +14308,8 @@ "Ys" = ( /obj/machinery/door/window{ name = "Equipment Room"; - req_access_txt = "150"; - dir = 4 + dir = 4; + req_access = list(150) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/syndicate) @@ -14383,7 +14397,7 @@ "YJ" = ( /obj/machinery/door/window/classic/normal{ name = "Cell B"; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/plasteel/dark, /area/admin) @@ -14423,11 +14437,11 @@ /turf/simulated/floor/plasteel, /area/centcom/evac) "YS" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate, /obj/machinery/door/airlock/external{ id_tag = "syndishuttle_door_int"; locked = 1; - name = "Ship External Access"; - req_access_txt = "150" + name = "Ship External Access" }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 @@ -62431,7 +62445,7 @@ ab ab ab ab -BZ +sK hG UO iT @@ -65778,7 +65792,7 @@ BY BY BY BY -sK +dt XJ XJ tW @@ -69406,7 +69420,7 @@ vH lZ wR wk -lZ +vC lZ lZ lZ @@ -69663,7 +69677,7 @@ lZ lZ lZ wk -lZ +xx lZ lZ lZ diff --git a/_maps/map_files/shuttles/admin_admin.dmm b/_maps/map_files/shuttles/admin_admin.dmm index c7f30616b8f0..8dbc488e6131 100644 --- a/_maps/map_files/shuttles/admin_admin.dmm +++ b/_maps/map_files/shuttles/admin_admin.dmm @@ -6,19 +6,19 @@ /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/shuttle/administration) "ad" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "101" + name = "Shuttle Hatch" }, /obj/structure/fans/tiny, /turf/simulated/floor/plating, /area/shuttle/administration) "ae" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/external{ id_tag = "s_docking_airlock"; - name = "Shuttle Hatch"; - req_access_txt = "101" + name = "Shuttle Hatch" }, /obj/docking_port/mobile{ dir = 2; @@ -60,7 +60,7 @@ id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; - req_access_txt = "101" + req_access = list(101) }, /obj/machinery/light{ dir = 8 @@ -98,12 +98,12 @@ /obj/machinery/door/poddoor/preopen{ id_tag = "adminshuttleblast"; name = "Blast Doors"; - req_access_txt = "101" + req_access = list(101) }, +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "General Access"; - req_access_txt = "101" + name = "General Access" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -169,15 +169,15 @@ id = "adminshuttleblast"; name = "blast door control"; pixel_x = -30; - req_access_txt = "101" + req_access = list(101) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "aB" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Workshop"; - req_access_txt = "101" + name = "Workshop" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -339,10 +339,10 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "bd" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Bridge"; - req_access_txt = "101" + name = "Bridge" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -357,10 +357,10 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "bh" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Medbay"; - req_access_txt = "101" + name = "Medbay" }, /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) @@ -399,18 +399,18 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "bp" = ( +/obj/effect/mapping_helpers/airlock/access/all/centcomm/security, /obj/machinery/door/airlock/centcom{ id_tag = "adminshuttle"; - name = "Holding Cell"; - req_access_txt = "104" + name = "Holding Cell" }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) "bq" = ( /obj/machinery/door/window/reinforced/normal{ color = "#d70000"; - req_access_txt = "104"; - dir = 8 + dir = 8; + req_access = list(104) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) diff --git a/_maps/map_files/shuttles/admin_armory.dmm b/_maps/map_files/shuttles/admin_armory.dmm index c9304f924b24..7cab651db9a7 100644 --- a/_maps/map_files/shuttles/admin_armory.dmm +++ b/_maps/map_files/shuttles/admin_armory.dmm @@ -53,11 +53,11 @@ /area/shuttle/administration) "df" = ( /obj/structure/rack, -/obj/item/storage/box/buck{ +/obj/item/storage/fancy/shell/buck{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/buck, +/obj/item/storage/fancy/shell/buck, /obj/structure/window/reinforced, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -221,7 +221,7 @@ id = "adminshuttlebridge"; name = "Bridge Privacy Shutters"; pixel_x = 25; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) @@ -267,7 +267,7 @@ name = "External Window Shutter Control"; pixel_x = -5; pixel_y = 35; - req_access_txt = "19" + req_access = list(19) }, /obj/machinery/keycard_auth{ pixel_y = 24 @@ -277,7 +277,7 @@ name = "Airlock Blast Door Control"; pixel_x = 5; pixel_y = 35; - req_access_txt = "19" + req_access = list(19) }, /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -356,11 +356,11 @@ /area/shuttle/administration) "xF" = ( /obj/structure/rack, -/obj/item/storage/box/buck{ +/obj/item/storage/fancy/shell/buck{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/buck, +/obj/item/storage/fancy/shell/buck, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 4 @@ -555,11 +555,11 @@ /area/shuttle/administration) "FT" = ( /obj/structure/rack, -/obj/item/storage/box/buck{ +/obj/item/storage/fancy/shell/buck{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/buck, +/obj/item/storage/fancy/shell/buck, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8 @@ -789,7 +789,7 @@ id = "adminarmoryshutters"; name = "Armory Internal Shutters"; pixel_x = -26; - req_access_txt = "3" + req_access = list(3) }, /turf/simulated/floor/mineral/plastitanium/red, /area/shuttle/administration) diff --git a/_maps/map_files/shuttles/admin_skipjack.dmm b/_maps/map_files/shuttles/admin_skipjack.dmm index 6a8e908d034f..aed953b90165 100644 --- a/_maps/map_files/shuttles/admin_skipjack.dmm +++ b/_maps/map_files/shuttles/admin_skipjack.dmm @@ -13,10 +13,10 @@ /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) "ad" = ( +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox, /obj/machinery/door/airlock/hatch{ id_tag = "voxwest_door_ext"; - locked = 1; - req_access_txt = "152" + locked = 1 }, /obj/structure/fans/tiny, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, @@ -77,7 +77,7 @@ "av" = ( /obj/machinery/access_button{ autolink_id = "voxwest_btn_ext"; - req_one_access_txt = "152" + req_access = list(152) }, /turf/simulated/wall/mineral/plastitanium, /area/shuttle/administration) @@ -97,7 +97,7 @@ int_button_link_id = "voxwest_btn_int"; int_door_link_id = "voxwest_door_int"; pixel_x = 24; - req_access_txt = "152" + req_access = list(152) }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) @@ -127,19 +127,19 @@ /turf/simulated/floor/plating/airless, /area/shuttle/administration) "aM" = ( +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox, /obj/machinery/door/airlock/hatch{ id_tag = "voxeast_door_ext"; - locked = 1; - req_access_txt = "152" + locked = 1 }, /obj/structure/fans/tiny, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) "aN" = ( +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox, /obj/machinery/door/airlock/hatch{ id_tag = "voxwest_door_int"; - locked = 1; - req_access_txt = "152" + locked = 1 }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) @@ -162,9 +162,8 @@ /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) "bb" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "152" - }, +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox, +/obj/machinery/door/airlock/hatch, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) "bd" = ( @@ -232,7 +231,7 @@ "bO" = ( /obj/machinery/access_button{ autolink_id = "voxeast_btn_ext"; - req_access_txt = "152" + req_access = list(152) }, /turf/simulated/wall/mineral/plastitanium, /area/shuttle/administration) @@ -277,16 +276,16 @@ ext_door_link_id = "voxeast_door_ext"; int_door_link_id = "voxeast_door_int"; pixel_x = -24; - req_access_txt = "152"; ext_button_link_id = "voxeast_btn_ext"; - int_button_link_id = "voxeast_btn_int" + int_button_link_id = "voxeast_btn_int"; + req_access = list(152) }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) "cg" = ( /obj/machinery/access_button{ autolink_id = "voxwest_btn_int"; - req_one_access_txt = "152" + req_access = list(152) }, /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/shuttle/administration) @@ -325,15 +324,15 @@ "cn" = ( /obj/machinery/access_button{ autolink_id = "voxeast_btn_int"; - req_one_access_txt = "152" + req_access = list(152) }, /turf/simulated/wall/mineral/plastitanium/nodiagonal, /area/shuttle/administration) "co" = ( +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox, /obj/machinery/door/airlock/hatch{ id_tag = "voxeast_door_int"; - locked = 1; - req_access_txt = "152" + locked = 1 }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) @@ -486,7 +485,7 @@ /obj/machinery/door_control{ id = "voxshutters"; name = "remote shutter control"; - req_access_txt = "152" + req_access = list(152) }, /turf/simulated/floor/mineral/plastitanium/red/nitrogen, /area/shuttle/administration) diff --git a/_maps/map_files/shuttles/emergency_bar.dmm b/_maps/map_files/shuttles/emergency_bar.dmm index b2feadfc8cda..44494f912be1 100644 --- a/_maps/map_files/shuttles/emergency_bar.dmm +++ b/_maps/map_files/shuttles/emergency_bar.dmm @@ -463,6 +463,9 @@ /obj/structure/shuttle/engine/propulsion, /turf/simulated/floor/plating/airless, /area/shuttle/escape) +"qr" = ( +/turf/simulated/wall/indestructible/titanium/nodiagonal, +/area/shuttle/escape) "Jz" = ( /obj/structure/chair/stool/bar{ dir = 4 @@ -521,7 +524,7 @@ ab bo bt bz -ab +qr ab "} (3,1,1) = {" @@ -555,7 +558,7 @@ aa aa ab ac -ab +qr aq ab aK @@ -579,7 +582,7 @@ bL (5,1,1) = {" aa ab -ab +qr ak ai ar @@ -604,7 +607,7 @@ bL "} (6,1,1) = {" ab -ab +qr ah ai al @@ -625,7 +628,7 @@ ab bo bw bA -ab +qr ab "} (7,1,1) = {" @@ -656,7 +659,7 @@ aa "} (8,1,1) = {" ab -ab +qr aj ai al @@ -683,7 +686,7 @@ ab (9,1,1) = {" aa ab -ab +qr am ao al @@ -711,7 +714,7 @@ aa aa ab ac -ab +qr ar ab aB @@ -781,7 +784,7 @@ ac bs by bD -ab +qr ab "} (13,1,1) = {" diff --git a/_maps/map_files/shuttles/emergency_clown.dmm b/_maps/map_files/shuttles/emergency_clown.dmm index 807f8e4933e2..2249a3098dd4 100644 --- a/_maps/map_files/shuttles/emergency_clown.dmm +++ b/_maps/map_files/shuttles/emergency_clown.dmm @@ -374,6 +374,9 @@ "Dr" = ( /turf/simulated/wall/indestructible/syndicate, /area/shuttle/escape) +"MA" = ( +/turf/simulated/wall/indestructible/titanium/nodiagonal, +/area/shuttle/escape) "Uo" = ( /obj/structure/chair/comfy/shuttle{ dir = 8 @@ -430,7 +433,7 @@ ab aw bf bj -ab +MA ab "} (3,1,1) = {" @@ -464,7 +467,7 @@ aa aa ab ac -ab +MA as Dr aB @@ -488,11 +491,11 @@ bt (5,1,1) = {" aa ab -ab +MA ak ao at -Dr +tH tH aI tH @@ -513,7 +516,7 @@ bt "} (6,1,1) = {" ab -ab +MA ah ai am @@ -565,7 +568,7 @@ aa "} (8,1,1) = {" ab -ab +MA aj ai ap @@ -592,7 +595,7 @@ ab (9,1,1) = {" aa ab -ab +MA an aq av @@ -620,7 +623,7 @@ aa aa ab ac -ab +MA Uo ab aD @@ -690,7 +693,7 @@ ac be bi aw -ab +MA ab "} (13,1,1) = {" diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm index d6f6a2b87054..f504ec930e7a 100644 --- a/_maps/map_files/shuttles/emergency_dept.dmm +++ b/_maps/map_files/shuttles/emergency_dept.dmm @@ -409,7 +409,8 @@ name = "Escape Shuttle Cargo"; normalspeed = 0 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mail_sorting, +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "neutralfull" diff --git a/_maps/map_files/shuttles/emergency_old.dmm b/_maps/map_files/shuttles/emergency_old.dmm index 87b13a61c377..20b71b4435fd 100644 --- a/_maps/map_files/shuttles/emergency_old.dmm +++ b/_maps/map_files/shuttles/emergency_old.dmm @@ -326,6 +326,9 @@ /obj/structure/chair/comfy/shuttle, /turf/simulated/floor/mineral/plastitanium/red/brig, /area/shuttle/escape) +"nt" = ( +/turf/simulated/wall/indestructible/titanium/nodiagonal, +/area/shuttle/escape) "rj" = ( /obj/machinery/economy/vending/wallmed/directional/east, /obj/structure/bed/roller, @@ -395,7 +398,7 @@ ab DZ bb bf -ab +nt ab "} (3,1,1) = {" @@ -429,7 +432,7 @@ aa aa ab ac -ab +nt as ab aZ @@ -453,7 +456,7 @@ bo (5,1,1) = {" aa ab -ab +nt al ap at @@ -478,7 +481,7 @@ bo "} (6,1,1) = {" ab -ab +nt ah ai an @@ -530,7 +533,7 @@ aa "} (8,1,1) = {" ab -ab +nt aj ai an @@ -557,7 +560,7 @@ ab (9,1,1) = {" aa ab -ab +nt ao aq an @@ -585,7 +588,7 @@ aa aa ab ac -ab +nt at ab aA @@ -655,7 +658,7 @@ ac rj be aI -ab +nt ab "} (13,1,1) = {" diff --git a/_maps/map_files/shuttles/emergency_raven.dmm b/_maps/map_files/shuttles/emergency_raven.dmm index d71aa52b0e04..c92d211f102e 100644 --- a/_maps/map_files/shuttles/emergency_raven.dmm +++ b/_maps/map_files/shuttles/emergency_raven.dmm @@ -693,7 +693,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; - req_access_txt = "31" + req_access = list(31) }, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) @@ -721,7 +721,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; - req_access_txt = "31" + req_access = list(31) }, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) @@ -1303,7 +1303,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; - req_access_txt = "31" + req_access = list(31) }, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) @@ -1458,7 +1458,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; - req_access_txt = "31" + req_access = list(31) }, /turf/simulated/floor/plasteel/dark, /area/shuttle/escape) diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index efc65bc62cd3..f73acb7c5847 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -609,28 +609,27 @@ /turf/simulated/floor/plasteel, /area/station/security/permabrig) "adP" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, @@ -641,6 +640,7 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -813,7 +813,7 @@ id = "HoS"; pixel_x = 24; pixel_y = -8; - req_access_txt = "58" + req_access = list(58) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -947,14 +947,14 @@ name = "Prison Wing Lockdown"; pixel_x = -28; pixel_y = 7; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -28; pixel_y = -3; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "hosofficedoor"; @@ -962,7 +962,7 @@ normaldoorcontrol = 1; pixel_x = -28; pixel_y = 17; - req_access_txt = "58" + req_access = list(58) }, /turf/simulated/floor/carpet, /area/station/command/office/hos) @@ -1008,7 +1008,7 @@ name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ desc = "A remote control-switch to lock down the prison wing's blast doors"; @@ -1016,7 +1016,7 @@ name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -1484,7 +1484,7 @@ autolink_id = "viro_btn_int"; name = "Virology Lab Access Button"; pixel_x = -24; - req_access_txt = "39" + req_access = list(39) }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -1747,14 +1747,14 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/structure/rack, -/obj/item/storage/box/tranquilizer{ +/obj/item/storage/fancy/shell/tranquilizer{ pixel_x = 3; pixel_y = -3 }, /obj/structure/window/reinforced{ dir = 8 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -2808,7 +2808,7 @@ name = "Secure Armory Shutter Control"; pixel_x = 7; pixel_y = -28; - req_access_txt = "3" + req_access = list(3) }, /obj/structure/cable{ d1 = 4; @@ -5355,8 +5355,7 @@ "asO" = ( /obj/machinery/computer/prisoner{ dir = 4; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -5412,7 +5411,7 @@ normaldoorcontrol = 1; pixel_x = 5; pixel_y = -35; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/door_control{ desc = "A remote control switch for the brig foyer."; @@ -5421,7 +5420,7 @@ normaldoorcontrol = 1; pixel_x = 5; pixel_y = -25; - req_access_txt = "63" + req_access = list(63) }, /obj/structure/cable{ d1 = 1; @@ -5435,7 +5434,7 @@ normaldoorcontrol = 1; pixel_x = -5; pixel_y = -25; - req_access_txt = "63" + req_access = list(63) }, /turf/simulated/floor/plasteel{ dir = 6; @@ -5724,8 +5723,7 @@ "atN" = ( /obj/machinery/computer/prisoner{ dir = 4; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -6059,7 +6057,7 @@ name = "processing tint control"; pixel_x = -24; pixel_y = -8; - req_access_txt = "63" + req_access = list(63) }, /turf/simulated/floor/plasteel, /area/station/security/processing) @@ -7259,7 +7257,7 @@ id = "IAA"; pixel_x = -24; pixel_y = 6; - req_access_txt = "38" + req_access = list(38) }, /obj/machinery/economy/vending/lawdrobe, /turf/simulated/floor/plasteel{ @@ -7627,7 +7625,7 @@ id = "brig_courtroom"; name = "Brig Courtroom Shutter Control"; pixel_x = 25; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -7798,7 +7796,7 @@ id = "Interrogation"; name = "interrogation tint control"; pixel_x = -24; - req_access_txt = "63" + req_access = list(63) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -8008,15 +8006,15 @@ id = "Magistrate"; pixel_x = 24; pixel_y = 6; - req_access_txt = "74" + req_access = list(74) }, /obj/machinery/door_control{ id = "magistrateofficedoor"; name = "Office Door"; normaldoorcontrol = 1; pixel_x = 25; - req_access_txt = "74"; - pixel_y = -4 + pixel_y = -4; + req_access = list(74) }, /turf/simulated/floor/carpet, /area/station/legal/magistrate) @@ -8417,8 +8415,7 @@ }, /obj/machinery/alarm/directional/west, /obj/machinery/computer/prisoner{ - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -8755,7 +8752,7 @@ id = "brig_courtroom"; name = "Brig Courtroom Shutter Control"; pixel_y = 25; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/light{ dir = 1 @@ -9159,7 +9156,7 @@ id = "Detective"; pixel_x = -8; pixel_y = 24; - req_access_txt = "4" + req_access = list(4) }, /turf/simulated/floor/carpet, /area/station/security/detective) @@ -11458,7 +11455,7 @@ /obj/machinery/button/windowtint{ id = "Courtroom"; pixel_x = -8; - req_one_access_txt = "74;3" + req_one_access = list(74,3) }, /turf/simulated/floor/carpet, /area/station/legal/courtroom) @@ -14019,8 +14016,8 @@ /obj/machinery/door_control{ id = "paramedic"; name = "Garage Door Control"; - req_access_txt = "66"; - pixel_x = -24 + pixel_x = -24; + req_access = list(66) }, /obj/machinery/door/poddoor/preopen{ id_tag = "Biohazard_medi"; @@ -19461,7 +19458,7 @@ /area/station/service/bar) "bjc" = ( /obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" + req_access = list(25) }, /turf/simulated/floor/wood, /area/station/service/bar) @@ -19520,7 +19517,7 @@ "bjp" = ( /obj/machinery/door/morgue{ name = "Confession Booth (Chaplain)"; - req_access_txt = "22" + req_access = list(22) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -21450,7 +21447,7 @@ "boy" = ( /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -23980,14 +23977,14 @@ name = "Kitchen Bar Shutters Control"; pixel_x = -6; pixel_y = -24; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/door_control{ id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = 6; pixel_y = -24; - req_access_txt = "28" + req_access = list(28) }, /obj/structure/cable{ d1 = 1; @@ -26071,16 +26068,6 @@ }, /turf/simulated/floor/plasteel, /area/station/supply/warehouse) -"bFp" = ( -/obj/machinery/door_control{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = -1; - pixel_y = -24; - req_access_txt = "31" - }, -/turf/simulated/floor/plasteel, -/area/station/supply/warehouse) "bFq" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = -32 @@ -26938,7 +26925,7 @@ name = "Robotics Lab Shutters Control"; pixel_x = 24; pixel_y = 32; - req_access_txt = "29" + req_access = list(29) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -27732,7 +27719,7 @@ name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = 32; - req_access_txt = "47" + req_access = list(47) }, /obj/effect/landmark/start/scientist, /turf/simulated/floor/plasteel{ @@ -27997,7 +27984,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; - req_access_txt = "31" + req_access = list(31) }, /obj/machinery/power/apc/directional/east, /obj/structure/cable{ @@ -32703,14 +32690,14 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = 25; - req_access_txt = "40" + req_access = list(40) }, /obj/machinery/button/windowtint{ id = "CMO"; pixel_x = 24; pixel_y = 8; - req_access_txt = "40"; - dir = 8 + dir = 8; + req_access = list(40) }, /obj/machinery/light_switch{ pixel_x = 24; @@ -32722,7 +32709,7 @@ id = "Biohazard_medi"; name = "Medical Quarantine"; pixel_x = 35; - req_access_txt = "40" + req_access = list(40) }, /turf/simulated/floor/plasteel{ dir = 6; @@ -33205,7 +33192,7 @@ id = "xenobio4"; name = "Chamber 4 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -34553,7 +34540,7 @@ name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; - req_access_txt = "30" + req_access = list(30) }, /obj/item/folder/white{ pixel_x = 4 @@ -34569,7 +34556,7 @@ normaldoorcontrol = 1; pixel_x = -4; pixel_y = -4; - req_access_txt = "30" + req_access = list(30) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -35714,7 +35701,7 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = 3; - req_one_access_txt = "57" + req_access = list(57) }, /turf/simulated/floor/plasteel{ icon_state = "grimy" @@ -35906,9 +35893,9 @@ /obj/machinery/button/windowtint{ id = "Surgery 1"; pixel_y = -24; - req_access_txt = "45"; dir = 1; - pixel_x = 8 + pixel_x = 8; + req_access = list(45) }, /obj/machinery/iv_drip, /turf/simulated/floor/plasteel{ @@ -39830,7 +39817,7 @@ id = "disvent"; name = "Incinerator Vent Control"; pixel_y = -24; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/atmospherics/meter, /obj/machinery/atmospherics/pipe/simple/visible{ @@ -41346,7 +41333,7 @@ id = "xenobio6"; name = "Chamber 6 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -42063,7 +42050,7 @@ name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 8; - req_access_txt = "24" + req_access = list(24) }, /obj/structure/cable{ d1 = 1; @@ -43226,7 +43213,7 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = -5; - req_access_txt = "56" + req_access = list(56) }, /obj/item/clipboard{ pixel_x = 5 @@ -44836,7 +44823,7 @@ name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 4; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/atmospherics/pipe/simple/visible/purple, /turf/simulated/floor/plasteel, @@ -45378,7 +45365,7 @@ id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = -24; - req_access_txt = "56" + req_access = list(56) }, /obj/structure/cable{ d1 = 1; @@ -45768,7 +45755,7 @@ id = "xenobio7"; name = "Chamber 7 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -46800,14 +46787,14 @@ name = "Auxiliary Vent"; pixel_x = 6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/machinery/door_control{ id = "turbinevent"; name = "Turbine Vent"; pixel_x = -6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -48158,7 +48145,7 @@ id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_y = 25; - req_access_txt = "17;75" + req_access = list(17,75) }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/turf_decal/stripes/line{ @@ -48567,7 +48554,7 @@ control_area = "\improper AI Satellite Antechamber"; name = "AI Antechamber Turret Control"; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /obj/structure/cable{ d1 = 4; @@ -48679,7 +48666,7 @@ control_area = "\improper AI Satellite Atmospherics"; name = "AI Satellite Atmospherics Turret Control"; pixel_x = -28; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -48800,7 +48787,7 @@ control_area = "\improper AI Satellite Service"; name = "AI Satellite Service Bay Turret Control"; pixel_x = 24; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -49117,7 +49104,7 @@ name = "AI Chamber Hallway Turret Control"; pixel_x = 24; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -50516,7 +50503,7 @@ name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/flasher{ id = "AI"; @@ -51582,7 +51569,7 @@ id = "justice_blast"; name = "Space Vent"; pixel_x = -32; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/flasher_button{ id = "Execution"; @@ -52430,7 +52417,7 @@ autolink_id = "atmossm_btn_ext"; name = "Atmospherics Access Button"; pixel_y = -24; - req_access_txt = "24" + req_access = list(24) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -52672,12 +52659,12 @@ "ehs" = ( /obj/machinery/airlock_controller/air_cycler{ pixel_x = -25; - req_access_txt = "10;13"; vent_link_id = "eng_vent"; ext_door_link_id = "eng_door_ext"; int_door_link_id = "eng_door_int"; ext_button_link_id = "eng_btn_ext"; - int_button_link_id = "eng_btn_int" + int_button_link_id = "eng_btn_int"; + req_access = list(10,13) }, /turf/simulated/floor/plating, /area/station/engineering/hardsuitstorage) @@ -54401,7 +54388,7 @@ id = "xenobio2"; name = "Chamber 2 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/cable{ d1 = 1; @@ -54421,8 +54408,8 @@ /obj/machinery/door_control{ id = "mechbay_outer"; name = "Outer Mech Bay Shutters Control"; - req_access_txt = "29"; - pixel_x = 24 + pixel_x = 24; + req_access = list(29) }, /turf/simulated/floor/plasteel, /area/station/science/robotics/chargebay) @@ -54481,8 +54468,8 @@ /obj/machinery/door_control{ id = "mechbay_inner"; name = "Inner Mech Bay Shutter Control"; - req_access_txt = "29"; - pixel_y = -24 + pixel_y = -24; + req_access = list(29) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -55073,11 +55060,11 @@ name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; - req_access_txt = "12"; ext_door_link_id = "turbine_door_ext"; int_door_link_id = "turbine_door_int"; ext_button_link_id = "turbine_btn_ext"; - int_button_link_id = "turbine_btn_int" + int_button_link_id = "turbine_btn_int"; + req_access = list(12) }, /obj/machinery/ignition_switch{ id = "gasturbine"; @@ -55882,7 +55869,7 @@ autolink_id = "engsm_btn_int"; name = "Supermatter Access Button"; pixel_y = -24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -57633,7 +57620,7 @@ name = "Dispossal Vent Control"; pixel_x = -24; pixel_y = 8; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/driver_button{ id_tag = "trash"; @@ -58455,7 +58442,7 @@ autolink_id = "eng_btn_int"; pixel_x = -22; pixel_y = -20; - req_access_txt = "10;13" + req_access = list(10,13) }, /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) @@ -58702,8 +58689,8 @@ /obj/machinery/access_button{ autolink_id = "perma_btn_ext"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = 21 + pixel_y = 21; + req_access = list(2) }, /obj/machinery/door/poddoor/preopen{ id_tag = "Prison Gate"; @@ -60304,7 +60291,7 @@ id = "xenobio1"; name = "Chamber 1 Containment Blast Door"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -61738,12 +61725,12 @@ "iDk" = ( /obj/machinery/airlock_controller/air_cycler{ pixel_y = -25; - req_access_txt = "13"; vent_link_id = "secmaint_vent"; ext_door_link_id = "secmaint_door_ext"; int_door_link_id = "secmaint_door_int"; ext_button_link_id = "secmaint_btn_ext"; - int_button_link_id = "secmaint_btn_int" + int_button_link_id = "secmaint_btn_int"; + req_access = list(13) }, /obj/machinery/atmospherics/unary/vent_pump/high_volume{ dir = 8; @@ -61776,26 +61763,26 @@ name = "East Bridge Blast Door Control"; pixel_x = 6; pixel_y = 2; - req_one_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "bridge blast west"; name = "West Bridge Blast Door Control"; pixel_x = -6; - req_one_access_txt = "19"; - pixel_y = 2 + pixel_y = 2; + req_access = list(19) }, /obj/machinery/door_control{ id = "bridge blast south"; name = "South Bridge Blast Door Control"; pixel_y = -6; - req_one_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "bridge blast north"; name = "North Bridge Blast Door Control"; pixel_y = 10; - req_one_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -63831,8 +63818,7 @@ /area/station/public/dorms) "jFf" = ( /obj/structure/closet/crate/secure{ - req_one_access = list(33,41); - req_one_access_txt = "33;41" + req_one_access = list(33,41) }, /obj/item/circuitboard/chem_dispenser, /obj/item/storage/pill_bottle/random_drug_bottle, @@ -64100,7 +64086,7 @@ id = "teleshutter"; name = "Teleporter Shutters Access Control"; pixel_x = 24; - req_one_access_txt = "62" + req_access = list(62) }, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, @@ -65287,7 +65273,7 @@ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; pixel_y = -24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) @@ -66236,8 +66222,7 @@ /area/station/engineering/control) "kNx" = ( /obj/machinery/computer/prisoner{ - req_access = null; - req_one_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 10; @@ -66766,7 +66751,7 @@ id = "CE"; pixel_x = -8; pixel_y = 24; - req_access_txt = "56" + req_access = list(56) }, /turf/simulated/floor/plasteel{ dir = 5; @@ -67588,7 +67573,7 @@ name = "Atmospherics Lockdown"; pixel_x = 10; pixel_y = 24; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/door_control{ desc = "A remote control-switch for the engineering security doors."; @@ -67596,14 +67581,14 @@ name = "Engineering Lockdown"; pixel_x = -10; pixel_y = 24; - req_access_txt = "10" + req_access = list(10) }, /obj/machinery/door_control{ desc = "A remote control-switch for secure storage."; id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_y = 24; - req_access_txt = "11" + req_access = list(11) }, /obj/structure/table/reinforced, /obj/machinery/photocopier/faxmachine{ @@ -67776,7 +67761,7 @@ autolink_id = "xeno_btn_ext"; name = "Xenobiology Access Button"; pixel_x = -24; - req_access_txt = "55" + req_access = list(55) }, /obj/effect/turf_decal/stripes, /obj/structure/disposalpipe/segment, @@ -68601,9 +68586,9 @@ /obj/machinery/button/windowtint{ pixel_x = 24; id = "qm"; - req_access_txt = "41"; dir = 8; - pixel_y = 5 + pixel_y = 5; + req_access = list(41) }, /obj/machinery/light_switch{ dir = 8; @@ -70981,7 +70966,7 @@ autolink_id = "eng_btn_ext"; pixel_x = -22; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /turf/space, /area/space/nearstation) @@ -71387,7 +71372,7 @@ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; pixel_y = 24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -71800,7 +71785,7 @@ id = "xenobio3"; name = "Chamber 3 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -71854,7 +71839,7 @@ id = "xenobio5"; name = "Chamber 5 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -71908,6 +71893,16 @@ icon_state = "purple" }, /area/station/science/rnd) +"nGo" = ( +/obj/machinery/door_control{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -1; + pixel_y = -24; + req_access = list(31) + }, +/turf/simulated/floor/plasteel, +/area/station/supply/warehouse) "nGC" = ( /obj/structure/disposalpipe/segment/corner, /obj/structure/cable{ @@ -72861,11 +72856,11 @@ name = "Incinerator Access Console"; pixel_x = -26; pixel_y = 6; - req_access_txt = "12"; ext_door_link_id = "incinerator_door_ext"; int_door_link_id = "incinerator_door_int"; ext_button_link_id = "incinerator_btn_ext"; - int_button_link_id = "incinerator_btn_int" + int_button_link_id = "incinerator_btn_int"; + req_access = list(12) }, /obj/machinery/ignition_switch{ id = "Incinerator"; @@ -73177,7 +73172,7 @@ autolink_id = "secmaint_btn_ext"; pixel_x = -25; pixel_y = -25; - req_access_txt = "13" + req_access = list(13) }, /obj/structure/lattice/catwalk, /turf/space, @@ -75972,8 +75967,8 @@ /obj/machinery/access_button{ autolink_id = "perma_btn_int"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = -21 + pixel_y = -21; + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "red" @@ -76209,7 +76204,7 @@ autolink_id = "atmossm_btn_int"; name = "Atmospherics Access Button"; pixel_y = -24; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/door/airlock/atmos/glass{ autoclose = 0; @@ -76674,7 +76669,7 @@ control_area = "\improper AI Upload Chamber"; name = "AI Upload Turret Control"; pixel_x = -28; - req_access_txt = "75" + req_access = list(75) }, /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -77316,8 +77311,8 @@ layer = 3.6; autolink_id = "viro_btn_ext"; name = "Virology Lab Access Button"; - req_access_txt = "39"; - pixel_y = -24 + pixel_y = -24; + req_access = list(39) }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -77931,7 +77926,7 @@ name = "interior access button"; pixel_x = 9; pixel_y = -25; - req_access_txt = "13" + req_access = list(13) }, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 @@ -78401,7 +78396,7 @@ name = "Prison Wing Lockdown"; pixel_x = -32; pixel_y = 22; - req_access_txt = "2" + req_access = list(2) }, /obj/structure/cable{ d1 = 4; @@ -78830,8 +78825,8 @@ /obj/machinery/access_button{ autolink_id = "perma_btn_int"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = 21 + pixel_y = 21; + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -80657,7 +80652,7 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_y = -3; - req_one_access_txt = "20" + req_access = list(20) }, /turf/simulated/floor/carpet/royalblue, /area/station/command/office/captain) @@ -80940,7 +80935,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/engine, @@ -81791,8 +81786,7 @@ /area/station/supply/storage) "snE" = ( /obj/structure/closet/crate/secure{ - req_one_access = list(33,41); - req_one_access_txt = "33;41" + req_one_access = list(33,41) }, /obj/effect/spawner/random/maintenance, /mob/living/simple_animal/hostile/scarybat, @@ -84625,7 +84619,7 @@ name = "Xenobiology Access Button"; pixel_x = 8; pixel_y = 28; - req_access_txt = "55" + req_access = list(55) }, /obj/effect/turf_decal/stripes, /obj/structure/disposalpipe/segment{ @@ -86328,8 +86322,8 @@ /obj/machinery/access_button{ autolink_id = "perma_btn_ext"; name = "Prison Wing Access Button"; - req_access_txt = "2"; - pixel_y = -21 + pixel_y = -21; + req_access = list(2) }, /obj/machinery/door/poddoor/preopen{ id_tag = "Prison Gate"; @@ -86646,14 +86640,14 @@ name = "Queue Privacy Shutters Control"; pixel_x = 6; pixel_y = 25; - req_one_access_txt = "57" + req_access = list(57) }, /obj/machinery/door_control{ id = "hop"; name = "Privacy Shutters Control"; pixel_x = -6; pixel_y = 25; - req_one_access_txt = "57" + req_access = list(57) }, /obj/machinery/flasher_button{ id = "hopflash"; @@ -86929,8 +86923,8 @@ /obj/machinery/door_control{ id = "janitor"; name = "Janitor Shutters Door Control"; - req_access_txt = "26"; - pixel_x = 24 + pixel_x = 24; + req_access = list(26) }, /turf/simulated/floor/plasteel, /area/station/service/janitor) @@ -90834,11 +90828,11 @@ /obj/machinery/airlock_controller/access_controller{ name = "Virology Lab Access Console"; pixel_y = 24; - req_one_access_txt = "39"; ext_door_link_id = "viro_door_ext"; int_door_link_id = "viro_door_int"; ext_button_link_id = "viro_btn_ext"; - int_button_link_id = "viro_btn_int" + int_button_link_id = "viro_btn_int"; + req_access = list(39) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -115021,7 +115015,7 @@ bEB bGY bIz cCh -bFp +nGo qsc bMi bKz diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index d060c61f12f5..fbbc5126d485 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -1309,15 +1309,15 @@ id = "ailockdown"; name = "AI Asteroid Lockdown"; pixel_y = 32; - req_access_txt = "56"; - pixel_x = -5 + pixel_x = -5; + req_access = list(56) }, /obj/machinery/door_control{ id = "aisat"; name = "AI Core Lockdown"; pixel_y = 32; - req_access_txt = "56"; - pixel_x = 5 + pixel_x = 5; + req_access = list(56) }, /turf/simulated/floor/plasteel{ icon_state = "bcircuit" @@ -1378,7 +1378,7 @@ check_synth = 1; name = "AI Chamber Turret Control"; pixel_y = 28; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/requests_console/directional/south, /turf/simulated/floor/plasteel{ @@ -3849,7 +3849,7 @@ name = "AI Asteroid Teleport Shutters Control"; pixel_x = 25; pixel_y = 25; - req_one_access_txt = "17;75" + req_one_access = list(17,75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -4940,7 +4940,7 @@ id = "bridge_lower"; name = "Lower Bridge Lockdown"; pixel_y = 24; - req_one_access_txt = "19;14" + req_one_access = list(19,14) }, /obj/structure/cable/orange{ d1 = 4; @@ -4951,7 +4951,7 @@ id = "bridge_upper"; name = "Upper Bridge Lockdown"; pixel_y = 32; - req_one_access_txt = "19;14" + req_one_access = list(19,14) }, /turf/simulated/floor/carpet/black, /area/station/command/bridge) @@ -5404,9 +5404,7 @@ /area/station/maintenance/fore2) "aLe" = ( /obj/machinery/computer/prisoner{ - dir = 4; - req_access = null; - req_access_txt = "2" + dir = 4 }, /turf/simulated/floor/plasteel{ dir = 8; @@ -6712,9 +6710,7 @@ /area/station/maintenance/fore) "aTR" = ( /obj/machinery/computer/prisoner{ - dir = 4; - req_access = null; - req_access_txt = "2" + dir = 4 }, /turf/simulated/floor/carpet, /area/station/legal/magistrate) @@ -6850,6 +6846,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/simulated/floor/plating, /area/station/maintenance/disposal/east) +"aUB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "darkgreenfull" + }, +/area/station/service/hydroponics) "aUE" = ( /obj/machinery/light{ dir = 8 @@ -7093,10 +7095,7 @@ }, /area/station/hallway/primary/fore/west) "aWm" = ( -/obj/machinery/computer/prisoner{ - req_access = null; - req_access_txt = "2" - }, +/obj/machinery/computer/prisoner, /turf/simulated/floor/plasteel, /area/station/security/prisonershuttle) "aWo" = ( @@ -9711,7 +9710,7 @@ name = "Medical Asteroid Lockdown"; pixel_x = 10; pixel_y = 39; - req_access_txt = "40" + req_access = list(40) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -12621,8 +12620,8 @@ /obj/machinery/access_button{ autolink_id = "viro_btn_int"; name = "Virology Lab Access Button"; - req_access_txt = "39"; - pixel_y = -24 + pixel_y = -24; + req_access = list(39) }, /turf/simulated/floor/plasteel{ icon_state = "whitegreenfull" @@ -13459,8 +13458,7 @@ name = "Command EVA shutter control"; pixel_x = 25; pixel_y = 24; - req_access_txt = null; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -13815,7 +13813,7 @@ autolink_id = "engsm_btn_int"; name = "Supermatter Access Button"; pixel_y = 24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -14245,7 +14243,7 @@ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; pixel_y = -24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -14864,7 +14862,7 @@ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; pixel_y = 24; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -15104,7 +15102,7 @@ name = "Secure Armory Shutter Control"; pixel_x = 12; pixel_y = 28; - req_access_txt = "3" + req_access = list(3) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -15195,49 +15193,48 @@ /turf/simulated/floor/grass, /area/station/science/genetics) "bLm" = ( -/obj/structure/rack, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 }, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot, +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = 3; pixel_y = -3 }, /obj/structure/window/reinforced{ dir = 8 }, +/obj/item/storage/fancy/shell/tranquilizer{ + pixel_x = 7; + pixel_y = -5 + }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" }, /area/station/security/armory/secure) "bLr" = ( -/obj/structure/rack, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag, +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = -3; pixel_y = 3 }, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/tranquilizer{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/item/storage/fancy/shell/beanbag, +/obj/item/storage/fancy/shell/beanbag, /obj/structure/window/reinforced{ dir = 4 }, @@ -15245,6 +15242,7 @@ dir = 1; layer = 2.9 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -15606,21 +15604,21 @@ id = "engiestoragesmes"; name = "Secure Storage Blast Door Control"; pixel_x = -24; - req_access_txt = "10;11" + req_access = list(10,11) }, /obj/machinery/door_control{ id = "engineeringlockdown"; name = "Engineering Emergency Lockdown Control"; pixel_x = -24; pixel_y = 8; - req_access_txt = "10;11" + req_access = list(10,11) }, /obj/machinery/door_control{ id = "ceoffice"; name = "Office Emergency Lockdown"; pixel_x = -24; pixel_y = -8; - req_access_txt = "10;11" + req_access = list(10,11) }, /obj/structure/cable{ d2 = 4; @@ -20406,14 +20404,14 @@ name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -21301,7 +21299,7 @@ name = "Arrivals EVA shutter control"; pixel_x = 25; pixel_y = 6; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -24056,7 +24054,7 @@ id = "servlockdown"; name = "Service Asteroid Lockdown"; pixel_y = 32; - req_access_txt = "57" + req_access = list(57) }, /obj/machinery/computer/guestpass/hop{ pixel_x = 28 @@ -25021,13 +25019,13 @@ name = "Desk Shutters"; pixel_x = 24; pixel_y = 8; - req_access_txt = "57" + req_access = list(57) }, /obj/machinery/door_control{ id = "hopexternal"; name = "External Lockdown"; pixel_x = 24; - req_access_txt = "57" + req_access = list(57) }, /obj/machinery/door_control/ticket_machine_button{ pixel_x = 24; @@ -25938,14 +25936,14 @@ name = "Auxiliary Vent Control"; pixel_x = 6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/machinery/door_control{ id = "turbinevent"; name = "Turbine Vent Control"; pixel_x = -6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/meter, @@ -25980,11 +25978,11 @@ name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; - req_access_txt = "12"; ext_door_link_id = "turbine_door_ext"; int_door_link_id = "turbine_door_int"; ext_button_link_id = "turbine_btn_ext"; - int_button_link_id = "turbine_btn_int" + int_button_link_id = "turbine_btn_int"; + req_access = list(12) }, /turf/simulated/floor/plasteel, /area/station/maintenance/turbine) @@ -26291,7 +26289,7 @@ name = "Civilian EVA shutter control"; pixel_x = 25; pixel_y = 24; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -26889,6 +26887,11 @@ icon_state = "redcorner" }, /area/station/security/prison/cell_block/A) +"dcR" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/simulated/floor/plating/asteroid/ancient, +/area/station/maintenance/port) "dda" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -27555,7 +27558,7 @@ control_area = "\improper AI Satellite Secondary Antechamber"; name = "AI Satellite Secondary Antechamber Turret Control"; pixel_y = 32; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -28022,17 +28025,6 @@ /obj/machinery/ai_status_display, /turf/simulated/wall/r_wall, /area/station/security/prisonlockers) -"dkb" = ( -/obj/machinery/requests_console/directional/south, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "grimy" - }, -/area/station/security/detective) "dkc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -30893,8 +30885,8 @@ layer = 3.6; autolink_id = "viro_btn_ext"; name = "Virology Lab Access Button"; - req_access_txt = "39"; - pixel_y = -24 + pixel_y = -24; + req_access = list(39) }, /turf/simulated/floor/plasteel{ icon_state = "whitegreenfull" @@ -31944,7 +31936,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/bananium, /obj/effect/mapping_helpers/airlock/autoname, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/effect/mapping_helpers/airlock/access/all/service/clown, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable/orange{ @@ -32488,7 +32480,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -33220,7 +33212,7 @@ name = "Garage Door Control"; pixel_x = 24; pixel_y = 1; - req_access_txt = "66" + req_access = list(66) }, /obj/structure/sink{ dir = 4; @@ -33752,23 +33744,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/simulated/floor/plating, /area/station/maintenance/starboard) -"enw" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/window/classic/normal{ - name = "Kitchen"; - dir = 1 - }, -/obj/machinery/door/window/classic/normal, -/obj/effect/mapping_helpers/airlock/windoor/autoname, -/obj/effect/mapping_helpers/airlock/windoor/access/any/service/hydroponics, -/obj/effect/mapping_helpers/airlock/windoor/access/any/service/kitchen{ - dir = 1 - }, -/obj/machinery/smartfridge/food/chef, -/turf/simulated/floor/plasteel{ - icon_state = "neutralfull" - }, -/area/station/service/kitchen) "enx" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 @@ -35900,6 +35875,12 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/port) +"eTe" = ( +/obj/machinery/hologram/holopad, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/service/hydroponics) "eTg" = ( /obj/machinery/recharge_station, /turf/simulated/floor/plasteel{ @@ -35946,8 +35927,7 @@ /turf/simulated/floor/grass, /area/station/hallway/spacebridge/scidock) "eTI" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/blood/splatter, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port) "eTJ" = ( @@ -37620,13 +37600,6 @@ }, /turf/simulated/floor/plating, /area/station/hallway/primary/central/west) -"fvV" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/effect/landmark/start/detective, -/turf/simulated/floor/carpet, -/area/station/security/detective) "fwd" = ( /obj/effect/decal/cleanable/crayon, /turf/simulated/floor/wood, @@ -38652,6 +38625,23 @@ icon_state = "bluecorner" }, /area/station/hallway/primary/starboard/south) +"fOh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/window/classic/normal{ + name = "Kitchen"; + dir = 1 + }, +/obj/machinery/door/window/classic/normal, +/obj/effect/mapping_helpers/airlock/windoor/autoname, +/obj/effect/mapping_helpers/airlock/windoor/access/any/service/hydroponics, +/obj/effect/mapping_helpers/airlock/windoor/access/any/service/kitchen{ + dir = 1 + }, +/obj/machinery/smartfridge/food/chef, +/turf/simulated/floor/plasteel{ + icon_state = "neutralfull" + }, +/area/station/service/kitchen) "fOi" = ( /obj/machinery/light/small{ dir = 4 @@ -38747,12 +38737,6 @@ icon_state = "dark" }, /area/station/engineering/control) -"fPD" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" - }, -/area/station/maintenance/port) "fPE" = ( /obj/structure/disposalpipe/segment/corner{ dir = 4 @@ -41261,6 +41245,25 @@ icon_state = "whitepurple" }, /area/station/science/genetics) +"gEI" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Walkway" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "servlockdown"; + layer = 2.6; + name = "Service Lockdown" + }, +/obj/structure/disposalpipe/segment{ + color = "#954535" + }, +/obj/effect/turf_decal/caution/red, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "neutralcorner" + }, +/area/station/hallway/spacebridge/sercom) "gEJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -41939,8 +41942,8 @@ /obj/machinery/door_control{ id = "qm_warehouse"; name = "Warehouse Door Control"; - req_access_txt = "31"; - pixel_x = 24 + pixel_x = 24; + req_access = list(31) }, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -43786,6 +43789,7 @@ /area/station/service/bar) "htz" = ( /obj/effect/spawner/random_spawners/dirt_often, +/obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ icon_state = "darkgreenfull" }, @@ -45672,7 +45676,7 @@ autolink_id = "atmossm_btn_ext"; name = "Atmospherics Access Button"; pixel_y = -24; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 @@ -47237,13 +47241,6 @@ icon_state = "browncorner" }, /area/station/hallway/primary/fore/east) -"inP" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" - }, -/area/station/maintenance/port) "inQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Port Asteroid Maintenance" @@ -49450,7 +49447,7 @@ id = "mixvent"; name = "Mixing Room Vent Control"; pixel_x = -24; - req_access_txt = "7" + req_access = list(7) }, /obj/machinery/atmospherics/unary/portables_connector{ dir = 8 @@ -50462,21 +50459,6 @@ icon_state = "dark" }, /area/station/hallway/primary/starboard/south) -"jeu" = ( -/obj/machinery/hologram/holopad, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/station/service/hydroponics) "jeB" = ( /obj/structure/transit_tube/station/reverse/flipped{ dir = 4 @@ -51141,22 +51123,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/station/security/lobby) -"joS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/station/service/hydroponics) "joZ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -52226,7 +52192,7 @@ name = "Science Asteroid Lockdown"; pixel_x = -24; pixel_y = -5; - req_access_txt = "30" + req_access = list(30) }, /obj/structure/table, /obj/item/book/manual/wiki/sop_science{ @@ -52297,7 +52263,7 @@ name = "AI Sat EVA shutter control"; pixel_x = 24; pixel_y = 25; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -52679,7 +52645,7 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = -24; - req_access_txt = "67" + req_access = list(67) }, /obj/machinery/button/windowtint{ dir = 1; @@ -55799,6 +55765,15 @@ /area/station/medical/medbay) "kAT" = ( /obj/machinery/hologram/holopad, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -56481,7 +56456,7 @@ "kMH" = ( /obj/machinery/door/airlock/tranquillite, /obj/effect/mapping_helpers/airlock/autoname, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/effect/mapping_helpers/airlock/access/all/service/mime, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -56701,7 +56676,7 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = -24; - req_access_txt = "73" + req_access = list(73) }, /obj/machinery/button/windowtint{ dir = 1; @@ -57640,7 +57615,7 @@ name = "Garage Door Control"; pixel_x = -24; pixel_y = 1; - req_access_txt = "66" + req_access = list(66) }, /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -57760,6 +57735,12 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/port) +"lhc" = ( +/obj/effect/spawner/random_spawners/dirt_often, +/turf/simulated/floor/plasteel{ + icon_state = "darkgreenfull" + }, +/area/station/service/hydroponics) "lhf" = ( /obj/effect/spawner/window/reinforced/grilled, /obj/structure/cable/orange{ @@ -57993,10 +57974,6 @@ }, /turf/simulated/floor/plasteel/freezer, /area/station/service/kitchen) -"ljz" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/simulated/floor/plating/asteroid/ancient, -/area/station/maintenance/port) "ljL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -61297,12 +61274,11 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "mgq" = ( -/obj/effect/spawner/random_spawners/dirt_often, -/obj/effect/turf_decal/delivery, -/turf/simulated/floor/plasteel{ - icon_state = "darkgreenfull" +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" }, -/area/station/service/hydroponics) +/area/station/maintenance/port) "mgu" = ( /obj/docking_port/stationary{ dir = 4; @@ -61788,7 +61764,7 @@ name = "Dispossal Vent Control"; pixel_x = 24; pixel_y = 8; - req_access_txt = "12" + req_access = list(12) }, /obj/effect/spawner/random_spawners/dirt_frequent, /turf/simulated/floor/plating, @@ -64317,9 +64293,7 @@ /turf/simulated/floor/plating, /area/station/security/prison/cell_block/A) "mYT" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, +/obj/structure/closet/secure_closet/bar, /obj/item/radio/intercom{ name = "north bump"; pixel_y = 28 @@ -65159,9 +65133,9 @@ /obj/machinery/button/windowtint{ id = "Courtroom"; pixel_x = -24; - req_one_access_txt = "74;3"; dir = 4; - pixel_y = -8 + pixel_y = -8; + req_one_access = list(74,3) }, /turf/simulated/floor/carpet, /area/station/legal/courtroom) @@ -65385,8 +65359,16 @@ /turf/simulated/floor/plating, /area/station/engineering/tech_storage) "nsy" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -66348,8 +66330,8 @@ /obj/machinery/button/windowtint{ id = "Detective"; pixel_x = -24; - req_access_txt = "4"; - dir = 4 + dir = 4; + req_access = list(4) }, /turf/simulated/floor/carpet, /area/station/security/detective) @@ -68114,8 +68096,8 @@ /obj/machinery/door_control{ id = "engiestoragesmes"; name = "Secure Storage Blast Door Control"; - req_access_txt = "56"; - pixel_x = -24 + pixel_x = -24; + req_access = list(56) }, /turf/simulated/floor/plating, /area/station/engineering/smes) @@ -68399,7 +68381,7 @@ name = "Science EVA shutter control"; pixel_x = -25; pixel_y = 24; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/structure/sign/directions/security{ dir = 1; @@ -69040,11 +69022,11 @@ name = "Mixing Room Access Console"; pixel_x = -26; pixel_y = 6; - req_access_txt = "12"; ext_door_link_id = "incinerator_door_ext"; int_door_link_id = "incinerator_door_int"; ext_button_link_id = "incinerator_btn_ext"; - int_button_link_id = "incinerator_btn_int" + int_button_link_id = "incinerator_btn_int"; + req_access = list(12) }, /obj/machinery/ignition_switch{ id = "Incinerator"; @@ -72450,8 +72432,8 @@ /obj/machinery/door_control{ id = "RoboticsShutters"; name = "Robotics Privacy Shutters"; - req_access_txt = "29"; - pixel_y = -24 + pixel_y = -24; + req_access = list(29) }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -73796,7 +73778,7 @@ name = "Prison Wing Lockdown"; pixel_x = 1; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "hosofficedoor"; @@ -73804,14 +73786,14 @@ normaldoorcontrol = 1; pixel_x = 11; pixel_y = -28; - req_access_txt = "58" + req_access = list(58) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = -9; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -76343,7 +76325,7 @@ id = "teleshutter"; name = "Teleporter Shutters Access Control"; pixel_y = -24; - req_access_txt = "62" + req_access = list(62) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -80182,8 +80164,8 @@ /obj/machinery/door_control{ id = "qm_warehouse"; name = "Warehouse Door Control"; - req_access_txt = "31"; - pixel_x = -24 + pixel_x = -24; + req_access = list(31) }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ @@ -81345,7 +81327,7 @@ id = "MechbayShutters2"; name = "Mechbay Shutters"; pixel_y = 24; - req_access_txt = "29" + req_access = list(29) }, /obj/machinery/door/poddoor/shutters{ dir = 8; @@ -81423,7 +81405,7 @@ name = "Chemistry Shutter Control"; pixel_x = 24; pixel_y = 22; - req_access_txt = "33" + req_access = list(33) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -84169,7 +84151,7 @@ name = "AI Asteroid Teleport Shutters Control"; pixel_x = -25; pixel_y = 25; - req_one_access_txt = "17;75" + req_one_access = list(17,75) }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel{ @@ -84469,6 +84451,14 @@ icon_state = "asteroidplating" }, /area/station/maintenance/port) +"sNb" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/service/hydroponics) "sNm" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -84484,7 +84474,7 @@ id = "RnDShutters"; name = "Research Privacy Shutters"; pixel_y = 24; - req_access_txt = "47" + req_access = list(47) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -85380,9 +85370,7 @@ /area/station/maintenance/fpmaint) "sZS" = ( /obj/machinery/computer/prisoner{ - dir = 1; - req_access = null; - req_access_txt = "2" + dir = 1 }, /obj/machinery/light_switch{ dir = 1; @@ -85395,7 +85383,7 @@ name = "Prison Wing Lockdown"; pixel_x = -9; pixel_y = -24; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -87993,12 +87981,6 @@ /obj/effect/spawner/airlock/s_to_n, /turf/simulated/wall, /area/station/hallway/primary/central/north) -"tMD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "darkgreenfull" - }, -/area/station/service/hydroponics) "tMN" = ( /obj/machinery/door/airlock/external{ id_tag = "laborcamp_home"; @@ -88548,41 +88530,41 @@ id = "ailockdown"; name = "AI Asteroid Lockdown"; pixel_y = 40; - req_access_txt = "56" + req_access = list(56) }, /obj/machinery/door_control{ id = "servlockdown"; name = "Service Lockdown"; pixel_x = -10; pixel_y = 32; - req_access_txt = "57" + req_access = list(57) }, /obj/machinery/door_control{ id = "medlockdown"; name = "Medical Lockdown"; pixel_x = 10; pixel_y = 32; - req_access_txt = "40" + req_access = list(40) }, /obj/machinery/door_control{ id = "cargolockdown"; name = "Cargo Lockdown"; pixel_x = 10; pixel_y = 40; - req_access_txt = "41" + req_access = list(41) }, /obj/machinery/door_control{ id = "scilockdown"; name = "Science Lockdown"; pixel_x = -10; pixel_y = 24; - req_access_txt = "30" + req_access = list(30) }, /obj/machinery/door_control{ id = "engilockdown"; name = "Engineering Lockdown"; pixel_y = 32; - req_access_txt = "56" + req_access = list(56) }, /turf/simulated/floor/carpet/black, /area/station/command/bridge) @@ -89337,7 +89319,7 @@ name = "Cargo EVA shutter control"; pixel_x = -25; pixel_y = 24; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -89421,7 +89403,7 @@ id = "engilockdown"; name = "Engineering Lockdown"; pixel_y = 24; - req_access_txt = "56" + req_access = list(56) }, /obj/machinery/photocopier/faxmachine{ department = "Chief Engineer's Office" @@ -89595,12 +89577,12 @@ }, /obj/machinery/airlock_controller/access_controller{ name = "Virology Lab Access Console"; - req_one_access_txt = "39"; ext_door_link_id = "viro_door_ext"; int_door_link_id = "viro_door_int"; ext_button_link_id = "viro_btn_ext"; int_button_link_id = "viro_btn_int"; - pixel_x = -24 + pixel_x = -24; + req_access = list(39) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -92010,7 +91992,7 @@ /turf/simulated/floor/plating, /area/station/engineering/tech_storage) "uQB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ icon_state = "darkgreenfull" }, @@ -99096,7 +99078,7 @@ id = "bridge"; dir = 1; pixel_y = 7; - req_one_access_txt = "19;41" + req_one_access = list(19,41) }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -100412,7 +100394,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = 24; - req_access_txt = "10" + req_access = list(10) }, /obj/machinery/camera{ c_tag = "SM South"; @@ -101439,8 +101421,7 @@ /area/station/hallway/spacebridge/dockmed) "xwQ" = ( /obj/structure/closet/crate/secure{ - req_one_access = list(33,41); - req_one_access_txt = "33;41" + req_one_access = list(33,41) }, /obj/item/circuitboard/chem_dispenser, /obj/item/storage/pill_bottle/random_drug_bottle, @@ -101968,25 +101949,13 @@ icon_state = "dark" }, /area/station/engineering/control) -"xCu" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Walkway" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id_tag = "servlockdown"; - layer = 2.6; - name = "Service Lockdown" - }, -/obj/structure/disposalpipe/segment{ - color = "#954535" - }, -/obj/effect/turf_decal/caution/red, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "neutralcorner" +"xCH" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" }, -/area/station/hallway/spacebridge/sercom) +/area/station/maintenance/port) "xCR" = ( /obj/machinery/computer/security/telescreen/entertainment, /turf/simulated/mineral/ancient, @@ -102292,7 +102261,7 @@ autolink_id = "atmossm_btn_int"; name = "Atmospherics Access Button"; pixel_y = -24; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 @@ -102363,6 +102332,13 @@ /obj/machinery/light/small, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port) +"xHt" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/detective, +/turf/simulated/floor/carpet, +/area/station/security/detective) "xHF" = ( /obj/structure/cable/orange{ d1 = 4; @@ -103188,6 +103164,17 @@ icon_state = "whitepurple" }, /area/station/maintenance/apmaint) +"xTG" = ( +/obj/machinery/requests_console/directional/south, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "grimy" + }, +/area/station/security/detective) "xTL" = ( /turf/simulated/floor/plasteel{ icon_state = "white" @@ -104146,8 +104133,8 @@ /obj/machinery/door_control{ id = "medeva"; name = "Medical EVA shutter control"; - req_one_access_txt = "19;41"; - pixel_y = 24 + pixel_y = 24; + req_one_access = list(19,41) }, /obj/effect/spawner/random_spawners/dirt_often, /turf/simulated/floor/plating, @@ -104530,7 +104517,7 @@ id = "MechbayShutters"; name = "Mechbay Shutters"; pixel_x = 25; - req_access_txt = "29" + req_access = list(29) }, /obj/machinery/door/poddoor/shutters{ dir = 2; @@ -113239,7 +113226,7 @@ rho uSf ygl wzC -fPD +mgq aXn aXn aXn @@ -113496,7 +113483,7 @@ aXn wGX ygl wzC -inP +xCH aXn aXn aXn @@ -114532,7 +114519,7 @@ eHn ohJ gUw xZV -ljz +eTI iuf mkL aXn @@ -115049,7 +115036,7 @@ aXn aXn dLa hwS -ljz +eTI kad uCK aXn @@ -116031,7 +116018,7 @@ eHu aXn aXn aXn -inP +xCH eCI ltk wzC @@ -117820,7 +117807,7 @@ uCK aXn aXn hvI -eTI +dcR pAV pXy dHZ @@ -119867,7 +119854,7 @@ aXn aXn eCI pDl -inP +xCH aXn aXn ock @@ -120101,8 +120088,8 @@ chV evL qwd pPN -fvV -dkb +xHt +xTG emw abW nxA @@ -122740,7 +122727,7 @@ btd btd uql cBs -joS +nsy cBs cBs biB @@ -122943,7 +122930,7 @@ bpf pbY pbY pbY -xCu +gEI abT jSU grv @@ -122997,9 +122984,9 @@ cuk prN mcu pcu -jeu +kAT jKU -nsy +sNb biB hqe btd @@ -123506,7 +123493,7 @@ mrt mrt mrt mrt -enw +fOh prN biB cBs @@ -123774,7 +123761,7 @@ biB biB xNP biB -kAT +eTe kDy biB etV @@ -124548,7 +124535,7 @@ lJR lJR btd pNE -mgq +htz btd cEM eQC @@ -125309,11 +125296,11 @@ muv lYO riS mcu -uQB -uQB -uQB +aUB +aUB +aUB hpP -tMD +uQB haI lUc xAS @@ -125566,7 +125553,7 @@ baF jUW fPp cxx -htz +lhc xnz wFD rxy diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index bc2adc3fdae1..03e676b8cf72 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -6343,17 +6343,6 @@ icon_state = "brown" }, /area/station/supply/warehouse) -"azF" = ( -/obj/machinery/door_control{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = 24; - pixel_y = -3; - req_access_txt = "31" - }, -/obj/effect/decal/cleanable/cobweb2, -/turf/simulated/floor/plating, -/area/station/supply/warehouse) "azG" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -6363,7 +6352,7 @@ name = "Warehouse Door Control"; pixel_x = -24; pixel_y = -3; - req_access_txt = "31" + req_access = list(31) }, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel{ @@ -9905,7 +9894,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = 24; - req_access_txt = "24" + req_access = list(24) }, /obj/structure/cable/yellow{ d1 = 4; @@ -12232,7 +12221,7 @@ id = "janitorshutters"; name = "Janitor Shutters Control"; pixel_x = 25; - req_access_txt = "26" + req_access = list(26) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -16243,7 +16232,7 @@ id = "cell1lockdown"; name = "Cell Lockdown"; pixel_y = 32; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/flasher_button{ id = "Cell 1"; @@ -16284,7 +16273,7 @@ id = "cell2lockdown"; name = "Cell Lockdown"; pixel_y = 32; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "darkredcorners" @@ -18853,6 +18842,7 @@ /obj/item/grenade/barrier, /obj/item/grenade/barrier, /obj/structure/rack, +/obj/item/storage/fancy/shell/tranquilizer, /turf/simulated/floor/plasteel, /area/station/security/armory/secure) "bhk" = ( @@ -23147,7 +23137,7 @@ id = "bridge blast north"; name = "North Bridge Blast Door Control"; pixel_y = 32; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel/dark, /area/station/command/bridge) @@ -24371,14 +24361,14 @@ name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -25716,7 +25706,7 @@ id = "bridge blast east"; name = "East Bridge Blast Door Control"; pixel_x = 26; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel/dark, /area/station/command/bridge) @@ -26904,7 +26894,7 @@ name = "West Bridge Blast Door Control"; pixel_x = null; pixel_y = 24; - req_access_txt = "19" + req_access = list(19) }, /obj/structure/cable{ d1 = 4; @@ -27104,7 +27094,7 @@ name = "East Bridge Blast Door Control"; pixel_x = null; pixel_y = 24; - req_access_txt = "19" + req_access = list(19) }, /obj/item/kirbyplants, /obj/structure/cable{ @@ -29284,7 +29274,7 @@ control_area = "\improper AI Upload Chamber"; name = "AI Upload Turret Control"; pixel_y = -24; - req_one_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/carpet, /area/station/command/bridge) @@ -29294,14 +29284,14 @@ name = "Expedition Shutters Access Control"; pixel_x = 7; pixel_y = -26; - req_access_txt = "62" + req_access = list(62) }, /obj/machinery/door_control{ id = "eva-shutters"; name = "Auxilary E.V.A. Storage"; pixel_x = -7; pixel_y = -26; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/keycard_auth{ pixel_y = -38 @@ -30343,7 +30333,7 @@ id = "transitlock"; name = "Transit Tube Lockdown Control"; pixel_y = 24; - req_access_txt = "11" + req_access = list(11) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -30563,7 +30553,7 @@ name = "Privacy Shutters"; pixel_x = 5; pixel_y = -4; - req_one_access_txt = "18" + req_access = list(18) }, /obj/structure/cable{ d1 = 2; @@ -32628,7 +32618,7 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = -5; - req_access_txt = "56" + req_access = list(56) }, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" @@ -34591,7 +34581,7 @@ control_area = "\improper AI Satellite"; name = "AI Antechamber Turret Control"; pixel_x = -28; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/plasteel{ @@ -34896,14 +34886,14 @@ name = "Engineering Secure Storage Control"; pixel_x = -38; pixel_y = 8; - req_access_txt = "11" + req_access = list(11) }, /obj/machinery/door_control{ id = "transitlock"; name = "Transit Tube Lockdown Control"; pixel_x = -38; pixel_y = -8; - req_access_txt = "11" + req_access = list(11) }, /obj/machinery/computer/security/engineering{ dir = 4 @@ -34914,7 +34904,7 @@ pixel_x = -24; pixel_y = 9; range = 12; - req_access_txt = "56" + req_access = list(56) }, /turf/simulated/floor/plasteel/dark, /area/station/command/office/ce) @@ -36409,8 +36399,7 @@ /area/station/legal/lawoffice) "caM" = ( /obj/machinery/computer/prisoner{ - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -36476,13 +36465,13 @@ name = "Privacy Shutters"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/door_control{ id = "hopqueueshutters"; name = "Queue Shutters"; pixel_x = -24; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/door_control/ticket_machine_button{ pixel_x = -24; @@ -36941,7 +36930,7 @@ normaldoorcontrol = 1; pixel_x = -24; pixel_y = -8; - req_access_txt = "73" + req_access = list(73) }, /obj/machinery/light_switch{ dir = 4; @@ -37033,7 +37022,7 @@ normaldoorcontrol = 1; pixel_x = 24; pixel_y = -24; - req_access_txt = "67" + req_access = list(67) }, /turf/simulated/floor/wood, /area/station/command/office/blueshield) @@ -38413,7 +38402,7 @@ /obj/machinery/button/windowtint{ id = "Courtroom"; pixel_x = -8; - req_one_access_txt = "74;3" + req_one_access = list(74,3) }, /obj/structure/cable{ d1 = 1; @@ -38472,7 +38461,7 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = -25; - req_access_txt = "74" + req_access = list(74) }, /turf/simulated/floor/carpet, /area/station/legal/magistrate) @@ -38761,7 +38750,7 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = -8; - req_access_txt = "57" + req_access = list(57) }, /turf/simulated/floor/carpet, /area/station/command/office/hop) @@ -38808,7 +38797,7 @@ id = "BS"; pixel_x = -24; pixel_y = -8; - req_access_txt = "67" + req_access = list(67) }, /turf/simulated/floor/wood, /area/station/command/office/blueshield) @@ -39927,7 +39916,7 @@ id = "teleaccessshutter"; name = "Teleporter Shutters Access Control"; pixel_y = 24; - req_access_txt = "17" + req_access = list(17) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -41447,7 +41436,7 @@ id = "teleportershutter"; name = "Teleporter Shutters Access Control"; pixel_x = -24; - req_access_txt = "17" + req_access = list(17) }, /obj/machinery/door/poddoor/shutters{ dir = 2; @@ -41574,7 +41563,7 @@ /obj/structure/closet/secure_closet{ anchored = 1; name = "Evidence Storage"; - req_access_txt = "4" + req_access = list(4) }, /obj/item/restraints/handcuffs/pinkcuffs, /obj/item/clothing/under/rank/security/officer, @@ -43005,7 +42994,7 @@ "csI" = ( /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -47154,7 +47143,7 @@ id = "eva-shutters"; name = "Auxilary E.V.A. Storage"; pixel_x = 26; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/door/poddoor/shutters{ dir = 2; @@ -50456,7 +50445,7 @@ /obj/machinery/door_control{ id = "xeno6"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 4 @@ -50886,7 +50875,7 @@ /obj/machinery/door_control{ id = "xeno4"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 4 @@ -50972,7 +50961,7 @@ /obj/machinery/door_control{ id = "xeno5"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 4 @@ -51248,7 +51237,7 @@ id = "xenosecure"; name = "Containment Control"; pixel_y = -3; - req_access_txt = "55" + req_access = list(55) }, /obj/effect/turf_decal/delivery/hollow, /turf/simulated/floor/plasteel/white, @@ -51802,7 +51791,7 @@ /obj/machinery/door_control{ id = "xeno2"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 8 @@ -51815,7 +51804,7 @@ /obj/machinery/door_control{ id = "xeno3"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 8 @@ -56639,7 +56628,7 @@ normaldoorcontrol = 1; pixel_x = -4; pixel_y = -4; - req_access_txt = "30" + req_access = list(30) }, /turf/simulated/floor/plasteel/white, /area/station/command/office/rd) @@ -57003,7 +56992,7 @@ id = "roboticsshutters"; name = "Mech Bay Door Control"; pixel_y = 24; - req_access_txt = "29" + req_access = list(29) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -57221,7 +57210,7 @@ id = "RD"; pixel_x = 24; pixel_y = -36; - req_access_txt = "30" + req_access = list(30) }, /turf/simulated/floor/plasteel{ icon_state = "whitepurplecorner" @@ -63693,7 +63682,7 @@ /obj/machinery/door_control{ id = "xeno1"; name = "Containment Control"; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/window/reinforced{ dir = 8 @@ -65168,7 +65157,7 @@ name = "exterior access button"; pixel_x = 20; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 1; @@ -65200,7 +65189,7 @@ id = "sr2"; pixel_x = 24; pixel_y = -7; - req_access_txt = "45" + req_access = list(45) }, /obj/machinery/light_switch{ dir = 8; @@ -65730,7 +65719,7 @@ name = "AI Chamber Turret Control"; pixel_x = -5; pixel_y = 24; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -66074,7 +66063,7 @@ layer = 3.6; name = "Virology Lab Access Button"; pixel_x = -24; - req_access_txt = "39" + req_access = list(39) }, /obj/machinery/door/airlock/virology{ autoclose = 0; @@ -66848,7 +66837,7 @@ name = "Secure Armory Shutter Control"; pixel_x = 7; pixel_y = -28; - req_access_txt = "3" + req_access = list(3) }, /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -67169,7 +67158,7 @@ autolink_id = "virolab_btn_int"; name = "Virology Lab Access Button"; pixel_y = -24; - req_access_txt = "39" + req_access = list(39) }, /obj/machinery/door/airlock/virology{ autoclose = 0; @@ -69942,7 +69931,7 @@ name = "exterior access button"; pixel_x = 20; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 2; @@ -70527,7 +70516,7 @@ id = "justice_blast"; name = "Space Vent"; pixel_x = 32; - req_access_txt = "2" + req_access = list(2) }, /obj/structure/closet/secure_closet/injection, /obj/machinery/light{ @@ -70893,8 +70882,8 @@ int_button_link_id = "enginen_btn_int"; int_door_link_id = "enginen_door_int"; pixel_y = -25; - req_access_txt = "10;13"; - vent_link_id = "enginen_vent" + vent_link_id = "enginen_vent"; + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 4; @@ -74518,7 +74507,7 @@ name = "interior access button"; pixel_x = -20; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 4; @@ -74605,7 +74594,7 @@ id = "cell3lockdown"; name = "Cell Lockdown"; pixel_y = 32; - req_access_txt = "2" + req_access = list(2) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75000,32 +74989,31 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/starboard2) "kii" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, -/obj/item/storage/box/tranquilizer, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 3; pixel_y = 3 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel, /area/station/security/armory/secure) "kiC" = ( @@ -76250,7 +76238,7 @@ int_door_link_id = "virolab_door_int"; name = "Virology Lab Access Console"; pixel_x = -24; - req_one_access_txt = "39" + req_access = list(39) }, /obj/item/kirbyplants, /turf/simulated/floor/plasteel{ @@ -76644,7 +76632,7 @@ id = "paramedic"; name = "Garage Door Control"; pixel_x = -24; - req_access_txt = "66" + req_access = list(66) }, /obj/machinery/door/poddoor/preopen{ id_tag = "Biohazard_medi"; @@ -79433,7 +79421,7 @@ name = "Turbine Access Console"; pixel_x = 8; pixel_y = -26; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/ignition_switch{ id = "Incinerator"; @@ -79445,7 +79433,7 @@ name = "Turbine Vent Control"; pixel_x = -8; pixel_y = -36; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/door_control{ id = "auxincineratorvent"; @@ -82397,14 +82385,14 @@ name = "Kitchen Bar Shutters Control"; pixel_x = 6; pixel_y = 24; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/door_control{ id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = -8; pixel_y = 24; - req_access_txt = "28" + req_access = list(28) }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -83388,7 +83376,7 @@ id = "sr1"; pixel_x = -24; pixel_y = -7; - req_access_txt = "45" + req_access = list(45) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -86748,7 +86736,7 @@ dir = 4; id = "qm"; pixel_x = -28; - req_access_txt = "41" + req_access = list(41) }, /turf/simulated/floor/plasteel{ icon_state = "neutralfull" @@ -92802,14 +92790,14 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = 25; - req_access_txt = "40" + req_access = list(40) }, /obj/machinery/button/windowtint{ dir = 8; id = "CMO"; pixel_x = 24; pixel_y = 8; - req_access_txt = "40" + req_access = list(40) }, /obj/machinery/light_switch{ dir = 8; @@ -92821,7 +92809,7 @@ id = "Biohazard_medi"; name = "Medical Quarantine"; pixel_x = 35; - req_access_txt = "40" + req_access = list(40) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -94191,8 +94179,8 @@ int_button_link_id = "engines_btn_int"; int_door_link_id = "engines_door_int"; pixel_y = 25; - req_access_txt = "10;13"; - vent_link_id = "engines_vent" + vent_link_id = "engines_vent"; + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 4; @@ -97596,7 +97584,7 @@ name = "interior access button"; pixel_x = -20; pixel_y = -20; - req_access_txt = "10;13" + req_access = list(10,13) }, /obj/structure/cable/yellow{ d1 = 4; @@ -98417,6 +98405,17 @@ icon_state = "redyellowfull" }, /area/station/medical/break_room) +"xtw" = ( +/obj/machinery/door_control{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = 24; + pixel_y = -3; + req_access = list(31) + }, +/obj/effect/decal/cleanable/cobweb2, +/turf/simulated/floor/plating, +/area/station/supply/warehouse) "xtS" = ( /obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/plating, @@ -98465,7 +98464,7 @@ name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ desc = "A remote control-switch to lock down the prison wing's blast doors"; @@ -98473,14 +98472,14 @@ name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Armory"; name = "Secure Armory Shutter Control"; pixel_x = -2; pixel_y = -36; - req_access_txt = "3" + req_access = list(3) }, /obj/structure/cable{ d1 = 4; @@ -142643,7 +142642,7 @@ axm axm axt kXQ -azF +xtw aAR aCH aCH diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm index 149dc06e9d84..28e2d2046c1d 100644 --- a/_maps/map_files/stations/emeraldstation.dmm +++ b/_maps/map_files/stations/emeraldstation.dmm @@ -38,14 +38,14 @@ id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = -24; - req_access_txt = "56" + req_access = list(56) }, /obj/machinery/door_control{ id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -24; pixel_y = 7; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/computer/security/telescreen/engine, /turf/simulated/floor/plasteel{ @@ -1612,13 +1612,12 @@ /turf/simulated/floor/plating, /area/station/maintenance/asmaint) "aqN" = ( -/obj/structure/rack, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/box/beanbag, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag, +/obj/item/storage/fancy/shell/beanbag{ pixel_y = -3; pixel_x = -3 }, @@ -1626,6 +1625,8 @@ dir = 1; layer = 2.9 }, +/obj/item/storage/fancy/shell/tranquilizer, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -1697,22 +1698,22 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = -24; - req_access_txt = "40"; - pixel_y = 24 + pixel_y = 24; + req_access = list(40) }, /obj/machinery/door_control{ id = "Biohazard_medi"; name = "Medical Quarantine"; pixel_x = -24; - req_access_txt = "40"; - pixel_y = 33 + pixel_y = 33; + req_access = list(40) }, /obj/machinery/button/windowtint{ id = "CMO"; pixel_x = -23; pixel_y = 42; - req_access_txt = "40"; - dir = 4 + dir = 4; + req_access = list(40) }, /turf/simulated/floor/plasteel{ icon_state = "darkbluecorners"; @@ -2217,8 +2218,8 @@ /obj/machinery/access_button{ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; - req_access_txt = "32"; - pixel_x = 24 + pixel_x = 24; + req_access = list(32) }, /obj/machinery/light{ dir = 4 @@ -2320,8 +2321,8 @@ id = "disvent"; name = "Incinerator Vent Control"; pixel_y = -24; - req_access_txt = "12"; - pixel_x = 26 + pixel_x = 26; + req_access = list(12) }, /turf/simulated/floor/plating, /area/station/maintenance/incinerator) @@ -2418,7 +2419,7 @@ autolink_id = "viro_btn_ext"; name = "Virology Lab Access Button"; pixel_x = -24; - req_access_txt = "39" + req_access = list(39) }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -2943,12 +2944,6 @@ pixel_y = -4; pixel_x = -17 }, -/obj/machinery/light_switch{ - dir = 8; - name = "east bump"; - pixel_x = 24; - pixel_y = -5 - }, /obj/structure/disposalpipe/trunk{ dir = 8 }, @@ -4890,7 +4885,7 @@ id = "CE"; pixel_x = -8; pixel_y = 24; - req_access_txt = "56" + req_access = list(56) }, /obj/machinery/button/windowtint{ dir = 4; @@ -4898,7 +4893,7 @@ pixel_x = -24; pixel_y = 9; range = 12; - req_access_txt = "56" + req_access = list(56) }, /obj/machinery/light_switch{ dir = 4; @@ -5985,7 +5980,7 @@ normaldoorcontrol = 1; pixel_x = 37; pixel_y = -25; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/door_control{ desc = "A remote control switch for the brig foyer."; @@ -5994,7 +5989,7 @@ normaldoorcontrol = 1; pixel_x = 27; pixel_y = -25; - req_access_txt = "63" + req_access = list(63) }, /turf/simulated/floor/plasteel{ icon_state = "darkredfull" @@ -8754,8 +8749,8 @@ /obj/machinery/door_control{ id = "paramedic"; name = "Garage Door Control"; - req_access_txt = "66"; - pixel_x = 24 + pixel_x = 24; + req_access = list(66) }, /obj/machinery/door/firedoor, /obj/machinery/door/poddoor/preopen{ @@ -10872,7 +10867,7 @@ name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/flasher{ id = "AI"; @@ -11145,7 +11140,6 @@ }, /area/station/hallway/secondary/garden) "cbf" = ( -/obj/structure/dispenser/oxygen, /obj/machinery/firealarm/directional/north, /obj/machinery/camera{ c_tag = "Brig Secure Armory North" @@ -11501,8 +11495,8 @@ /obj/machinery/access_button{ autolink_id = "engsm_btn_ext"; name = "Supermatter Access Button"; - req_access_txt = "32"; - pixel_x = -24 + pixel_x = -24; + req_access = list(32) }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -11911,7 +11905,7 @@ id = "xenobio3"; name = "Chamber 3 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -13414,12 +13408,12 @@ "cyf" = ( /obj/machinery/airlock_controller/air_cycler{ pixel_x = 25; - req_access_txt = "10;13"; vent_link_id = "eng_vent"; ext_door_link_id = "eng_door_ext"; int_door_link_id = "eng_door_int"; ext_button_link_id = "eng_btn_ext"; - int_button_link_id = "eng_btn_int" + int_button_link_id = "eng_btn_int"; + req_access = list(10,13) }, /turf/simulated/floor/plating, /area/station/engineering/control) @@ -13731,7 +13725,7 @@ name = "Research and Development Lab Shutters Control"; pixel_x = 24; pixel_y = 23; - req_access_txt = "47" + req_access = list(47) }, /turf/simulated/floor/plasteel{ dir = 5; @@ -15011,6 +15005,14 @@ }, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/east) +"cOV" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/landmark/spawner/late/crew, +/obj/machinery/requests_console/directional/east, +/turf/simulated/floor/mineral/titanium/blue, +/area/shuttle/arrival/station) "cOY" = ( /obj/machinery/economy/vending/wallmed/directional/east, /turf/simulated/floor/plasteel{ @@ -15504,7 +15506,6 @@ }, /obj/structure/disposalpipe/sortjunction/reversed{ dir = 8; - req_access_txt = null; sort_type_txt = "1" }, /turf/simulated/floor/plasteel, @@ -16884,6 +16885,13 @@ }, /turf/simulated/floor/wood, /area/station/service/library) +"dhN" = ( +/obj/structure/chair/sofa/bench{ + dir = 1; + cover_color = "#85130b" + }, +/turf/simulated/floor/plasteel, +/area/station/hallway/primary/starboard) "dhP" = ( /obj/structure/computerframe{ dir = 4 @@ -17790,7 +17798,7 @@ "dqX" = ( /obj/structure/chair/sofa, /obj/effect/landmark/start/assistant, -/obj/structure/sign/poster/official/random{ +/obj/machinery/computer/security/telescreen/entertainment{ pixel_y = 32 }, /turf/simulated/floor/carpet, @@ -18977,7 +18985,7 @@ id = "xenobio4"; name = "Chamber 4 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /obj/item/radio/intercom{ name = "west bump"; @@ -20978,7 +20986,7 @@ autolink_id = "eng_btn_int"; pixel_x = -22; pixel_y = -20; - req_access_txt = "10;13" + req_access = list(10,13) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -23576,7 +23584,7 @@ id = "xenobio5"; name = "Chamber 5 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel{ dir = 10; @@ -24741,8 +24749,7 @@ /area/station/engineering/break_room/secondary) "eHF" = ( /obj/machinery/computer/prisoner{ - req_access = null; - req_one_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 10; @@ -25234,9 +25241,9 @@ id = "Prison Perma Cell 3"; name = "Cell Lockdown"; pixel_y = 31; - req_access_txt = "2"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + req_access = list(2) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -26442,7 +26449,7 @@ id = "eva-shutters"; name = "Auxilary E.V.A. Storage"; pixel_x = -24; - req_one_access_txt = "18" + req_access = list(18) }, /turf/simulated/floor/plasteel, /area/station/ai_monitored/storage/eva) @@ -26594,9 +26601,9 @@ id = "Prison Perma Cell 1"; name = "Cell Lockdown"; pixel_y = 31; - req_access_txt = "2"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + req_access = list(2) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -27544,7 +27551,7 @@ ext_button_link_id = "engsm_btn_ext"; int_button_link_id = "engsm_btn_int"; pixel_x = 22; - req_access_txt = "32" + req_access = list(32) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28998,11 +29005,11 @@ name = "Turbine Access Console"; pixel_x = 6; pixel_y = -26; - req_access_txt = "12"; ext_door_link_id = "turbine_door_ext"; int_door_link_id = "turbine_door_int"; ext_button_link_id = "turbine_btn_ext"; - int_button_link_id = "turbine_btn_int" + int_button_link_id = "turbine_btn_int"; + req_access = list(12) }, /obj/machinery/atmospherics/binary/pump/on, /turf/simulated/floor/plasteel{ @@ -29122,7 +29129,7 @@ name = "processing tint control"; pixel_x = -6; pixel_y = 24; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/light_switch{ name = "north bump"; @@ -31372,8 +31379,7 @@ "fPs" = ( /obj/machinery/computer/prisoner{ dir = 8; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -35385,11 +35391,11 @@ name = "Incinerator Access Console"; pixel_x = 6; pixel_y = -25; - req_access_txt = "12"; ext_door_link_id = "incinerator_door_ext"; int_door_link_id = "incinerator_door_int"; ext_button_link_id = "incinerator_btn_ext"; - int_button_link_id = "incinerator_btn_int" + int_button_link_id = "incinerator_btn_int"; + req_access = list(12) }, /obj/machinery/ignition_switch{ id = "Incinerator"; @@ -35681,7 +35687,7 @@ autolink_id = "viro_btn_int"; name = "Virology Lab Access Button"; pixel_x = -24; - req_access_txt = "39" + req_access = list(39) }, /obj/structure/cable{ d1 = 1; @@ -35871,9 +35877,9 @@ /obj/machinery/button/windowtint{ id = "Surgery 1"; pixel_y = 8; - req_access_txt = "45"; dir = 4; - pixel_x = -24 + pixel_x = -24; + req_access = list(45) }, /obj/machinery/light_switch{ dir = 4; @@ -38203,6 +38209,7 @@ /area/station/maintenance/asmaint) "heu" = ( /obj/structure/closet/wardrobe/black, +/obj/machinery/light, /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/arrival/station) "hey" = ( @@ -38609,7 +38616,7 @@ normaldoorcontrol = 1; pixel_x = 28; pixel_y = 17; - req_access_txt = "58" + req_access = list(58) }, /obj/machinery/door_control{ desc = "A remote control-switch to lock down the prison wing's blast doors"; @@ -38617,14 +38624,14 @@ name = "Prison Wing Lockdown"; pixel_x = 28; pixel_y = 7; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = 28; pixel_y = -3; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -38674,7 +38681,7 @@ name = "Secure Armory Shutter Control"; pixel_x = -2; pixel_y = -36; - req_access_txt = "3" + req_access = list(3) }, /obj/machinery/door_control{ desc = "A remote control-switch to lock down the prison wing's blast doors"; @@ -38682,14 +38689,14 @@ name = "Prison Wing Lockdown"; pixel_x = -7; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/door_control{ id = "Secure Gate"; name = "Brig Lockdown"; pixel_x = 3; pixel_y = -28; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "darkred" @@ -40111,6 +40118,14 @@ icon_state = "cult" }, /area/station/legal/magistrate) +"hwo" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/obj/effect/landmark/spawner/late/crew, +/obj/structure/closet/walllocker/emerglocker/east, +/turf/simulated/floor/mineral/titanium/blue, +/area/shuttle/arrival/station) "hwx" = ( /obj/machinery/economy/vending/snack, /turf/simulated/floor/wood, @@ -40521,13 +40536,12 @@ /turf/simulated/floor/plating, /area/station/maintenance/aft2) "hAf" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = 3; pixel_y = 3 }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot{ +/obj/item/storage/fancy/shell/rubbershot, +/obj/item/storage/fancy/shell/rubbershot{ pixel_x = -3; pixel_y = -3 }, @@ -40538,6 +40552,7 @@ dir = 1; layer = 2.9 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -41213,14 +41228,14 @@ id = "hopqueueshutters"; name = "Queue Shutters"; pixel_x = -24; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/door_control{ id = "hop"; name = "Privacy Shutters"; pixel_x = -24; pixel_y = -8; - req_one_access_txt = "18" + req_access = list(18) }, /obj/machinery/flasher_button{ id = "hopflash"; @@ -41942,7 +41957,7 @@ /obj/structure/barricade/wooden/crude, /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /turf/simulated/floor/plating, /area/station/maintenance/apmaint2) @@ -42717,6 +42732,9 @@ /area/station/public/pet_store) "hWk" = ( /obj/structure/chair/sofa/bench/left, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/south) "hWv" = ( @@ -45518,6 +45536,9 @@ /obj/structure/chair{ dir = 4 }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -31 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "darkredcorners" @@ -45911,8 +45932,8 @@ id = "justice_blast"; name = "Space Vent"; pixel_x = 2; - req_access_txt = "2"; - pixel_y = 22 + pixel_y = 22; + req_access = list(2) }, /obj/structure/table/reinforced, /obj/item/taperecorder{ @@ -49926,19 +49947,19 @@ id = "bridge blast entrance"; name = "Bridge Lobby Blast Door Control"; pixel_y = -9; - req_one_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "bridge blast south"; name = "Bridge Entrance Blast Door Control"; pixel_y = -1; - req_one_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "bridge blast north"; name = "Bridge Space Blast Door Control"; pixel_y = 7; - req_one_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel, /area/station/command/bridge) @@ -50333,7 +50354,7 @@ autolink_id = "xeno_btn_int"; name = "Xenobiology Access Button"; pixel_x = -24; - req_access_txt = "55" + req_access = list(55) }, /obj/machinery/door/airlock/research{ autoclose = 0; @@ -51156,8 +51177,8 @@ /obj/machinery/turretid/stun{ control_area = "\improper AI Satellite Atmospherics"; name = "AI Satellite Atmospherics Turret Control"; - req_access_txt = "75"; - pixel_y = -26 + pixel_y = -26; + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -51808,8 +51829,8 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_y = -1; - req_access_txt = "10"; - pixel_x = -22 + pixel_x = -22; + req_access = list(10) }, /obj/machinery/atmospherics/pipe/simple/visible/green, /obj/effect/turf_decal/stripes/line{ @@ -52811,6 +52832,17 @@ slowdown = -0.3 }, /area/station/hallway/spacebridge/security/south) +"jNB" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/landmark/spawner/late/crew, +/obj/item/radio/intercom{ + name = "west bump"; + pixel_x = -28 + }, +/turf/simulated/floor/mineral/titanium/blue, +/area/shuttle/arrival/station) "jNM" = ( /obj/machinery/economy/vending/cigarette, /turf/simulated/floor/wood, @@ -54339,15 +54371,14 @@ "kcA" = ( /obj/machinery/computer/prisoner{ dir = 4; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/button/windowtint{ dir = 4; id = "IAA"; pixel_x = -24; pixel_y = 6; - req_access_txt = "38" + req_access = list(38) }, /obj/machinery/camera{ c_tag = "Internal Affairs Office"; @@ -54730,9 +54761,9 @@ id = "Prison Perma Cell 4"; name = "Cell Lockdown"; pixel_y = 31; - req_access_txt = "2"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + req_access = list(2) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -56364,9 +56395,9 @@ /obj/machinery/door_control{ id = "robotics_surgery"; name = "Robotics Privacy Shutters"; - req_access_txt = "29"; pixel_y = 24; - pixel_x = -24 + pixel_x = -24; + req_access = list(29) }, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" @@ -59923,18 +59954,6 @@ }, /turf/simulated/floor/plasteel, /area/station/security/permabrig) -"lhw" = ( -/obj/structure/closet/cardboard, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/door_control{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = -1; - pixel_y = 24; - req_access_txt = "31" - }, -/turf/simulated/floor/plasteel, -/area/station/supply/warehouse) "lhR" = ( /obj/item/decorations/sticky_decorations/flammable/singleeye{ pixel_y = 20 @@ -60020,7 +60039,7 @@ id = "HoS"; pixel_x = 7; pixel_y = -25; - req_access_txt = "58" + req_access = list(58) }, /obj/machinery/light_switch{ dir = 1; @@ -60367,14 +60386,14 @@ name = "Auxiliary Vent"; pixel_x = 6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/machinery/door_control{ id = "turbinevent"; name = "Turbine Vent"; pixel_x = -6; pixel_y = -24; - req_access_txt = "32" + req_access = list(32) }, /obj/machinery/atmospherics/binary/pump/on{ dir = 1 @@ -60799,7 +60818,7 @@ name = "Engineering Lockdown"; pixel_x = 8; pixel_y = -7; - req_access_txt = "10" + req_access = list(10) }, /turf/simulated/wall/r_wall, /area/station/command/office/ce) @@ -61461,8 +61480,8 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = 9; - req_access_txt = "74"; - pixel_y = 25 + pixel_y = 25; + req_access = list(74) }, /obj/machinery/light{ dir = 1 @@ -62648,8 +62667,7 @@ /area/station/command/bridge) "lFR" = ( /obj/structure/closet/crate/secure{ - req_one_access = list(33,41); - req_one_access_txt = "33;41" + req_one_access = list(33,41) }, /obj/item/circuitboard/thermomachine{ pixel_x = -5 @@ -68124,7 +68142,7 @@ control_area = "\improper AI Satellite Antechamber"; name = "AI Antechamber Turret Control"; pixel_x = -28; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -68745,8 +68763,7 @@ "mSw" = ( /obj/machinery/computer/prisoner{ dir = 1; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /obj/item/radio/intercom{ name = "south bump"; @@ -69519,7 +69536,7 @@ control_area = "\improper AI Satellite Service"; name = "AI Satellite Service Bay Turret Control"; pixel_x = -29; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -71488,7 +71505,7 @@ name = "Chemistry Privacy Shutter Control"; pixel_x = -24; pixel_y = 24; - req_access_txt = "33" + req_access = list(33) }, /obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel{ @@ -72400,7 +72417,7 @@ "nAB" = ( /obj/machinery/door/morgue{ name = "Confession Booth (Chaplain)"; - req_access_txt = "22" + req_access = list(22) }, /turf/simulated/floor/plating, /area/station/service/chapel) @@ -73065,8 +73082,8 @@ id = "Secure Storage"; name = "Engineering Secure Storage"; pixel_x = 7; - req_access_txt = "56"; - pixel_y = 24 + pixel_y = 24; + req_access = list(56) }, /turf/simulated/floor/plasteel, /area/station/engineering/control) @@ -73145,8 +73162,8 @@ /obj/machinery/button/windowtint{ id = "Courtroom"; pixel_x = -6; - req_one_access_txt = "74;3"; - range = 10 + range = 10; + req_one_access = list(74,3) }, /obj/item/megaphone{ pixel_y = -11 @@ -73173,8 +73190,8 @@ name = "Court Entrance Control"; normaldoorcontrol = 1; pixel_x = 1; - req_access_txt = "74"; - pixel_y = 10 + pixel_y = 10; + req_access = list(74) }, /turf/simulated/floor/carpet, /area/station/legal/courtroom) @@ -75106,8 +75123,7 @@ "nYy" = ( /obj/machinery/computer/prisoner{ dir = 4; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/light{ dir = 8 @@ -76495,6 +76511,9 @@ /area/station/maintenance/apmaint2) "okc" = ( /obj/item/kirbyplants, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 30 + }, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "yellow" @@ -77651,9 +77670,9 @@ /obj/machinery/door_control{ id = "mechbay_inner"; name = "Inner Mech Bay Shutter Control"; - req_access_txt = "29"; pixel_y = -24; - pixel_x = 25 + pixel_x = 25; + req_access = list(29) }, /obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel{ @@ -80898,9 +80917,9 @@ /obj/machinery/button/windowtint{ id = "Surgery 2"; pixel_y = 8; - req_access_txt = "45"; dir = 8; - pixel_x = 24 + pixel_x = 24; + req_access = list(45) }, /obj/machinery/light_switch{ dir = 8; @@ -82651,7 +82670,7 @@ id = "teleshutter"; name = "Teleporter Shutters Access Control"; pixel_x = 24; - req_one_access_txt = "62" + req_access = list(62) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -83829,6 +83848,13 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint2) +"pBn" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 1; + cover_color = "#85130b" + }, +/turf/simulated/floor/plasteel, +/area/station/hallway/primary/starboard) "pBo" = ( /turf/simulated/floor/engine, /area/station/science/explab/chamber) @@ -84585,7 +84611,7 @@ "pHY" = ( /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -85594,7 +85620,7 @@ id = "Detective"; pixel_x = -8; pixel_y = 24; - req_access_txt = "4" + req_access = list(4) }, /obj/machinery/computer/med_data, /obj/machinery/light{ @@ -86316,7 +86342,7 @@ id = "xenobio6"; name = "Chamber 6 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" @@ -88060,7 +88086,7 @@ id = "xenobio1"; name = "Chamber 1 Containment Blast Door"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/cable{ d1 = 1; @@ -90902,6 +90928,13 @@ /obj/structure/lattice, /turf/space, /area/space/nearstation) +"qUn" = ( +/obj/structure/chair/sofa, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/simulated/floor/carpet, +/area/station/public/dorms) "qUr" = ( /obj/effect/landmark/damageturf, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ @@ -91334,8 +91367,8 @@ name = "Jury Entrance Control"; normaldoorcontrol = 1; pixel_x = 1; - req_access_txt = "74"; - pixel_y = 10 + pixel_y = 10; + req_access = list(74) }, /obj/item/reagent_containers/glass/beaker/waterbottle{ pixel_x = 5 @@ -91986,6 +92019,14 @@ /obj/effect/turf_decal/stripes/corner, /turf/simulated/floor/plating, /area/station/engineering/secure_storage) +"rcZ" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/landmark/spawner/late/crew, +/obj/structure/closet/walllocker/emerglocker/west, +/turf/simulated/floor/mineral/titanium/blue, +/area/shuttle/arrival/station) "rdc" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel{ @@ -92260,7 +92301,7 @@ id = "xenobio2"; name = "Chamber 2 Containment Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel{ dir = 9; @@ -93202,6 +93243,9 @@ /obj/structure/chair/sofa/bench/left{ dir = 4 }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -31 + }, /turf/simulated/floor/plasteel, /area/station/hallway/primary/central/ne) "rnD" = ( @@ -94869,8 +94913,8 @@ /obj/machinery/door_control{ id = "mechbay_outer"; name = "Outer Mech Bay Shutters Control"; - req_access_txt = "29"; - pixel_y = 24 + pixel_y = 24; + req_access = list(29) }, /turf/simulated/floor/plasteel, /area/station/science/robotics/chargebay) @@ -95468,7 +95512,7 @@ id = "Interrogation"; name = "interrogation tint control"; pixel_x = -24; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -95937,7 +95981,7 @@ name = "Atmospherics Lockdown"; pixel_x = -24; pixel_y = 5; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/light{ dir = 8 @@ -96069,6 +96113,9 @@ c_tag = "Dormitories Lounge"; dir = 8 }, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, /turf/simulated/floor/wood, /area/station/public/dorms) "rOC" = ( @@ -96431,7 +96478,7 @@ name = "Atmospherics Lockdown"; pixel_x = -8; pixel_y = 10; - req_access_txt = "24" + req_access = list(24) }, /obj/item/book/manual/atmospipes, /obj/machinery/computer/security/telescreen/engine{ @@ -99604,7 +99651,7 @@ name = "Warehouse Door Control"; pixel_x = -1; pixel_y = -24; - req_access_txt = "31" + req_access = list(31) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -100016,7 +100063,7 @@ autolink_id = "xeno_btn_ext"; name = "Xenobiology Access Button"; pixel_x = -24; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/cable{ d1 = 1; @@ -100887,9 +100934,9 @@ id = "Prison Perma Cell 2"; name = "Cell Lockdown"; pixel_y = 31; - req_access_txt = "2"; specialfunctions = 4; - normaldoorcontrol = 1 + normaldoorcontrol = 1; + req_access = list(2) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -102201,6 +102248,12 @@ /area/station/legal/courtroom/gallery) "sUJ" = ( /obj/item/kirbyplants, +/obj/machinery/light_switch{ + dir = 4; + name = "west bump"; + pixel_x = -24; + pixel_y = 5 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "yellow" @@ -102408,11 +102461,11 @@ /obj/machinery/airlock_controller/access_controller{ name = "Virology Lab Access Console"; pixel_y = 24; - req_one_access_txt = "39"; ext_door_link_id = "viro_door_ext"; int_door_link_id = "viro_door_int"; ext_button_link_id = "viro_btn_ext"; - int_button_link_id = "viro_btn_int" + int_button_link_id = "viro_btn_int"; + req_access = list(39) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -106342,6 +106395,17 @@ icon_state = "darkbluecorners" }, /area/station/medical/storage/secondary) +"tGI" = ( +/obj/item/radio/intercom{ + name = "south bump"; + pixel_y = -28 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 1; + cover_color = "#85130b" + }, +/turf/simulated/floor/plasteel, +/area/station/hallway/primary/starboard) "tGJ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 @@ -108206,6 +108270,9 @@ name = "west bump"; pixel_x = -28 }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = 32 + }, /turf/simulated/floor/plasteel{ icon_state = "neutralcorner" }, @@ -108401,9 +108468,9 @@ /obj/machinery/button/windowtint{ pixel_x = 24; id = "qm"; - req_access_txt = "41"; dir = 8; - pixel_y = 5 + pixel_y = 5; + req_access = list(41) }, /obj/machinery/light_switch{ dir = 8; @@ -111875,6 +111942,7 @@ /area/station/hallway/primary/fore/north) "uHu" = ( /obj/structure/closet/wardrobe/mixed, +/obj/machinery/light, /turf/simulated/floor/mineral/titanium/blue, /area/shuttle/arrival/station) "uHy" = ( @@ -115809,8 +115877,8 @@ /obj/machinery/access_button{ autolink_id = "engsm_btn_int"; name = "Supermatter Access Button"; - req_access_txt = "32"; - pixel_x = -24 + pixel_x = -24; + req_access = list(32) }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -121520,8 +121588,6 @@ }, /area/station/public/construction) "wwv" = ( -/obj/structure/rack, -/obj/item/storage/box/tranquilizer, /obj/structure/window/reinforced{ dir = 1; layer = 2.9 @@ -121529,6 +121595,7 @@ /obj/structure/window/reinforced{ dir = 8 }, +/obj/structure/dispenser/oxygen, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -122312,7 +122379,7 @@ /area/station/hallway/primary/starboard/south) "wFX" = ( /obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" + req_access = list(25) }, /obj/item/ammo_box/shotgun/beanbag, /turf/simulated/floor/wood, @@ -122685,7 +122752,7 @@ name = "Secure Armory Shutter Control"; pixel_x = -24; pixel_y = -28; - req_access_txt = "3" + req_access = list(3) }, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -124926,7 +124993,7 @@ name = "Office Door"; normaldoorcontrol = 1; pixel_x = -8; - req_access_txt = "57" + req_access = list(57) }, /obj/item/pen{ pixel_x = -8; @@ -125468,14 +125535,14 @@ name = "Kitchen Diner Shutters Control"; pixel_x = 26; pixel_y = 7; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/door_control{ id = "kitchenhall"; name = "Kitchen Hallway Shutters Control"; pixel_x = 26; pixel_y = -3; - req_access_txt = "28" + req_access = list(28) }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" @@ -125923,7 +125990,7 @@ autolink_id = "eng_btn_ext"; pixel_x = -22; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /turf/space, /area/space/nearstation) @@ -126173,14 +126240,14 @@ normaldoorcontrol = 1; pixel_x = -4; pixel_y = -4; - req_access_txt = "30" + req_access = list(30) }, /obj/machinery/door_control{ id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; - req_access_txt = "30" + req_access = list(30) }, /obj/item/reagent_containers/drinks/coffee{ pixel_x = 8; @@ -126754,9 +126821,9 @@ /obj/machinery/door_control{ id = "robotics"; name = "Robotics Privacy Shutters"; - req_access_txt = "29"; pixel_y = 8; - pixel_x = 25 + pixel_x = 25; + req_access = list(29) }, /turf/simulated/floor/plasteel{ dir = 6; @@ -128717,6 +128784,18 @@ /obj/effect/spawner/random_spawners/oil_maybe, /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) +"xRf" = ( +/obj/structure/closet/cardboard, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/door_control{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -1; + pixel_y = 24; + req_access = list(31) + }, +/turf/simulated/floor/plasteel, +/area/station/supply/warehouse) "xRh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ @@ -128773,7 +128852,7 @@ name = "AI Chamber Hallway Turret Control"; pixel_x = 24; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ icon_state = "grimy" @@ -148768,7 +148847,7 @@ qxw tKR svJ wRe -lhw +xRf gAx vTT mYq @@ -161143,10 +161222,10 @@ nIV tId jsx asq +rcZ tId tId -tId -jsx +jNB asq heu cJq @@ -162171,10 +162250,10 @@ nIV lAJ usj asq +hwo lAJ lAJ -lAJ -usj +cOV asq uHu cJq @@ -162842,7 +162921,7 @@ oGg mlh nYZ vAZ -eBG +qUn aAt dwn tVG @@ -171591,7 +171670,7 @@ dkG kyA uci kyA -cIa +tGI dws dws dws @@ -171848,7 +171927,7 @@ rSC uks uci kyA -kyA +dhN ajq aNu nRd @@ -172105,7 +172184,7 @@ wBF kwm qHk kyA -kyA +pBn ajq aNu anY diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index 6a69edd21d26..749a1eba6c9f 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -160,7 +160,7 @@ dir = 8; id = "Detective"; pixel_x = 24; - req_access_txt = "4" + req_access = list(4) }, /turf/simulated/floor/carpet, /area/station/security/detective) @@ -212,8 +212,7 @@ /obj/machinery/alarm/directional/west, /obj/machinery/computer/prisoner{ dir = 4; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -631,7 +630,7 @@ name = "exterior access button"; pixel_x = 25; pixel_y = 7; - req_access_txt = "75;13" + req_access = list(75,13) }, /turf/space, /area/space/nearstation) @@ -1395,7 +1394,7 @@ name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/driver_button{ id_tag = "trash"; @@ -1499,12 +1498,12 @@ /obj/machinery/airlock_controller/air_cycler{ pixel_x = -25; pixel_y = 4; - req_access_txt = "13"; vent_link_id = "arrivalsmaint_vent"; ext_door_link_id = "arrivalsmaint_door_ext"; int_door_link_id = "arrivalsmaint_door_int"; ext_button_link_id = "arrivalsmaint_btn_ext"; - int_button_link_id = "arrivalsmaint_btn_int" + int_button_link_id = "arrivalsmaint_btn_int"; + req_access = list(13) }, /turf/simulated/floor/plating, /area/station/maintenance/port) @@ -4169,7 +4168,7 @@ id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = 24; - req_access_txt = "31" + req_access = list(31) }, /obj/structure/cable{ d1 = 1; @@ -6155,7 +6154,7 @@ id = "xenobio2"; name = "Xenobio Pen 2 Blast Doors"; pixel_y = 1; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -8535,7 +8534,7 @@ dir = 1; id = "Courtroom"; pixel_y = 8; - req_one_access_txt = "74;3" + req_one_access = list(74,3) }, /turf/simulated/floor/carpet, /area/station/legal/courtroom) @@ -8718,7 +8717,7 @@ id = "engsm"; name = "Radiation Shutters Control"; pixel_x = 24; - req_access_txt = "32" + req_access = list(32) }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8847,26 +8846,6 @@ /obj/machinery/firealarm/directional/west, /turf/simulated/floor/plasteel, /area/station/engineering/control) -"aPR" = ( -/obj/machinery/door_control{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - pixel_x = -24; - req_access_txt = "31" - }, -/obj/structure/table, -/obj/machinery/kitchen_machine/microwave{ - pixel_y = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch{ - dir = 4; - name = "custom placement"; - pixel_x = -24; - pixel_y = -8 - }, -/turf/simulated/floor/plasteel, -/area/station/supply/warehouse) "aPS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -13941,14 +13920,14 @@ name = "Engineering Lockdown"; pixel_x = -24; pixel_y = -5; - req_access_txt = "10" + req_access = list(10) }, /obj/machinery/door_control{ id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = -24; pixel_y = 5; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/light{ dir = 8 @@ -14603,7 +14582,7 @@ name = "Transit Tube Lockdown"; pixel_x = -24; pixel_y = -5; - req_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ desc = "A remote control-switch for secure storage."; @@ -14611,7 +14590,7 @@ name = "Engineering Secure Storage"; pixel_x = -24; pixel_y = 5; - req_access_txt = "11" + req_access = list(11) }, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -17495,7 +17474,7 @@ /obj/machinery/button/windowtint{ id = "CE"; pixel_y = -24; - req_access_txt = "56" + req_access = list(56) }, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -19890,7 +19869,7 @@ /area/station/service/barber) "buI" = ( /obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" + req_access = list(25) }, /obj/machinery/light/small{ dir = 1 @@ -20092,7 +20071,7 @@ id = "hop"; name = "Privacy Shutters Control"; pixel_y = 25; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/computer/account_database, /turf/simulated/floor/wood, @@ -20197,7 +20176,7 @@ control_area = "\improper AI Satellite Antechamber"; name = "AI Antechamber Turret Control"; pixel_x = 24; - req_access_txt = "75" + req_access = list(75) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -21253,7 +21232,7 @@ id = "hop"; name = "Privacy Shutters Control"; pixel_x = -24; - req_access_txt = "28" + req_access = list(28) }, /turf/simulated/floor/carpet, /area/station/command/office/hop) @@ -21335,14 +21314,14 @@ name = "Bridge Access Blast Door Control"; pixel_x = -1; pixel_y = -24; - req_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "council blast"; name = "Council Chamber Blast Door Control"; pixel_x = -1; pixel_y = -34; - req_access_txt = "19" + req_access = list(19) }, /obj/machinery/camera{ c_tag = "Bridge - Command Chair"; @@ -22452,13 +22431,13 @@ id = "evashutter"; name = "E.V.A. Storage Shutter Control"; pixel_y = -24; - req_access_txt = "19" + req_access = list(19) }, /obj/machinery/door_control{ id = "gateshutter"; name = "Expedition Shutter Control"; pixel_y = -34; - req_access_txt = "62" + req_access = list(62) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -22511,14 +22490,14 @@ name = "Queue Shutters Control"; pixel_x = -6; pixel_y = -35; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/door_control{ id = "hop"; name = "Privacy Shutters Control"; pixel_x = -6; pixel_y = -24; - req_access_txt = "28" + req_access = list(28) }, /obj/machinery/flasher_button{ id = "hopflash"; @@ -23555,7 +23534,7 @@ id = "council blast"; name = "Council Chamber Blast Door Control"; pixel_x = -24; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -23629,7 +23608,7 @@ id = "bridge blast"; name = "Bridge Access Blast Door Control"; pixel_x = -24; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel{ dir = 4; @@ -23965,7 +23944,7 @@ id = "bridge blast"; name = "Bridge Access Blast Door Control"; pixel_x = 24; - req_access_txt = "19" + req_access = list(19) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -24113,7 +24092,7 @@ name = "Kitchen Counter Shutters"; pixel_x = -6; pixel_y = 24; - req_access_txt = "28" + req_access = list(28) }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" @@ -26228,7 +26207,7 @@ name = "exterior access button"; pixel_x = -25; pixel_y = -7; - req_access_txt = "75;13" + req_access = list(75,13) }, /turf/space, /area/space/nearstation) @@ -26280,7 +26259,7 @@ id = "xenobio5"; name = "Xenobio Pen 5 Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -27481,7 +27460,7 @@ "bUK" = ( /obj/machinery/door/morgue{ name = "Private Study"; - req_access_txt = "37" + req_access = list(37) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -28347,7 +28326,7 @@ id = "mechbay"; name = "Mech Bay Shutters Control"; pixel_y = -24; - req_access_txt = "29" + req_access = list(29) }, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" @@ -28625,7 +28604,7 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = -24; - req_access_txt = "73" + req_access = list(73) }, /obj/structure/table/wood, /obj/machinery/photocopier/faxmachine/longrange{ @@ -28765,7 +28744,7 @@ id = "evashutter"; name = "E.V.A. Storage Shutter Control"; pixel_y = -26; - req_access_txt = "19" + req_access = list(19) }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -30942,20 +30921,20 @@ name = "Xenobiology Containment Control"; pixel_x = 7; pixel_y = 24; - req_access_txt = "30" + req_access = list(30) }, /obj/machinery/door_control{ id = "rdtoxins"; name = "Toxins Containment Control"; pixel_x = -7; pixel_y = 24; - req_access_txt = "30" + req_access = list(30) }, /obj/machinery/door_control{ id = "rdrnd"; name = "Experi-mentor shutters"; pixel_y = 34; - req_access_txt = "30" + req_access = list(30) }, /obj/machinery/computer/security/telescreen/rd{ pixel_x = 31; @@ -30965,7 +30944,7 @@ id = "RD"; pixel_x = -24; pixel_y = 26; - req_access_txt = "30" + req_access = list(30) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -31236,7 +31215,7 @@ id = "paramedic"; name = "Garage Door Control"; pixel_y = 24; - req_access_txt = "66" + req_access = list(66) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -31868,8 +31847,7 @@ "ckx" = ( /obj/machinery/mecha_part_fabricator{ id = "0"; - name = "forgotten exosuit fabricator"; - req_access = "0" + name = "forgotten exosuit fabricator" }, /turf/simulated/floor/plating, /area/station/maintenance/apmaint) @@ -32280,7 +32258,7 @@ "cmn" = ( /obj/machinery/door/morgue{ name = "Confession Booth (Chaplain)"; - req_access_txt = "22" + req_access = list(22) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -32737,7 +32715,7 @@ id = "turbinevent"; name = "Turbine Vent Control"; pixel_y = -24; - req_access_txt = "12" + req_access = list(12) }, /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet{ @@ -32779,14 +32757,14 @@ name = "Turbine Vent Control"; pixel_x = -8; pixel_y = -36; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/door_control{ id = "auxincineratorvent"; name = "Auxiliary Vent Control"; pixel_x = -8; pixel_y = -24; - req_access_txt = "12" + req_access = list(12) }, /obj/machinery/atmospherics/pipe/simple/visible, /turf/simulated/floor/plasteel, @@ -32903,7 +32881,7 @@ id = "mechbay"; name = "Mech Bay Shutters Control"; pixel_y = 24; - req_access_txt = "29" + req_access = list(29) }, /turf/simulated/floor/plasteel, /area/station/science/robotics/chargebay) @@ -34500,7 +34478,7 @@ id = "Surgery 1"; pixel_x = -24; pixel_y = -4; - req_access_txt = "45" + req_access = list(45) }, /turf/simulated/floor/plasteel{ dir = 9; @@ -35907,7 +35885,7 @@ dir = 1; id = "BS"; pixel_y = -22; - req_access_txt = "67" + req_access = list(67) }, /turf/simulated/floor/carpet/blue, /area/station/command/office/blueshield) @@ -37782,7 +37760,7 @@ id = "imnotmakingyoulubepissoff"; name = "Chemistry Privacy Shutter Control"; pixel_y = -24; - req_access_txt = "33" + req_access = list(33) }, /obj/machinery/light, /turf/simulated/floor/plasteel{ @@ -38902,7 +38880,7 @@ "cMz" = ( /obj/machinery/door/morgue{ name = "Relic Closet"; - req_access_txt = "22" + req_access = list(22) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -39204,7 +39182,7 @@ id = "XenoPens"; name = "Xenobiology Shutters"; pixel_x = 24; - req_access_txt = "55" + req_access = list(55) }, /obj/machinery/camera{ c_tag = "Xenobiology Lab - Central Port"; @@ -39409,7 +39387,7 @@ "cOA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" + req_access = list(25) }, /obj/machinery/light_switch{ name = "north bump"; @@ -41499,7 +41477,7 @@ id = "Psych"; pixel_x = -24; pixel_y = 8; - req_access_txt = "64" + req_access = list(64) }, /obj/machinery/light_switch{ dir = 4; @@ -43553,7 +43531,7 @@ /obj/structure/closet/crate/secure{ desc = "A secure crate containing various materials for building a customised test-site."; name = "Test Site Materials Crate"; - req_access_txt = "8" + req_access = list(8) }, /obj/item/target/alien, /obj/item/target/syndicate, @@ -44079,9 +44057,9 @@ /obj/machinery/button/windowtint{ pixel_x = 24; id = "qm"; - req_access_txt = "41"; dir = 8; - pixel_y = 5 + pixel_y = 5; + req_access = list(41) }, /turf/simulated/floor/plasteel, /area/station/supply/qm) @@ -44369,7 +44347,7 @@ id = "evashutter"; name = "E.V.A. Storage Shutter Control"; pixel_y = 26; - req_access_txt = "19" + req_access = list(19) }, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -44660,7 +44638,7 @@ pixel_x = -6; pixel_y = 24; range = 4; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/light_switch{ name = "custom placement"; @@ -44911,8 +44889,8 @@ /obj/machinery/access_button{ autolink_id = "enginesm_btn_ext"; name = "Supermatter Access Button"; - req_access_txt = "10"; - pixel_x = 24 + pixel_x = 24; + req_access = list(10) }, /obj/machinery/camera{ c_tag = "Engineering - Central"; @@ -45439,7 +45417,6 @@ /obj/machinery/airlock_controller/air_cycler{ pixel_x = 9; pixel_y = -25; - req_access_txt = null; vent_link_id = "atmossouth_vent"; ext_door_link_id = "atmossouth_door_ext"; int_door_link_id = "atmossouth_door_int"; @@ -46259,7 +46236,7 @@ name = "Brig Lockdown"; pixel_x = -26; pixel_y = 7; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/camera{ c_tag = "Warden's Office"; @@ -47179,8 +47156,8 @@ /obj/machinery/access_button{ autolink_id = "atmossm_btn_ext"; name = "Atmospherics Access Button"; - req_access_txt = "24"; - pixel_x = 24 + pixel_x = 24; + req_access = list(24) }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/simulated/floor/plasteel{ @@ -50830,7 +50807,7 @@ name = "interior access button"; pixel_x = 25; pixel_y = -7; - req_access_txt = "13" + req_access = list(13) }, /obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/simulated/floor/plasteel{ @@ -51025,6 +51002,26 @@ /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel, /area/station/security/main) +"gvz" = ( +/obj/machinery/door_control{ + id = "qm_warehouse"; + name = "Warehouse Door Control"; + pixel_x = -24; + req_access = list(31) + }, +/obj/structure/table, +/obj/machinery/kitchen_machine/microwave{ + pixel_y = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch{ + dir = 4; + name = "custom placement"; + pixel_x = -24; + pixel_y = -8 + }, +/turf/simulated/floor/plasteel, +/area/station/supply/warehouse) "gvJ" = ( /obj/structure/cable{ d1 = 4; @@ -51951,7 +51948,7 @@ id = "xenobio7"; name = "Xenobio Pen 7 Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -52445,7 +52442,7 @@ id = "armory"; name = "Armory Shutter"; pixel_y = -24; - req_access_txt = "3" + req_access = list(3) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -54333,7 +54330,7 @@ id = "paramedic"; name = "Garage Door Control"; pixel_y = -24; - req_access_txt = "66" + req_access = list(66) }, /obj/effect/turf_decal/stripes/corner, /obj/structure/disposalpipe/junction/reversed{ @@ -54671,7 +54668,7 @@ name = "Service Shutter Control"; pixel_x = 24; pixel_y = 24; - req_access_txt = "35" + req_access = list(35) }, /turf/simulated/floor/plasteel{ dir = 1; @@ -54690,7 +54687,7 @@ id = "xenobio8"; name = "Xenobio Pen 8 Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /obj/item/reagent_containers/spray/cleaner{ pixel_x = 5 @@ -56422,7 +56419,7 @@ id = "xenobio6"; name = "Xenobio Pen 6 Blast Doors"; pixel_y = 1; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -57520,7 +57517,7 @@ name = "Xenobiology Access Button"; pixel_x = -3; pixel_y = 26; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel{ icon_state = "whitepurplefull" @@ -58281,7 +58278,7 @@ autolink_id = "xeno_btn_ext"; name = "Xenobiology Access Button"; pixel_y = -24; - req_access_txt = "55" + req_access = list(55) }, /obj/structure/cable{ d1 = 4; @@ -59423,8 +59420,8 @@ /obj/machinery/access_button{ autolink_id = "atmossm_btn_int"; name = "Atmospherics Access Button"; - req_access_txt = "24"; - pixel_x = -24 + pixel_x = -24; + req_access = list(24) }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/simulated/floor/plating, @@ -59586,15 +59583,15 @@ id = "Magistrate"; pixel_x = -24; pixel_y = 6; - req_access_txt = "74" + req_access = list(74) }, /obj/machinery/door_control{ id = "magistrateofficedoor"; name = "Office Door"; normaldoorcontrol = 1; pixel_x = -25; - req_access_txt = "74"; - pixel_y = -4 + pixel_y = -4; + req_access = list(74) }, /turf/simulated/floor/carpet, /area/station/legal/magistrate) @@ -61031,13 +61028,13 @@ normaldoorcontrol = 1; pixel_x = 6; pixel_y = 7; - req_access_txt = "63" + req_access = list(63) }, /obj/machinery/flasher_button{ id = "secentranceflasher"; name = "Brig Entrance Flash Control"; pixel_y = -3; - req_access_txt = "1" + req_access = list(1) }, /turf/simulated/floor/plasteel, /area/station/security/warden) @@ -61146,7 +61143,7 @@ name = "Atmospherics Lockdown"; pixel_x = -4; pixel_y = 24; - req_access_txt = "24" + req_access = list(24) }, /obj/machinery/light_switch{ name = "custom placement"; @@ -61260,7 +61257,7 @@ id = "xenobio4"; name = "Xenobio Pen 4 Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -62104,7 +62101,7 @@ id = "XenoPens"; name = "Xenobiology Shutters"; pixel_y = -24; - req_access_txt = "55" + req_access = list(55) }, /obj/item/book/manual/wiki/sop_science{ pixel_y = 4 @@ -62731,13 +62728,13 @@ /area/station/hallway/secondary/bridge) "lnd" = ( /obj/machinery/airlock_controller/air_cycler{ - req_access_txt = "10;13"; vent_link_id = "engine_vent"; ext_door_link_id = "engine_door_ext"; int_door_link_id = "engine_door_int"; pixel_y = 24; ext_button_link_id = "engine_btn_ext"; - int_button_link_id = "engine_btn_int" + int_button_link_id = "engine_btn_int"; + req_access = list(10,13) }, /turf/simulated/floor/plating, /area/station/engineering/control) @@ -63508,7 +63505,7 @@ name = "interior access button"; pixel_x = -22; pixel_y = 20; - req_access_txt = "10;13" + req_access = list(10,13) }, /obj/structure/lattice/catwalk, /turf/space, @@ -64198,7 +64195,7 @@ id = "xenobio1"; name = "Xenobio Pen 1 Blast Doors"; pixel_y = 1; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -65597,7 +65594,7 @@ id = "CMO"; pixel_x = -7; pixel_y = -24; - req_access_txt = "40" + req_access = list(40) }, /obj/machinery/keycard_auth{ pixel_x = 7; @@ -66459,8 +66456,7 @@ }, /area/station/medical/virology) "mRy" = ( -/obj/structure/rack, -/obj/item/storage/box/tranquilizer, +/obj/item/storage/fancy/shell/tranquilizer, /obj/structure/cable{ d1 = 1; d2 = 4; @@ -66471,6 +66467,7 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -67301,7 +67298,7 @@ name = "interior access button"; pixel_x = -22; pixel_y = -20; - req_access_txt = "10;13" + req_access = list(10,13) }, /turf/simulated/floor/engine, /area/station/engineering/control) @@ -68218,7 +68215,7 @@ name = "Service Shutter Control"; pixel_x = -24; pixel_y = -24; - req_access_txt = "28" + req_access = list(28) }, /turf/simulated/floor/plasteel{ icon_state = "cafeteria" @@ -71884,7 +71881,7 @@ name = "interior access button"; pixel_x = 25; pixel_y = -25; - req_access_txt = "13" + req_access = list(13) }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -71970,11 +71967,11 @@ name = "Virology Lab Access Console"; pixel_x = 24; pixel_y = -24; - req_one_access_txt = "39"; ext_door_link_id = "viro_door_ext"; int_door_link_id = "viro_door_int"; ext_button_link_id = "viro_btn_ext"; - int_button_link_id = "viro_btn_int" + int_button_link_id = "viro_btn_int"; + req_access = list(39) }, /obj/structure/cable{ d1 = 4; @@ -74840,7 +74837,7 @@ id = "HoS"; pixel_x = -24; pixel_y = 6; - req_access_txt = "58" + req_access = list(58) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -75253,7 +75250,7 @@ id = "Surgery 2"; pixel_x = 24; pixel_y = -4; - req_access_txt = "45" + req_access = list(45) }, /obj/machinery/holosign_switch{ dir = 8; @@ -75649,7 +75646,7 @@ id = "xenobio3"; name = "Xenobio Pen 3 Blast Doors"; pixel_y = 4; - req_access_txt = "55" + req_access = list(55) }, /turf/simulated/floor/plasteel, /area/station/science/xenobiology) @@ -75838,7 +75835,7 @@ name = "interrogation tint control"; pixel_x = -24; pixel_y = 6; - req_access_txt = "63" + req_access = list(63) }, /obj/structure/cable{ d1 = 2; @@ -77992,28 +77989,28 @@ }, /area/station/engineering/atmos/control) "rJh" = ( -/obj/structure/rack, /obj/machinery/requests_console/directional/north, /obj/structure/cable{ d1 = 4; d2 = 8; icon_state = "4-8" }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 2; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 2; pixel_y = 3 }, -/obj/item/storage/box/beanbag{ +/obj/item/storage/fancy/shell/beanbag{ pixel_x = 2; pixel_y = 3 }, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, -/obj/item/storage/box/rubbershot, +/obj/item/storage/fancy/shell/rubbershot, +/obj/item/storage/fancy/shell/rubbershot, +/obj/item/storage/fancy/shell/rubbershot, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -78672,7 +78669,7 @@ id = "roboticsprivacy2"; name = "Robotics Shutters"; pixel_x = 24; - req_access_txt = "29" + req_access = list(29) }, /turf/simulated/floor/plasteel{ icon_state = "darkgrey" @@ -79600,7 +79597,7 @@ name = "AI Chamber Turret Control"; pixel_x = 5; pixel_y = -24; - req_access_txt = "75" + req_access = list(75) }, /obj/machinery/flasher{ id = "AI"; @@ -80097,7 +80094,7 @@ name = "Robotics Privacy Control"; pixel_x = -26; pixel_y = 26; - req_access_txt = "29" + req_access = list(29) }, /turf/simulated/floor/plasteel, /area/station/science/robotics) @@ -80333,21 +80330,21 @@ name = "Justice Vent Control"; pixel_x = -26; pixel_y = 25; - req_access_txt = "3" + req_access = list(3) }, /obj/machinery/door_control{ id = "executionfireblast"; name = "Justice Area Lockdown"; pixel_x = -38; pixel_y = 25; - req_access_txt = "2" + req_access = list(2) }, /obj/machinery/ignition_switch{ id = "executionburn"; name = "Justice Ignition Switch"; pixel_x = -25; pixel_y = 36; - req_access_txt = "1" + req_access = list(1) }, /obj/machinery/flasher_button{ id = "justiceflash"; @@ -81634,7 +81631,7 @@ name = "exterior access button"; pixel_x = 25; pixel_y = -25; - req_access_txt = "13" + req_access = list(13) }, /turf/space, /area/space/nearstation) @@ -82320,8 +82317,7 @@ "tAF" = ( /obj/machinery/computer/prisoner{ dir = 1; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ icon_state = "cult" @@ -82866,7 +82862,7 @@ id = "IAA"; pixel_x = 24; pixel_y = 8; - req_access_txt = "38" + req_access = list(38) }, /turf/simulated/floor/carpet, /area/station/legal/lawoffice) @@ -85612,7 +85608,7 @@ name = "Chemistry Privacy Shutter Control"; pixel_x = 24; pixel_y = 24; - req_access_txt = "33" + req_access = list(33) }, /obj/machinery/chem_master, /turf/simulated/floor/plasteel{ @@ -85828,7 +85824,7 @@ name = "interior access button"; pixel_x = -25; pixel_y = -25; - req_access_txt = "13" + req_access = list(13) }, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -85844,7 +85840,7 @@ name = "Toxins Access"; pixel_x = -27; pixel_y = 8; - req_access_txt = "8" + req_access = list(8) }, /obj/machinery/atmospherics/pipe/simple/visible, /turf/simulated/floor/plasteel, @@ -86432,7 +86428,7 @@ name = "exterior access button"; pixel_x = -25; pixel_y = 7; - req_access_txt = "24;13" + req_access = list(24,13) }, /turf/simulated/floor/plating/airless, /area/station/engineering/atmos) @@ -88777,8 +88773,7 @@ "wAJ" = ( /obj/machinery/computer/prisoner{ dir = 8; - req_access = null; - req_access_txt = "2" + req_access = list(2) }, /turf/simulated/floor/plasteel{ dir = 8; @@ -89668,7 +89663,7 @@ name = "Virology Lab Access Button"; pixel_x = 8; pixel_y = -24; - req_access_txt = "39" + req_access = list(39) }, /obj/structure/cable{ d1 = 4; @@ -89743,7 +89738,7 @@ name = "Special Containment Blast Doors"; pixel_x = 4; pixel_y = -3; - req_access_txt = "55" + req_access = list(55) }, /obj/machinery/computer/security/telescreen{ desc = "Used for watching the special containment chamber."; @@ -89934,8 +89929,8 @@ /obj/machinery/access_button{ autolink_id = "enginesm_btn_int"; name = "Supermatter Access Button"; - req_access_txt = "10"; - pixel_x = 24 + pixel_x = 24; + req_access = list(10) }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -91689,7 +91684,7 @@ name = "Research Shutters Control"; pixel_x = 24; pixel_y = null; - req_access_txt = "7" + req_access = list(7) }, /obj/machinery/cell_charger, /turf/simulated/floor/plasteel{ @@ -91798,7 +91793,7 @@ name = "Experi-mentor shutters"; pixel_x = -25; pixel_y = null; - req_access_txt = "7" + req_access = list(7) }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -91990,8 +91985,8 @@ /obj/machinery/access_button{ autolink_id = "enginesm_btn_ext"; name = "Supermatter Access Button"; - req_access_txt = "10"; - pixel_x = -24 + pixel_x = -24; + req_access = list(10) }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -92216,7 +92211,7 @@ autolink_id = "viro_btn_ext"; name = "Virology Lab Access Button"; pixel_y = -24; - req_access_txt = "39" + req_access = list(39) }, /obj/structure/cable{ d1 = 4; @@ -92273,7 +92268,7 @@ id = "teleshutter"; name = "Teleporter Shutters Access Control"; pixel_x = -24; - req_access_txt = "62" + req_access = list(62) }, /turf/simulated/floor/plasteel, /area/station/command/teleporter) @@ -112382,7 +112377,7 @@ frx frx tWP aOB -aPR +gvz aWt gqF aTW diff --git a/_maps/map_files/templates/biodome_beach.dmm b/_maps/map_files/templates/biodome_beach.dmm index 3e0d5667f94f..9c2c233eb8e3 100644 --- a/_maps/map_files/templates/biodome_beach.dmm +++ b/_maps/map_files/templates/biodome_beach.dmm @@ -352,7 +352,7 @@ /turf/simulated/floor/beach/water, /area/ruin/powered/beach) "bM" = ( -/turf/simulated/floor/plasteel/stairs/old, +/turf/simulated/floor/plasteel/stairs, /area/ruin/powered/beach) "bN" = ( /obj/structure/flora/ausbushes/reedbush, diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm index 86c7365cf34c..df2b11ba4776 100644 --- a/_maps/map_files/templates/shelter_2.dmm +++ b/_maps/map_files/templates/shelter_2.dmm @@ -123,8 +123,8 @@ alert = 0; desc = "A display case containing an expensive forgery, probably."; pixel_y = -4; - req_access_txt = "48"; - start_showpiece_type = /obj/item/fakeartefact + start_showpiece_type = /obj/item/fakeartefact; + req_access = list(48) }, /turf/simulated/floor/carpet/black{ dir = 1 diff --git a/code/__DEFINES/_spacemandmm.dm b/code/__DEFINES/_spacemandmm.dm index 0abcd8bba9a8..8112a60eaece 100644 --- a/code/__DEFINES/_spacemandmm.dm +++ b/code/__DEFINES/_spacemandmm.dm @@ -1,15 +1,22 @@ // This file contains all the defines related to the spacemanDMM linter (dreamchecker). When running under normal conditions, BYOND will ignore all these +// Read https://github.com/SpaceManiac/SpacemanDMM/tree/master/crates/dreamchecker for more info. #ifdef SPACEMAN_DMM #define RETURN_TYPE(X) set SpacemanDMM_return_type = X #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X #define UNLINT(X) SpacemanDMM_unlint(X) #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X #define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X + /// A "pure" proc does not make any external changes, or to its output. #define SHOULD_BE_PURE(X) set SpacemanDMM_should_be_pure = X + /// Private procs can only be called by things of exactly the same type. This also prevents overriding of the proc. #define PRIVATE_PROC(X) set SpacemanDMM_private_proc = X + /// Protected procs can only be call by things of the same type or subtypes #define PROTECTED_PROC(X) set SpacemanDMM_protected_proc = X + /// Final vars forbid overriding their value by types that inherit it. #define VAR_FINAL var/SpacemanDMM_final + /// Private vars can only be called by things of exactly the same type #define VAR_PRIVATE var/SpacemanDMM_private + /// Protected vars can only be call by things of the same type or subtypes #define VAR_PROTECTED var/SpacemanDMM_protected #else #define RETURN_TYPE(X) diff --git a/code/__DEFINES/access_defines.dm b/code/__DEFINES/access_defines.dm index 10b3c80ad656..b946f7a75ba7 100644 --- a/code/__DEFINES/access_defines.dm +++ b/code/__DEFINES/access_defines.dm @@ -88,3 +88,4 @@ #define ACCESS_AWAY01 271 //! Access used for moonoutpost19 ruin. #define ACCESS_FREE_GOLEMS 300 //! Ghost role: free golems. #define ACCESS_THETA_STATION 301 //! Ghost role: Theta station. +#define ACCESS_DEEPSTORAGE 512 //! Space ruin: Deep Storage diff --git a/code/__DEFINES/antag_defines.dm b/code/__DEFINES/antag_defines.dm index 9213dc724bca..b5489f6948e1 100644 --- a/code/__DEFINES/antag_defines.dm +++ b/code/__DEFINES/antag_defines.dm @@ -106,3 +106,8 @@ GLOBAL_LIST(contractors) // Chance that a traitor will receive a 'You are being targeted by another syndicate agent' notification regardless of being an actual target #define ORG_PROB_PARANOIA 5 + +/// How often a biohazard's population is recorded after the event fires. +#define BIOHAZARD_POP_INTERVAL 5 MINUTES +/// The string version of the interval for use in blackbox key names. +#define BIOHAZARD_POP_INTERVAL_STR "5min" diff --git a/code/__DEFINES/milla.dm b/code/__DEFINES/rust.dm similarity index 57% rename from code/__DEFINES/milla.dm rename to code/__DEFINES/rust.dm index bf5f2ddca090..07242e955f50 100644 --- a/code/__DEFINES/milla.dm +++ b/code/__DEFINES/rust.dm @@ -1,59 +1,62 @@ -// milla.dm - DM API for milla extension library +// DM API for Rust extension modules +// Current modules: +// - MILLA, an asynchronous replacement for BYOND atmos +// - Mapmanip, a parse-time DMM file reader and modifier -// Default automatic MILLA detection. +// Default automatic library detection. // Look for it in the build location first, then in `.`, then in standard places. -/* This comment bypasses grep checks */ /var/__milla +/* This comment bypasses grep checks */ /var/__rustlib -/proc/__detect_milla() +/proc/__detect_rustlib() if(world.system_type == UNIX) #ifdef CIBUILDING - // CI override, use libmilla_ci.so if possible. - if(fexists("./tools/ci/libmilla_ci.so")) - return __milla = "tools/ci/libmilla_ci.so" + // CI override, use librustlibs_ci.so if possible. + if(fexists("./tools/ci/librustlibs_ci.so")) + return __rustlib = "tools/ci/librustlibs_ci.so" #endif // First check if it's built in the usual place. - if(fexists("./milla/target/i686-unknown-linux-gnu/release/libmilla.so")) - return __milla = "./milla/target/i686-unknown-linux-gnu/release/libmilla.so" + if(fexists("./rust/target/i686-unknown-linux-gnu/release/librustlibs.so")) + return __rustlib = "./rust/target/i686-unknown-linux-gnu/release/librustlibs.so" // Then check in the current directory. - if(fexists("./libmilla.so")) - return __milla = "./libmilla.so" + if(fexists("./librustlibs.so")) + return __rustlib = "./librustlibs.so" // And elsewhere. - return __milla = "libmilla.so" + return __rustlib = "librustlibs.so" else // First check if it's built in the usual place. - if(fexists("./milla/target/i686-pc-windows-msvc/release/milla.dll")) - return __milla = "./milla/target/i686-pc-windows-msvc/release/milla.dll" + if(fexists("./rust/target/i686-pc-windows-msvc/release/rustlibs.dll")) + return __rustlib = "./rust/target/i686-pc-windows-msvc/release/rustlibs.dll" // Then check in the current directory. - if(fexists("./milla.dll")) - return __milla = "./milla.dll" + if(fexists("./rustlibs.dll")) + return __rustlib = "./rustlibs.dll" // And elsewhere. - return __milla = "milla.dll" + return __rustlib = "rustlibs.dll" -#define MILLA (__milla || __detect_milla()) +#define RUSTLIB (__rustlib || __detect_rustlib()) -#define MILLA_CALL(func, args...) call_ext(MILLA, "byond:[#func]_ffi")(args) +#define RUSTLIB_CALL(func, args...) call_ext(RUSTLIB, "byond:[#func]_ffi")(args) /proc/milla_init_z(z) - return MILLA_CALL(initialize, z) + return RUSTLIB_CALL(milla_initialize, z) /proc/is_milla_synchronous(tick) - return MILLA_CALL(is_synchronous, tick) + return RUSTLIB_CALL(milla_is_synchronous, tick) /proc/set_tile_atmos(turf/T, airtight_north, airtight_east, airtight_south, airtight_west, atmos_mode, environment_id, oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature, innate_heat_capacity) - return MILLA_CALL(set_tile, T, airtight_north, airtight_east, airtight_south, airtight_west, atmos_mode, environment_id, oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature, innate_heat_capacity) + return RUSTLIB_CALL(milla_set_tile, T, airtight_north, airtight_east, airtight_south, airtight_west, atmos_mode, environment_id, oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature, innate_heat_capacity) /proc/get_tile_atmos(turf/T, list/L) - return MILLA_CALL(get_tile, T, L) + return RUSTLIB_CALL(milla_get_tile, T, L) /proc/spawn_milla_tick_thread() - return MILLA_CALL(spawn_tick_thread) + return RUSTLIB_CALL(milla_spawn_tick_thread) /proc/get_milla_tick_time() - return MILLA_CALL(get_tick_time) + return RUSTLIB_CALL(milla_get_tick_time) /proc/get_interesting_atmos_tiles() - return MILLA_CALL(get_interesting_tiles) + return RUSTLIB_CALL(milla_get_interesting_tiles) /proc/reduce_superconductivity(turf/T, list/superconductivity) var/north = superconductivity[1] @@ -61,10 +64,10 @@ var/south = superconductivity[3] var/west = superconductivity[4] - return MILLA_CALL(reduce_superconductivity, T, north, east, south, west) + return RUSTLIB_CALL(milla_reduce_superconductivity, T, north, east, south, west) /proc/reset_superconductivity(turf/T) - return MILLA_CALL(reset_superconductivity, T) + return RUSTLIB_CALL(milla_reset_superconductivity, T) /proc/set_tile_airtight(turf/T, list/airtight) var/north = airtight[1] @@ -72,16 +75,19 @@ var/south = airtight[3] var/west = airtight[4] - return MILLA_CALL(set_tile_airtight, T, north, east, south, west) + return RUSTLIB_CALL(milla_set_tile_airtight, T, north, east, south, west) /proc/get_random_interesting_tile() - return MILLA_CALL(get_random_interesting_tile) + return RUSTLIB_CALL(milla_get_random_interesting_tile) /proc/create_environment(oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature) - return MILLA_CALL(create_environment, oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature) + return RUSTLIB_CALL(milla_create_environment, oxygen, carbon_dioxide, nitrogen, toxins, sleeping_agent, agent_b, temperature) -#undef MILLA -#undef MILLA_CALL +/proc/mapmanip_read_dmm(mapname) + return RUSTLIB_CALL(mapmanip_read_dmm_file, mapname) + +#undef RUSTLIB +#undef RUSTLIB_CALL // Indexes for Tiles and InterestingTiles // Must match the order in milla/src/model.rs diff --git a/code/__HELPERS/bitflag_lists.dm b/code/__HELPERS/bitflag_lists.dm index ace6e0720ac2..7d7023a0cfbf 100644 --- a/code/__HELPERS/bitflag_lists.dm +++ b/code/__HELPERS/bitflag_lists.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(bitflag_lists) * System for storing bitflags past the 24 limit, making use of an associative list. * * Macro converts a list of integers into an associative list of bitflag entries for quicker comparison. - * Example: list(0, 4, 26, 32)) => list( "0" = ( (1<<0) | (1<<4) ), "1" = ( (1<<2) | (1<<8) ) ) + * Example: list(0, 4, 26, 32)) => list("0" = ( (1<<0) | (1<<4) ), "1" = ( (1<<2) | (1<<8) )) * Lists are cached into a global list of lists to avoid identical duplicates. * This system makes value comparisons faster than pairing every element of one list with every element of the other for evaluation. * diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 0c172757ce39..959af27e822a 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -920,3 +920,10 @@ while(islist(result)) result = pickweight(fill_with_ones(result)) return result + +/** + * Checks to make sure that the lists have the exact same contents, ignores the order of the contents. + */ +/proc/lists_equal_unordered(list/list_one, list/list_two) + // This ensures that both lists contain the same elements by checking if the difference between them is empty in both directions. + return !length(list_one ^ list_two) diff --git a/code/_globalvars/lists/dye_registry.dm b/code/_globalvars/lists/dye_registry.dm index c3a61c8dcc3e..4b794f626bbf 100644 --- a/code/_globalvars/lists/dye_registry.dm +++ b/code/_globalvars/lists/dye_registry.dm @@ -36,10 +36,15 @@ GLOBAL_LIST_INIT(dye_registry, list( DYE_CENTCOM = /obj/item/clothing/under/rank/centcom/commander, ), DYE_REGISTRY_JUMPSKIRT = list( - DYE_RED = /obj/item/clothing/under/dress/plaid_red, - DYE_BLUE = /obj/item/clothing/under/dress/plaid_blue, - DYE_PURPLE = /obj/item/clothing/under/dress/plaid_purple, - DYE_BLACK = /obj/item/clothing/under/dress/blackskirt, + DYE_RED = /obj/item/clothing/under/color/jumpskirt/red, + DYE_ORANGE = /obj/item/clothing/under/color/jumpskirt/orange, + DYE_YELLOW = /obj/item/clothing/under/color/jumpskirt/yellow, + DYE_GREEN = /obj/item/clothing/under/color/jumpskirt/green, + DYE_BLUE = /obj/item/clothing/under/color/jumpskirt/blue, + DYE_PURPLE = /obj/item/clothing/under/color/jumpskirt/lightpurple, + DYE_BLACK = /obj/item/clothing/under/color/jumpskirt/black, + DYE_WHITE = /obj/item/clothing/under/color/jumpskirt/white, + DYE_RAINBOW = /obj/item/clothing/under/color/jumpskirt/rainbow, DYE_MIME = /obj/item/clothing/under/rank/civilian/mime/skirt, DYE_QM = /obj/item/clothing/under/rank/cargo/qm/skirt, DYE_CAPTAIN = /obj/item/clothing/under/rank/captain/dress, diff --git a/code/controllers/subsystem/SSticker.dm b/code/controllers/subsystem/SSticker.dm index 1618ad3800f8..b965a597fafc 100644 --- a/code/controllers/subsystem/SSticker.dm +++ b/code/controllers/subsystem/SSticker.dm @@ -67,6 +67,8 @@ SUBSYSTEM_DEF(ticker) var/datum/scoreboard/score = null /// List of ckeys who had antag rolling issues flagged var/list/flagged_antag_rollers = list() + /// List of biohazards keyed to the last time their population was sampled. + var/list/biohazard_pop_times = list() /datum/controller/subsystem/ticker/Initialize() login_music = pick(\ @@ -112,6 +114,10 @@ SUBSYSTEM_DEF(ticker) delay_end = FALSE // reset this in case round start was delayed mode.process() + for(var/biohazard in biohazard_pop_times) + if(world.time - biohazard_pop_times[biohazard] > BIOHAZARD_POP_INTERVAL) + sample_biohazard_population(biohazard) + if(world.time > next_autotransfer) SSvote.start_vote(new /datum/vote/crew_transfer) next_autotransfer = world.time + GLOB.configuration.vote.autotransfer_interval_time @@ -829,22 +835,45 @@ SUBSYSTEM_DEF(ticker) continue .++ -/// Return whether or not a given biohazard is an active threat. -/// For blobs, this is simply if there are any overminds left. For terrors and -/// xenomorphs, this is whether they have overwhelming numbers. -/datum/controller/subsystem/ticker/proc/biohazard_active_threat(biohazard) +/datum/controller/subsystem/ticker/proc/sample_biohazard_population(biohazard) + SSblackbox.record_feedback("ledger", "biohazard_pop_[BIOHAZARD_POP_INTERVAL_STR]_interval", biohazard_count(biohazard), biohazard) + biohazard_pop_times[biohazard] = world.time + +/// Record the initial time that a biohazard spawned. +/datum/controller/subsystem/ticker/proc/record_biohazard_start(biohazard) + SSblackbox.record_feedback("associative", "biohazard_starts", 1, list("type" = biohazard, "time_ds" = world.time - time_game_started)) + sample_biohazard_population(biohazard) + +/datum/controller/subsystem/ticker/proc/biohazard_count(biohazard) switch(biohazard) if(TS_INFESTATION_GREEN_SPIDER, TS_INFESTATION_WHITE_SPIDER, TS_INFESTATION_PRINCESS_SPIDER, TS_INFESTATION_QUEEN_SPIDER) var/spiders = 0 for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in GLOB.ts_spiderlist) if(S.ckey) spiders++ - return spiders >= 5 + return spiders if(TS_INFESTATION_PRINCE_SPIDER) return length(GLOB.ts_spiderlist) if(BIOHAZARD_XENO) - return count_xenomorps() > 5 + return count_xenomorps() if(BIOHAZARD_BLOB) return length(SSticker.mode.blob_overminds) + CRASH("biohazard_count got unexpected [biohazard]") + +/// Return whether or not a given biohazard is an active threat. +/// For blobs, this is simply if there are any overminds left. For terrors and +/// xenomorphs, this is whether they have overwhelming numbers. +/datum/controller/subsystem/ticker/proc/biohazard_active_threat(biohazard) + var/count = biohazard_count(biohazard) + switch(biohazard) + if(TS_INFESTATION_GREEN_SPIDER, TS_INFESTATION_WHITE_SPIDER, TS_INFESTATION_PRINCESS_SPIDER, TS_INFESTATION_QUEEN_SPIDER) + return count >= 5 + if(TS_INFESTATION_PRINCE_SPIDER) + return count > 0 + if(BIOHAZARD_XENO) + return count > 5 + if(BIOHAZARD_BLOB) + return count > 0 + return FALSE diff --git a/code/controllers/subsystem/non_firing/SSlate_mapping.dm b/code/controllers/subsystem/non_firing/SSlate_mapping.dm index ca68dc48e9f8..b3e66541577c 100644 --- a/code/controllers/subsystem/non_firing/SSlate_mapping.dm +++ b/code/controllers/subsystem/non_firing/SSlate_mapping.dm @@ -12,6 +12,10 @@ SUBSYSTEM_DEF(late_mapping) var/list/obj/effect/spawner/bridge/bridge_spawners = list() /datum/controller/subsystem/late_mapping/Initialize() + // Sort all the air machines we initialized during mapload by name all at once + GLOB.air_alarms = sortAtom(GLOB.air_alarms) + GLOB.apcs = sortAtom(GLOB.apcs) + if(length(maze_generators)) var/watch = start_watch() log_startup_progress("Generating mazes...") diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm index a5ff38a26b06..a3b3d8286e88 100644 --- a/code/datums/mixed.dm +++ b/code/datums/mixed.dm @@ -19,7 +19,7 @@ /datum/data/record name = "record" size = 5.0 - var/list/fields = list( ) + var/list/fields = list() /datum/data/record/Destroy() if(src in GLOB.data_core.medical) diff --git a/code/datums/status_effects/magic_disguise.dm b/code/datums/status_effects/magic_disguise.dm index f7bc83343b97..31f2b2ef0b28 100644 --- a/code/datums/status_effects/magic_disguise.dm +++ b/code/datums/status_effects/magic_disguise.dm @@ -44,7 +44,7 @@ caster_area = get_area(owner) for(var/obj/machinery/door/airlock/tmp in view(owner)) - if(get_area(tmp) == caster_area && !(tmp.req_access_txt == "0" && tmp.req_one_access_txt == "0")) //Ignore airlocks that arent in area or are public airlocks + if(get_area(tmp) == caster_area && (length(tmp.req_access) || length(tmp.req_one_access))) //Ignore airlocks that arent in area or are public airlocks AL = tmp break for(var/mob/living/carbon/human/disguise_source in shuffle(GLOB.player_list)) //Pick a random crewmember with access to this room diff --git a/code/datums/uplink_items/uplink_traitor.dm b/code/datums/uplink_items/uplink_traitor.dm index 006039d2b943..ce46ae3db35b 100644 --- a/code/datums/uplink_items/uplink_traitor.dm +++ b/code/datums/uplink_items/uplink_traitor.dm @@ -337,7 +337,7 @@ //skrell /datum/uplink_item/species_restricted/lovepen name = "Aggression Suppression Pen" - desc = "A syringe disguised as a functional pen which is filled with a potent aggression supressing chemical. The pen holds four doses of the mixture and it cannot be refilled." + desc = "A hypospray disguised as a functional pen which is filled with a potent aggression suppressing chemical. The pen holds four doses of the mixture which slowly regenerates over time, but cannot be refilled." reference = "LP" item = /obj/item/pen/sleepy/love cost = 20 diff --git a/code/defines/procs/announcer_datum.dm b/code/defines/procs/announcer_datum.dm index c0dad40bc433..39c97ec8990d 100644 --- a/code/defines/procs/announcer_datum.dm +++ b/code/defines/procs/announcer_datum.dm @@ -137,10 +137,6 @@ GLOBAL_DATUM_INIT(major_announcement, /datum/announcer, new(config_type = /datum log_game("[key_name(usr)] has made \a [config.log_name]: [message_title] - [message] - [author]") message_admins("[key_name_admin(usr)] has made \a [config.log_name].", 1) -/proc/GetNameAndAssignmentFromId(obj/item/card/id/I) - // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) - return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name - /datum/announcement_configuration/event default_title = ANNOUNCE_KIND_EVENT sound = sound('sound/misc/notice2.ogg') diff --git a/code/game/area/areas/depot-areas.dm b/code/game/area/areas/depot-areas.dm index 7c25b50b6239..dabbf83d9474 100644 --- a/code/game/area/areas/depot-areas.dm +++ b/code/game/area/areas/depot-areas.dm @@ -183,7 +183,7 @@ for(var/mob/living/simple_animal/hostile/syndicate/N in src) N.a_intent = INTENT_HARM for(var/obj/machinery/door/airlock/A in src) - A.req_access_txt = "[ACCESS_SYNDICATE_LEADER]" + A.req_access = list(ACCESS_SYNDICATE_LEADER) for(var/obj/structure/closet/secure_closet/syndicate/depot/L in src) if(L.locked) L.locked = !L.locked diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d623ec9dc290..90527c55547d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -488,11 +488,13 @@ /// Updates the name of the atom /atom/proc/update_name(updates=ALL) SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME, updates) /// Updates the description of the atom /atom/proc/update_desc(updates=ALL) SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_DESC, updates) /// Updates the icon of the atom @@ -525,10 +527,12 @@ /// Updates the icon state of the atom /atom/proc/update_icon_state() + PROTECTED_PROC(TRUE) return /// Updates the overlays of the atom. It has to return a list of overlays if it can't call the parent to create one. The list can contain anything that would be valid for the add_overlay proc: Images, mutable appearances, icon states... /atom/proc/update_overlays() + PROTECTED_PROC(TRUE) return list() /atom/proc/relaymove() diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index ad06167f1164..b1397465f3ac 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -617,7 +617,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) explanation_text = "Free Objective." /datum/objective/steal/proc/select_target() - var/list/possible_items_all = GLOB.potential_theft_objectives + "custom" + var/list/possible_items_all = GLOB.potential_theft_objectives + "custom" + "random" var/new_target = input("Select target:", "Objective target", null) as null|anything in possible_items_all if(!new_target) return @@ -636,13 +636,19 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) target_theft_objective.name = theft_objective_name steal_target = target_theft_objective explanation_text = "Steal [theft_objective_name]." - else - steal_target = new new_target - update_explanation_text() - if(steal_target.special_equipment) - give_kit(steal_target.special_equipment) + return steal_target + else if(new_target == "random") + return TRUE + + steal_target = new new_target + update_explanation_text() + if(steal_target.special_equipment) // We have to do it with a callback because mind/Topic creates the objective without an owner + addtimer(CALLBACK(src, PROC_REF(hand_out_equipment)), 5 SECONDS, TIMER_DELETE_ME) return steal_target +/datum/objective/steal/proc/hand_out_equipment() + give_kit(steal_target?.special_equipment) + /datum/objective/steal/update_explanation_text() explanation_text = "Steal [steal_target.name]. One was last seen in [get_location()]. " if(length(steal_target.protected_jobs) && steal_target.job_possession) @@ -679,7 +685,6 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) var/mob/living/carbon/human/kit_receiver = kit_receiver_mind.current if(!kit_receiver) continue - var/where = kit_receiver.equip_in_one_of_slots(item_to_give, slots) if(!where) continue diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 08f8b073b7a9..1546afc8c116 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -168,12 +168,12 @@ /obj/item/scrying name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." + desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means. Also works well as a throwing weapon." icon = 'icons/obj/wizard.dmi' icon_state ="scrying_orb" throw_speed = 7 throw_range = 15 - throwforce = 15 + throwforce = 25 damtype = BURN force = 15 hitsound = 'sound/items/welder2.ogg' @@ -183,6 +183,7 @@ /obj/item/scrying/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) + AddComponent(/datum/component/boomerang, throw_range, TRUE) /obj/item/scrying/Destroy() STOP_PROCESSING(SSobj, src) @@ -237,6 +238,17 @@ user.remove_atom_colour(ADMIN_COLOUR_PRIORITY, COLOR_BLUE) REMOVE_TRAIT(user, SCRYING, SCRYING_ORB) +/obj/item/scrying/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(!ishuman(hit_atom) || !throwingdatum || iswizard(hit_atom)) + return + var/mob/living/carbon/human/crushee = hit_atom + var/zone = ran_zone(throwingdatum.target_zone) // Base 80% to hit the zone you're aiming for + var/obj/item/organ/external/hit_limb = crushee.get_organ(zone) + if(hit_limb) + hit_limb.fracture() + + /////////////////////Multiverse Blade//////////////////// GLOBAL_LIST_EMPTY(multiverse) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index c698751b4655..3dce596278e8 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -424,7 +424,7 @@ /datum/spellbook_entry/item/scryingorb name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision." + desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision. It will also work as an excellent throwing weapon, and will return to your hand after throwing." item_path = /obj/item/scrying category = "Artefacts" diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 0587ffd3d440..629aad215de9 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -15,26 +15,6 @@ else return check_access_list(acc) -/obj/proc/generate_req_lists() - //These generations have been moved out of /obj/New() because they were slowing down the creation of objects that never even used the access system. - if(!req_access) - req_access = list() - if(req_access_txt) - var/list/req_access_str = splittext(req_access_txt, ";") - for(var/x in req_access_str) - var/n = text2num(x) - if(n) - req_access += n - - if(!req_one_access) - req_one_access = list() - if(req_one_access_txt) - var/list/req_one_access_str = splittext(req_one_access_txt,";") - for(var/x in req_one_access_str) - var/n = text2num(x) - if(n) - req_one_access += n - /obj/proc/check_access(obj/item/I) var/list/L if(I) @@ -44,8 +24,6 @@ return check_access_list(L) /obj/proc/check_access_list(list/L) - generate_req_lists() - if(!L) return 0 if(!istype(L, /list)) diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index fb6e69fdb877..3a896dcb5c12 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -48,7 +48,7 @@ id = /obj/item/card/id/quartermaster l_hand = /obj/item/clipboard l_pocket = /obj/item/mail_scanner - pda = /obj/item/pda/quartermaster + pda = /obj/item/pda/heads/qm backpack_contents = list( /obj/item/melee/classic_baton/telescopic = 1 ) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 96c54e3e9474..ffcdfdad7d17 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -416,6 +416,8 @@ new_item.materials[MAT_GLASS] /= coeff new_item.pixel_y = rand(-5, 5) new_item.pixel_x = rand(-5, 5) + if(is_station_level(z)) + SSblackbox.record_feedback("tally", "station_autolathe_production", 1, "[D.type]") SStgui.update_uis(src) desc = initial(desc) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 67b1fae2762d..937406689b67 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -625,11 +625,13 @@ to destroy them and players will be able to make replacements. build_path = /obj/machinery/chem_dispenser board_type = "machine" origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" - req_components = list( /obj/item/stock_parts/matter_bin = 2, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stack/sheet/glass = 1, - /obj/item/stock_parts/cell = 1) + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stock_parts/cell = 1 + ) /obj/item/circuitboard/chem_master board_name = "ChemMaster 3000" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a260b16f531a..19b6d0217119 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1531,8 +1531,7 @@ GLOBAL_LIST_EMPTY(airlock_emissive_underlays) DA.polarized_glass = polarized_glass DA.state = AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS DA.created_name = name - DA.update_name() - DA.update_icon() + DA.update_appearance(UPDATE_NAME|UPDATE_ICON) if(!disassembled) if(DA) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 828fbb9001f6..9a2a29a93f90 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -197,8 +197,7 @@ DA = new /obj/structure/door_assembly(loc) if(glass) DA.glass = TRUE - DA.update_icon() - DA.update_name() + DA.update_appearance(UPDATE_NAME|UPDATE_ICON) qdel(src) /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) @@ -367,11 +366,11 @@ /obj/machinery/door/airlock/hatch/syndicate name = "syndicate hatch" - req_access_txt = "150" + req_access = list(ACCESS_SYNDICATE) /obj/machinery/door/airlock/hatch/syndicate/command name = "Command Center" - req_access_txt = "153" + req_access = list(ACCESS_SYNDICATE_COMMAND) explosion_block = 2 normal_integrity = 1000 security_level = 6 @@ -398,7 +397,7 @@ /obj/machinery/door/airlock/hatch/syndicate/vault name = "syndicate vault hatch" - req_access_txt = "151" + req_access = list(ACCESS_SYNDICATE) icon = 'icons/obj/doors/airlocks/vault/vault.dmi' overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_vault diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 071811f3137a..1c1451bb5669 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -610,6 +610,6 @@ blockage.max_integrity += 25 foam_level++ blockage.icon_state = "foamed_[foam_level]" - blockage.update_icon_state() + blockage.update_icon(UPDATE_ICON_STATE) #undef MAX_FOAM_LEVEL diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 18cc38eac8b7..f31a573e270e 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -383,7 +383,7 @@ GLOBAL_LIST_EMPTY(allRequestConsoles) /obj/machinery/requests_console/proc/print_label(tag_name, tag_index) var/obj/item/shippingPackage/sp = new /obj/item/shippingPackage(get_turf(src)) sp.sortTag = tag_index - sp.update_desc() + sp.update_appearance(UPDATE_DESC) print_cooldown = world.time + 600 //1 minute cooldown before you can print another label, but you can still configure the next one during this time /obj/machinery/requests_console/proc/view_messages() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6a3d980797d9..d726a0c00a0b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -372,7 +372,7 @@ * **/ /obj/machinery/suit_storage_unit/proc/store_item(obj/item/I, mob/user) - if((istype(I, /obj/item/clothing/suit)|| istype(I, /obj/item/mod/control)) && !suit) + if((istype(I, /obj/item/clothing/suit) || istype(I, /obj/item/mod/control) || istype(I, /obj/item/storage/backpack)) && !suit) if(try_store_item(I, user)) suit = I return TRUE diff --git a/code/game/machinery/vendors/contraband_vendors.dm b/code/game/machinery/vendors/contraband_vendors.dm index 10992d51c29c..6b9d4d3542a2 100644 --- a/code/game/machinery/vendors/contraband_vendors.dm +++ b/code/game/machinery/vendors/contraband_vendors.dm @@ -13,7 +13,7 @@ "Don't you want some?", "Ping!") - req_access_txt = "150" + req_access = list(ACCESS_SYNDICATE) products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/syringe/charcoal = 4, @@ -107,7 +107,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/economy/vending/wallmed/syndicate, 32 desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." icon_state = "liberationstation" icon_lightmask = "liberationstation" - req_access_txt = "1" + req_access = list(ACCESS_SECURITY) slogan_list = list("Liberation Station: Your one-stop shop for all things second amendment!", "Be a patriot today, pick up a gun!", "Quality weapons for cheap prices!", diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm index d19ccc0ea9bd..63d9b65e5d1f 100644 --- a/code/game/machinery/vendors/departmental_vendors.dm +++ b/code/game/machinery/vendors/departmental_vendors.dm @@ -5,7 +5,7 @@ icon_deny = "engivend_deny" icon_panel = "generic" category = VENDOR_TYPE_DEPARTMENTAL - req_one_access_txt = "11;24" // Engineers and atmos techs can use this + req_one_access = list(ACCESS_ENGINE_EQUIP, ACCESS_ATMOSPHERICS) products = list(/obj/item/clothing/glasses/meson/engine = 2, /obj/item/clothing/glasses/meson/engine/tray = 4, /obj/item/multitool = 4, @@ -28,7 +28,7 @@ icon_state = "engi" icon_deny = "engi_deny" category = VENDOR_TYPE_DEPARTMENTAL - req_access_txt = "11" + req_access = list(ACCESS_ENGINE_EQUIP) products = list(/obj/item/clothing/under/rank/engineering/chief_engineer = 4, /obj/item/clothing/under/rank/engineering/engineer = 40, /obj/item/clothing/shoes/workboots = 4, @@ -62,7 +62,7 @@ icon_deny = "robotics_deny" category = VENDOR_TYPE_DEPARTMENTAL icon_lightmask = "robotics" - req_access_txt = "29" + req_access = list(ACCESS_ROBOTICS) products = list(/obj/item/clothing/suit/storage/labcoat = 4, /obj/item/clothing/under/rank/rnd/roboticist = 4, /obj/item/stack/cable_coil = 4, /obj/item/flash = 4, @@ -253,7 +253,7 @@ "Don't you want some?", "Ping!") - req_access_txt = "5" + req_access = list(ACCESS_MEDICAL) category = VENDOR_TYPE_DEPARTMENTAL products = list(/obj/item/reagent_containers/hypospray/autoinjector/epinephrine = 4, /obj/item/stack/medical/bruise_pack/advanced = 2, @@ -331,7 +331,7 @@ icon_deny = "sec_deny" icon_panel = "wide_vendor" category = VENDOR_TYPE_DEPARTMENTAL - req_access_txt = "1" + req_access = list(ACCESS_SECURITY) products = list(/obj/item/restraints/handcuffs = 8, /obj/item/restraints/handcuffs/cable/zipties = 8, /obj/item/grenade/flashbang = 4, diff --git a/code/game/machinery/vendors/generic_vendors.dm b/code/game/machinery/vendors/generic_vendors.dm index 3c35cb49d058..be1d473e1961 100644 --- a/code/game/machinery/vendors/generic_vendors.dm +++ b/code/game/machinery/vendors/generic_vendors.dm @@ -249,7 +249,6 @@ "Dont carry your size? How about you shave off some pounds you fat lazy- *BZZT*") products = list(/obj/item/clothing/under/color/black = 10, - /obj/item/clothing/under/dress/blackskirt = 10, /obj/item/clothing/under/color/grey = 10, /obj/item/clothing/under/color/white = 10, /obj/item/clothing/under/color/darkred = 10, @@ -269,11 +268,34 @@ /obj/item/clothing/under/color/purple = 10, /obj/item/clothing/under/color/lightpurple = 10, /obj/item/clothing/under/color/pink = 10, + /obj/item/clothing/under/dress/blackskirt = 10, + /obj/item/clothing/under/color/jumpskirt/black = 10, + /obj/item/clothing/under/color/jumpskirt/grey = 10, + /obj/item/clothing/under/color/jumpskirt/white = 10, + /obj/item/clothing/under/color/jumpskirt/darkred = 10, + /obj/item/clothing/under/color/jumpskirt/red = 10, + /obj/item/clothing/under/color/jumpskirt/lightred = 10, + /obj/item/clothing/under/color/jumpskirt/brown = 10, + /obj/item/clothing/under/color/jumpskirt/orange = 10, + /obj/item/clothing/under/color/jumpskirt/lightbrown = 10, + /obj/item/clothing/under/color/jumpskirt/yellow = 10, + /obj/item/clothing/under/color/jumpskirt/yellowgreen = 10, + /obj/item/clothing/under/color/jumpskirt/lightgreen = 10, + /obj/item/clothing/under/color/jumpskirt/green = 10, + /obj/item/clothing/under/color/jumpskirt/aqua = 10, + /obj/item/clothing/under/color/jumpskirt/darkblue = 10, + /obj/item/clothing/under/color/jumpskirt/blue = 10, + /obj/item/clothing/under/color/jumpskirt/lightblue = 10, + /obj/item/clothing/under/color/jumpskirt/purple = 10, + /obj/item/clothing/under/color/jumpskirt/lightpurple = 10, + /obj/item/clothing/under/color/jumpskirt/pink = 10, + /obj/item/clothing/under/color/jumpskirt/rainbow = 1, /obj/item/clothing/under/color/rainbow = 1) contraband = list(/obj/item/clothing/under/syndicate/tacticool = 5, /obj/item/clothing/under/syndicate/greyman = 5, - /obj/item/clothing/under/color/orange/prison = 5) + /obj/item/clothing/under/color/orange/prison = 10, + /obj/item/clothing/under/color/jumpskirt/orange/prison = 10) prices = list(/obj/item/clothing/under/color/black = 30, /obj/item/clothing/under/dress/blackskirt = 30, @@ -297,8 +319,30 @@ /obj/item/clothing/under/color/lightpurple = 50, /obj/item/clothing/under/color/pink = 50, /obj/item/clothing/under/color/rainbow = 100, + /obj/item/clothing/under/color/jumpskirt/black = 30, + /obj/item/clothing/under/color/jumpskirt/grey = 30, + /obj/item/clothing/under/color/jumpskirt/white = 50, + /obj/item/clothing/under/color/jumpskirt/darkred = 50, + /obj/item/clothing/under/color/jumpskirt/red = 50, + /obj/item/clothing/under/color/jumpskirt/lightred = 50, + /obj/item/clothing/under/color/jumpskirt/brown = 30, + /obj/item/clothing/under/color/jumpskirt/orange = 50, + /obj/item/clothing/under/color/jumpskirt/lightbrown = 30, + /obj/item/clothing/under/color/jumpskirt/yellow = 50, + /obj/item/clothing/under/color/jumpskirt/yellowgreen = 50, + /obj/item/clothing/under/color/jumpskirt/lightgreen = 50, + /obj/item/clothing/under/color/jumpskirt/green = 50, + /obj/item/clothing/under/color/jumpskirt/aqua = 50, + /obj/item/clothing/under/color/jumpskirt/darkblue = 50, + /obj/item/clothing/under/color/jumpskirt/blue = 50, + /obj/item/clothing/under/color/jumpskirt/lightblue = 30, + /obj/item/clothing/under/color/jumpskirt/purple = 50, + /obj/item/clothing/under/color/jumpskirt/lightpurple = 50, + /obj/item/clothing/under/color/jumpskirt/pink = 50, + /obj/item/clothing/under/color/jumpskirt/rainbow = 100, /obj/item/clothing/under/syndicate/tacticool = 75, /obj/item/clothing/under/syndicate/greyman = 75, + /obj/item/clothing/under/color/jumpskirt/orange/prison = 75, /obj/item/clothing/under/color/orange/prison = 75) refill_canister = /obj/item/vending_refill/suitdispenser diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index ba98e8b6ad85..13a6887278ba 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -420,7 +420,7 @@ do_after_cooldown() /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/cleaner/can_attach(obj/mecha/nkarrdem/M as obj) - return ..() && istype(M) + return istype(M) && length(M.equipment) < M.max_equip /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar equip_cooldown = 2 SECONDS diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index a7f2be30560b..efcbd0ff3bfa 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -247,6 +247,8 @@ /obj/machinery/mecha_part_fabricator/proc/build_design_timer_finish(datum/design/D, list/final_cost) // Spawn the item (in a lockbox if restricted) OR mob (e.g. IRC body) var/atom/A = new D.build_path(get_step(src, output_dir)) + if(is_station_level(z)) + SSblackbox.record_feedback("tally", "station_mechfab_production", 1, "[D.type]") if(isitem(A)) var/obj/item/I = A I.materials = final_cost diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d04a540066af..bd96797ad522 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -159,7 +159,7 @@ qdel(V) set_light(lights_range_ambient, lights_power_ambient) - update_overlays() + update_icon(UPDATE_OVERLAYS) /obj/mecha/update_overlays() . = ..() @@ -1037,7 +1037,7 @@ AI.forceMove(src) occupant = AI icon_state = reset_icon(icon_state) - update_overlays() + update_icon(UPDATE_OVERLAYS) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) SEND_SOUND(occupant, sound(nominalsound, volume = 50)) @@ -1195,7 +1195,7 @@ H.throw_alert("locked", /atom/movable/screen/alert/mech_maintenance) if(connected_port) H.throw_alert("mechaport_d", /atom/movable/screen/alert/mech_port_disconnect) - update_overlays() + update_icon(UPDATE_OVERLAYS) return TRUE else return FALSE @@ -1251,7 +1251,7 @@ Move(loc) icon_state = reset_icon() dir = dir_in - update_overlays() + update_icon(UPDATE_OVERLAYS) log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) SEND_SOUND(occupant, sound(nominalsound, volume = 50)) @@ -1341,7 +1341,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L H.regenerate_icons() // workaround for 14457 - update_overlays() + update_icon(UPDATE_OVERLAYS) /obj/mecha/force_eject_occupant(mob/target) go_out() diff --git a/code/game/objects/effects/map_effects/mapmanip.dm b/code/game/objects/effects/map_effects/mapmanip.dm new file mode 100644 index 000000000000..d0be4103dd90 --- /dev/null +++ b/code/game/objects/effects/map_effects/mapmanip.dm @@ -0,0 +1,26 @@ +/obj/effect/map_effect/marker/mapmanip + name = "mapmanip marker" + layer = POINT_LAYER + +/obj/effect/map_effect/marker/mapmanip/Initialize(mapload) + . = ..() + qdel(src) + +/obj/effect/map_effect/marker/mapmanip/submap/extract + name = "mapmanip marker, extract submap" + icon = 'icons/effects/map_effects_96x96.dmi' + icon_state = "mapmanip_extract" + pixel_x = -32 + pixel_y = -32 + +/obj/effect/map_effect/marker/mapmanip/submap/insert + name = "mapmanip marker, insert submap" + icon = 'icons/effects/map_effects_96x96.dmi' + icon_state = "mapmanip_insert" + pixel_x = -32 + pixel_y = -32 + +/obj/effect/map_effect/marker_helper/mapmanip/submap/edge + name = "mapmanip helper marker, edge of submap" + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "mapmanip_submap_edge" diff --git a/code/game/objects/effects/misc_effects.dm b/code/game/objects/effects/misc_effects.dm index ee56195d173f..bc12b3c7851c 100644 --- a/code/game/objects/effects/misc_effects.dm +++ b/code/game/objects/effects/misc_effects.dm @@ -58,7 +58,7 @@ /obj/effect/shut_controller name = "shut controller" var/moving = null - var/list/parts = list( ) + var/list/parts = list() /obj/structure/showcase name = "Showcase" @@ -86,7 +86,7 @@ name = "mobl" var/master = null - var/list/container = list( ) + var/list/container = list() /obj/structure/showcase/horrific_experiment diff --git a/code/game/objects/effects/spawners/airlock_spawner.dm b/code/game/objects/effects/spawners/airlock_spawner.dm index cfeea9b4448e..3fa3c557e4b8 100644 --- a/code/game/objects/effects/spawners/airlock_spawner.dm +++ b/code/game/objects/effects/spawners/airlock_spawner.dm @@ -207,14 +207,10 @@ This spawner places pipe leading up to the interior door, you will need to finis // Since airlocks are created first, we steal the payload logic // to apply to the controls later req_access = airlock.req_access - req_access_txt = airlock.req_access_txt req_one_access = airlock.req_one_access - req_one_access_txt = airlock.req_one_access_txt else I.req_access = req_access - I.req_access_txt = req_access_txt I.req_one_access = req_one_access - I.req_one_access_txt = req_one_access_txt // MARK: AIRLOCK HELPERS diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 0daaeef79308..ee32405e0680 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -272,7 +272,7 @@ /obj/item/melee/baseball_bat/homerun = 50, /obj/item/rcd/combat = 50, /obj/item/weaponcrafting/gunkit/universal_gun_kit/sol_gov = 50, - /obj/item/storage/box/buck = 30, //Only seven shots, make them count + /obj/item/storage/fancy/shell/buck = 30, //Only eight shots, make them count /obj/item/mod/module/noslip = 40, /obj/item/clothing/mask/holo_cigar = 50 ) @@ -389,7 +389,7 @@ /obj/item/mod/construction/plating/research = 30, /obj/item/assembly/signaler/anomaly/random = 20, /obj/item/gun/energy/gun = 50, - /obj/item/storage/box/dragonsbreath = 30, + /obj/item/storage/fancy/shell/dragonsbreath = 30, /obj/item/storage/box/turbine_kit = 20, /obj/item/mod/module/firefighting_tank = 40, /obj/item/mod/module/jetpack/advanced = 40 diff --git a/code/game/objects/effects/spawners/random/trash_spawners.dm b/code/game/objects/effects/spawners/random/trash_spawners.dm index bc15b76c47d0..6fc25c65a82d 100644 --- a/code/game/objects/effects/spawners/random/trash_spawners.dm +++ b/code/game/objects/effects/spawners/random/trash_spawners.dm @@ -58,8 +58,16 @@ // Ammo casings rarely list( - /obj/item/ammo_casing/c10mm, - /obj/item/trash/spentcasing, + /obj/item/trash/spentcasing/shotgun, + /obj/item/trash/spentcasing/shotgun/rubbershot, + /obj/item/trash/spentcasing/shotgun/beanbag, + /obj/item/trash/spentcasing/shotgun/slug, + /obj/item/trash/spentcasing/shotgun/dragonsbreath, + /obj/item/trash/spentcasing/shotgun/stun, + /obj/item/trash/spentcasing/bullet, + /obj/item/trash/spentcasing/bullet/medium, + /obj/item/trash/spentcasing/bullet/large, + /obj/item/trash/spentcasing/bullet/lasershot ) = 1, ) diff --git a/code/game/objects/effects/temporary_visuals/misc_visuals.dm b/code/game/objects/effects/temporary_visuals/misc_visuals.dm index 77cdaa73bf46..f06a632c2957 100644 --- a/code/game/objects/effects/temporary_visuals/misc_visuals.dm +++ b/code/game/objects/effects/temporary_visuals/misc_visuals.dm @@ -520,3 +520,20 @@ icon = 'icons/effects/96x96.dmi' icon_state = "warning" duration = 3 SECONDS + +/obj/effect/temp_visual/bsa_splash + name = "\improper Bluespace energy wave" + desc = "A massive, rippling wave of bluepace energy, all rapidly exhausting itself the moment it leaves the concentrated beam of light." + icon = 'icons/effects/beam_splash.dmi' + icon_state = "beam_splash_l" + layer = ABOVE_ALL_MOB_LAYER + pixel_y = -16 + duration = 50 + +/obj/effect/temp_visual/bsa_splash/Initialize(mapload, dir) + . = ..() + switch(dir) + if(WEST) + icon_state = "beam_splash_w" + if(EAST) + icon_state = "beam_splash_e" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 642e3f497f2c..ea8dac2bb266 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -346,7 +346,7 @@ /obj/item/radio/headset/ert/alt name = "emergency response team's bowman headset" - desc = "The headset of the boss. Protects ears from flashbangs." + desc = "An ergonomic tactical headset used by Nanotrasen-affiliated PMCs. Protects against loud noises." flags = EARBANGPROTECT icon_state = "com_headset_alt" item_state = "com_headset_alt" diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 463a69a18d3c..6feda858d4c8 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -116,10 +116,11 @@ /obj/item/taperecorder/AltClick(mob/user) if(in_range(user, src) && mytape && !HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - var/list/options = list( "Playback Tape" = image(icon = 'icons/obj/device.dmi', icon_state = "taperecorder_playing"), - "Print Transcript" = image(icon = 'icons/obj/bureaucracy.dmi', icon_state = "paper_words"), - "Eject Tape" = image(icon = 'icons/obj/device.dmi', icon_state = "[mytape.icon_state]") - ) + var/list/options = list( + "Playback Tape" = image(icon = 'icons/obj/device.dmi', icon_state = "taperecorder_playing"), + "Print Transcript" = image(icon = 'icons/obj/bureaucracy.dmi', icon_state = "paper_words"), + "Eject Tape" = image(icon = 'icons/obj/device.dmi', icon_state = "[mytape.icon_state]") + ) var/choice = show_radial_menu(user, src, options) if(user.incapacitated()) return diff --git a/code/game/objects/items/scratch_card.dm b/code/game/objects/items/scratch_card.dm index 2a6f372fe7d0..5864b207e7ee 100644 --- a/code/game/objects/items/scratch_card.dm +++ b/code/game/objects/items/scratch_card.dm @@ -27,7 +27,7 @@ icon_state = "scard_loser" playsound(user, 'sound/items/scratching.ogg', 25, TRUE) scratched = TRUE - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/scratch/attack_obj(obj/O, mob/living/user, params) if(winner && istype(O, /obj/machinery/economy/atm)) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index f9a3c96d3dd9..73bbf852c76c 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -17,6 +17,9 @@ return TRUE return ..() +/obj/item/trash/attack(mob/M as mob, mob/living/user as mob) + return + /obj/item/trash/raisins name = "4no raisins" icon_state= "4no_raisins" @@ -117,12 +120,6 @@ name = "bread tube" icon_state = "tastybread" -/obj/item/trash/spentcasing - icon = 'icons/obj/ammo.dmi' - name = "bullet casing" - desc = "A spent bullet casing. Smells like cordite." - icon_state = "gshell" - /obj/item/trash/tapetrash name = "old duct tape" icon_state = "tape" @@ -134,5 +131,61 @@ icon_state = "popsicle_stick_s" desc = "Still tastes sweet." -/obj/item/trash/attack(mob/M as mob, mob/living/user as mob) - return +// Ammo casings +/obj/item/trash/spentcasing + icon = 'icons/obj/ammo.dmi' + name = "arbitrary spent casing item" + desc = "If you can see this and didn't spawn it, make an issue report on GitHub." + icon_state = "gshell" + +/obj/item/trash/spentcasing/Initialize(mapload) + . = ..() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + transform = turn(transform, rand(0, 360)) + +/obj/item/trash/spentcasing/shotgun + name = "spent buckshot shell" + desc = "A spent shotgun shell. It smells like cordite." + icon_state = "gshell" + +/obj/item/trash/spentcasing/shotgun/rubbershot + name = "spent rubbershot shell" + desc = "A spent shotgun shell. It smells like cordite and singed rubber." + icon_state = "cshell" + +/obj/item/trash/spentcasing/shotgun/beanbag + name = "spent beanbag shell" + icon_state = "bshell" + +/obj/item/trash/spentcasing/shotgun/slug + name = "spent slug shell" + icon_state = "blshell" + +/obj/item/trash/spentcasing/shotgun/dragonsbreath + name = "spent dragonsbreath shell" + desc = "A spent shotgun shell. It smells like cordite, burnt plastic, and a hint of petroleum." + icon_state = "ishell" + +/obj/item/trash/spentcasing/shotgun/stun + name = "spent stun shell" + icon_state = "stunshell" + +/obj/item/trash/spentcasing/bullet + name = "spent bullet casing" + desc = "A spent bullet casing. It smells of brass and cordite." + icon_state = "s-casing" + +/obj/item/trash/spentcasing/bullet/medium + name = "spent large bullet casing" + desc = "A spent high-caliber bullet casing. It smells of brass and cordite." + icon_state = "762-casing" + +/obj/item/trash/spentcasing/bullet/large + name = "spent .50 BMG bullet casing" + desc = "A spent .50 BMG bullet casing. It smells of brass and cordite." + icon_state = ".50" + +/obj/item/trash/spentcasing/bullet/lasershot + desc = "A spent IK-series single-use lasershot cell. It smells of burnt plastic with a metallic-chemical undertone." + icon_state = "lasercasing" diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 5e5a6e874050..741357eb01c1 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -13,7 +13,7 @@ w_class = WEIGHT_CLASS_TINY var/associated_account_number = 0 - var/list/files = list( ) + var/list/files = list() /obj/item/card/proc/get_card_account() return GLOB.station_money_database.find_user_account(associated_account_number) @@ -1191,3 +1191,7 @@ return "Thunderdome Green" else return capitalize(skin) + +/proc/GetNameAndAssignmentFromId(obj/item/card/id/I) + // Format currently matches that of newscaster feeds: Registered Name (Assigned Rank) + return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name diff --git a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm index 9ec74e6b2f2d..ae1300409363 100644 --- a/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm +++ b/code/game/objects/items/weapons/chemical_flamethrower/chemical_flamethrower.dm @@ -39,7 +39,7 @@ if(should_start_with_canisters && !length(canisters)) canisters += new /obj/item/chemical_canister update_canister_stats() - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/chemical_flamethrower/Destroy() QDEL_LIST_CONTENTS(canisters) diff --git a/code/game/objects/items/weapons/melee/melee_misc.dm b/code/game/objects/items/weapons/melee/melee_misc.dm index c374a870e6b2..99c3652f28e3 100644 --- a/code/game/objects/items/weapons/melee/melee_misc.dm +++ b/code/game/objects/items/weapons/melee/melee_misc.dm @@ -174,11 +174,11 @@ /obj/item/melee/breach_cleaver/proc/wield(obj/item/source, mob/living/carbon/human/user) to_chat(user, "You heave [src] up in both hands.") user.apply_status_effect(STATUS_EFFECT_BREACH_AND_CLEAVE) - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/melee/breach_cleaver/proc/unwield(obj/item/source, mob/living/carbon/human/user) user.remove_status_effect(STATUS_EFFECT_BREACH_AND_CLEAVE) - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/melee/breach_cleaver/attack_obj(obj/O, mob/living/user, params) if(!HAS_TRAIT(src, TRAIT_WIELDED)) // Only works good when wielded diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 8e5496d61cf1..fadff4057acd 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -431,7 +431,7 @@ slowdown = 1 if(antidrop_on_zip) flags ^= NODROP - update_icon_state(UPDATE_ICON_STATE) + update_icon(UPDATE_ICON_STATE) return slowdown = 0 @@ -440,7 +440,7 @@ container.hide_from_all() // Hide everything inside the bag too if(antidrop_on_zip) flags |= NODROP - update_icon_state(UPDATE_ICON_STATE) + update_icon(UPDATE_ICON_STATE) /obj/item/storage/backpack/duffel/update_icon_state() . = ..() @@ -910,30 +910,30 @@ //Commander /obj/item/storage/backpack/ert/commander name = "emergency response team commander backpack" - desc = "A spacious backpack with lots of pockets, worn by the commander of a Nanotrasen Emergency Response Team." + desc = "A spacious blue-striped combat backpack with plenty of easily-accessible pockets." //Security /obj/item/storage/backpack/ert/security name = "emergency response team security backpack" - desc = "A spacious backpack with lots of pockets, worn by security members of a Nanotrasen Emergency Response Team." + desc = "A spacious red-striped combat backpack with plenty of easily-accessible pockets." icon_state = "ert_security" //Engineering /obj/item/storage/backpack/ert/engineer name = "emergency response team engineer backpack" - desc = "A spacious backpack with lots of pockets, worn by engineering members of a Nanotrasen Emergency Response Team." + desc = "A spacious orange-striped combat backpack with plenty of easily-accessible pockets." icon_state = "ert_engineering" //Medical /obj/item/storage/backpack/ert/medical name = "emergency response team medical backpack" - desc = "A spacious backpack with lots of pockets, worn by medical members of a Nanotrasen Emergency Response Team." + desc = "A spacious white-striped combat backpack with plenty of easily-accessible pockets." icon_state = "ert_medical" //Janitorial /obj/item/storage/backpack/ert/janitor name = "emergency response team janitor backpack" - desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team." + desc = "A spacious purple-striped combat backpack with plenty of easily-accessible pockets." icon_state = "ert_janitor" //Solgov @@ -944,6 +944,6 @@ /obj/item/storage/backpack/ert/deathsquad name = "Deathsquad backpack" - desc = "A spacious backpack with lots of pockets, worn by those working in Special Operations." + desc = "A spacious red & black combat rucksack made of lightweight nanomesh. Likely the most intimidating backpack one will ever see." icon_state = "ert_security" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index bfb2ad7f8690..e58bb74b023d 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -568,7 +568,7 @@ /obj/item/storage/belt/lazarus name = "trainer's belt" desc = "For the mining master, holds your lazarus capsules." - icon_state = "lazarusbelt" + icon_state = "lazarusbelt_0" item_state = "lazbelt" w_class = WEIGHT_CLASS_BULKY max_w_class = WEIGHT_CLASS_TINY @@ -582,7 +582,7 @@ update_icon() /obj/item/storage/belt/lazarus/update_icon_state() - icon_state = "[initial(icon_state)]_[length(contents)]" + icon_state = "lazarusbelt_[length(contents)]" /obj/item/storage/belt/lazarus/attackby(obj/item/I, mob/user) var/amount = length(contents) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 31e29968b4d0..cb423ae1cad2 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -320,6 +320,8 @@ desc = "A full set of labelled components for assembling an R&D setup with. There are wordless picrographs of how to assemble everything on the back." /obj/item/storage/box/large/rnd_parts/populate_contents() + new /obj/item/circuitboard/rnd_network_controller(src) + new /obj/item/circuitboard/rdserver(src) new /obj/item/circuitboard/rdconsole(src) new /obj/item/circuitboard/protolathe(src) new /obj/item/circuitboard/destructive_analyzer(src) @@ -332,6 +334,7 @@ new /obj/item/stock_parts/matter_bin(src) new /obj/item/stock_parts/matter_bin(src) new /obj/item/stock_parts/scanning_module(src) + new /obj/item/stock_parts/scanning_module(src) new /obj/item/stock_parts/micro_laser(src) new /obj/item/reagent_containers/glass/beaker(src) new /obj/item/reagent_containers/glass/beaker(src) @@ -340,6 +343,7 @@ new /obj/item/stack/sheet/glass/fifty(src) new /obj/item/stack/sheet/metal/fifty(src) new /obj/item/stack/cable_coil(src) + new /obj/item/stack/cable_coil(src) /obj/item/storage/box/large/glowstick/emergency name = "emergency glowstick box" @@ -699,77 +703,83 @@ //////////////// /* Ammo Boxes */ //////////////// -/obj/item/storage/box/slug - name = "ammunition box (Slug)" + +/obj/item/storage/fancy/shell + icon = 'icons/obj/shell_boxes.dmi' + storage_slots = 8 + appearance_flags = parent_type::appearance_flags | KEEP_TOGETHER + can_hold = list(/obj/item/ammo_casing/shotgun) + /// What shell do we fill the box with + var/shell_type + +/obj/item/storage/fancy/shell/update_icon_state() + icon_state = "open" + +/obj/item/storage/fancy/shell/populate_contents() + if(!shell_type) + return + for(var/i in 1 to storage_slots) + new shell_type(src) + +/obj/item/storage/fancy/shell/update_overlays() + . = ..() + var/list/cached_contents = contents + for(var/index in 1 to length(cached_contents)) + var/obj/shell = cached_contents[index] + var/image/I = image(icon, src, initial(shell.icon_state)) + I.pixel_x = 3 * (round((index - 1) / 2)) + I.pixel_y = -4 * ((index + 1) % 2) + . += I + + . += "shell_box_front" // need to add another overlay to prevent from other overlays from showing on top + +/obj/item/storage/fancy/shell/tranquilizer + name = "ammunition box (Tranquilizer darts)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "slug_box" + icon_state = "tranqbox" + shell_type = /obj/item/ammo_casing/shotgun/tranquilizer -/obj/item/storage/box/slug/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun(src) +/obj/item/storage/fancy/shell/slug + name = "ammunition box (Slug)" + desc = "A small box capable of holding seven shotgun shells." + icon_state = "slugbox" + shell_type = /obj/item/ammo_casing/shotgun -/obj/item/storage/box/buck +/obj/item/storage/fancy/shell/buck name = "ammunition box (Buckshot)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "buckshot_box" + icon_state = "buckbox" + shell_type = /obj/item/ammo_casing/shotgun/buckshot -/obj/item/storage/box/buck/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/buckshot(src) - -/obj/item/storage/box/dragonsbreath +/obj/item/storage/fancy/shell/dragonsbreath name = "ammunition box (Dragonsbreath)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "dragonsbreath_box" + icon_state = "dragonsbox" + shell_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath -/obj/item/storage/box/dragonsbreath/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(src) - -/obj/item/storage/box/stun +/obj/item/storage/fancy/shell/stun name = "ammunition box (Stun shells)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "stun_box" + icon_state = "stunbox" + shell_type = /obj/item/ammo_casing/shotgun/stunslug -/obj/item/storage/box/stun/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/stunslug(src) - -/obj/item/storage/box/beanbag +/obj/item/storage/fancy/shell/beanbag name = "ammunition box (Beanbag shells)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "beanbag_box" - -/obj/item/storage/box/beanbag/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/beanbag(src) + icon_state = "beanbox" + shell_type = /obj/item/ammo_casing/shotgun/beanbag -/obj/item/storage/box/rubbershot +/obj/item/storage/fancy/shell/rubbershot name = "ammunition box (Rubbershot shells)" desc = "A small box capable of holding seven shotgun shells." - icon_state = "rubbershot_box" + icon_state = "rubberbox" + shell_type = /obj/item/ammo_casing/shotgun/rubbershot -/obj/item/storage/box/rubbershot/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/rubbershot(src) - -/obj/item/storage/box/tranquilizer - name = "ammunition box (Tranquilizer darts)" - desc = "A small box capable of holding seven shotgun shells." - icon_state = "tranq_box" - -/obj/item/storage/box/tranquilizer/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/tranquilizer(src) - -/obj/item/storage/box/holy +/obj/item/storage/fancy/shell/holy name = "ammunition box (Holy Water darts)" desc = "A small box capable of holding seven shotgun shells." icon_state = "hshell_box" - -/obj/item/storage/box/holy/populate_contents() - for(var/I in 1 to 7) - new /obj/item/ammo_casing/shotgun/holy(src) + shell_type = /obj/item/ammo_casing/shotgun/holy //////////////// /* Donk Boxes */ diff --git a/code/game/objects/items/weapons/storage/storage_base.dm b/code/game/objects/items/weapons/storage/storage_base.dm index 0789f3ff9dfe..9130e81e6f30 100644 --- a/code/game/objects/items/weapons/storage/storage_base.dm +++ b/code/game/objects/items/weapons/storage/storage_base.dm @@ -532,6 +532,7 @@ if(I.maptext) I.maptext = "" I.on_exit_storage(src) + I.mouse_opacity = initial(I.mouse_opacity) update_icon() return TRUE diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 748c7a1d54f1..e33a4d681fca 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -52,14 +52,14 @@ if(!current_location||!is_teleport_allowed(current_location.z))//If turf was not found or they're somewhere teleproof to_chat(user, "\The [src] is malfunctioning.") return - var/list/L = list( ) + var/list/L = list() for(var/obj/machinery/computer/teleporter/com in GLOB.machines) if(com.target) if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) L["[com.id] (Active)"] = com.target else L["[com.id] (Inactive)"] = com.target - var/list/turfs = list( ) + var/list/turfs = list() var/area/A for(var/turf/T in orange(10)) if(T.x>world.maxx-8 || T.x<8) diff --git a/code/game/objects/items/weapons/thurible.dm b/code/game/objects/items/weapons/thurible.dm index bf1feabf93d5..8c79b2cd0dcf 100644 --- a/code/game/objects/items/weapons/thurible.dm +++ b/code/game/objects/items/weapons/thurible.dm @@ -164,11 +164,11 @@ var/mob/living/carbon/C = A if(C.can_breathe_gas()) mobs_to_smoke += C + if(length(mobs_to_smoke)) + var/percentage_to_add = released_reagents.reagents.total_volume / length(mobs_to_smoke) // Divide the amount of reagents spread around by the number of people inhaling it - var/percentage_to_add = released_reagents.reagents.total_volume / length(mobs_to_smoke) // Divide the amount of reagents spread around by the number of people inhaling it - - for(var/mob/living/carbon/smoker as anything in mobs_to_smoke) - released_reagents.reagents.copy_to(smoker, percentage_to_add) + for(var/mob/living/carbon/smoker as anything in mobs_to_smoke) + released_reagents.reagents.copy_to(smoker, percentage_to_add) if(reagents.total_volume <= 0) put_out() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 6848767af43f..3d11a5dff23b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -34,10 +34,11 @@ var/emagged = FALSE // Access-related fields + + /// A list of accesses as defined by `code/__DEFINES/access_defines.dm`. All accesses are required when checking. var/list/req_access = null - var/req_access_txt = "0" + /// A list of accesses as defined by `code/__DEFINES/access_defines.dm`. At least one access is required when checking. var/list/req_one_access = null - var/req_one_access_txt = "0" /obj/Initialize(mapload) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm index 7a7c0986411e..4b077715daf6 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security_lockers.dm @@ -219,6 +219,7 @@ /obj/structure/closet/secure_closet/brig/populate_contents() new /obj/item/clothing/under/color/orange/prison(src) + new /obj/item/clothing/under/color/jumpskirt/orange/prison(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/card/id/prisoner/random(src) new /obj/item/radio/headset(src) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 04b8ab743c8b..cab056f24be0 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -12,6 +12,9 @@ new /obj/item/clothing/under/color/blue(src) new /obj/item/clothing/under/color/blue(src) new /obj/item/clothing/under/color/blue(src) + new /obj/item/clothing/under/color/jumpskirt/blue(src) + new /obj/item/clothing/under/color/jumpskirt/blue(src) + new /obj/item/clothing/under/color/jumpskirt/blue(src) new /obj/item/clothing/mask/bandana/blue(src) new /obj/item/clothing/mask/bandana/blue(src) new /obj/item/clothing/mask/bandana/blue(src) @@ -76,6 +79,9 @@ new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) new /obj/item/clothing/under/color/pink(src) + new /obj/item/clothing/under/color/jumpskirt/pink(src) + new /obj/item/clothing/under/color/jumpskirt/pink(src) + new /obj/item/clothing/under/color/jumpskirt/pink(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/brown(src) @@ -88,6 +94,9 @@ new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) new /obj/item/clothing/under/color/black(src) + new /obj/item/clothing/under/color/jumpskirt/black(src) + new /obj/item/clothing/under/color/jumpskirt/black(src) + new /obj/item/clothing/under/color/jumpskirt/black(src) if(prob(25)) new /obj/item/clothing/suit/jacket/leather(src) new /obj/item/clothing/shoes/black(src) @@ -108,6 +117,9 @@ new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/green(src) + new /obj/item/clothing/under/color/jumpskirt/green(src) + new /obj/item/clothing/under/color/jumpskirt/green(src) + new /obj/item/clothing/under/color/jumpskirt/green(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) @@ -137,6 +149,9 @@ new /obj/item/clothing/under/color/orange(src) new /obj/item/clothing/under/color/orange(src) new /obj/item/clothing/under/color/orange(src) + new /obj/item/clothing/under/color/jumpskirt/orange(src) + new /obj/item/clothing/under/color/jumpskirt/orange(src) + new /obj/item/clothing/under/color/jumpskirt/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) @@ -149,6 +164,9 @@ new /obj/item/clothing/under/color/orange/prison(src) new /obj/item/clothing/under/color/orange/prison(src) new /obj/item/clothing/under/color/orange/prison(src) + new /obj/item/clothing/under/color/jumpskirt/orange/prison(src) + new /obj/item/clothing/under/color/jumpskirt/orange/prison(src) + new /obj/item/clothing/under/color/jumpskirt/orange/prison(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) @@ -161,6 +179,9 @@ new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) new /obj/item/clothing/under/color/yellow(src) + new /obj/item/clothing/under/color/jumpskirt/yellow(src) + new /obj/item/clothing/under/color/jumpskirt/yellow(src) + new /obj/item/clothing/under/color/jumpskirt/yellow(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) new /obj/item/clothing/shoes/orange(src) @@ -219,6 +240,9 @@ new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) new /obj/item/clothing/under/color/white(src) + new /obj/item/clothing/under/color/jumpskirt/white(src) + new /obj/item/clothing/under/color/jumpskirt/white(src) + new /obj/item/clothing/under/color/jumpskirt/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) new /obj/item/clothing/shoes/white(src) @@ -400,6 +424,9 @@ new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) new /obj/item/clothing/under/color/grey(src) + new /obj/item/clothing/under/color/jumpskirt/grey(src) + new /obj/item/clothing/under/color/jumpskirt/grey(src) + new /obj/item/clothing/under/color/jumpskirt/grey(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) @@ -424,9 +451,11 @@ new /obj/item/clothing/under/color/green(src) new /obj/item/clothing/under/color/orange(src) new /obj/item/clothing/under/color/pink(src) - new /obj/item/clothing/under/dress/plaid_blue(src) - new /obj/item/clothing/under/dress/plaid_red(src) - new /obj/item/clothing/under/dress/plaid_purple(src) + new /obj/item/clothing/under/color/jumpskirt/blue(src) + new /obj/item/clothing/under/color/jumpskirt/yellow(src) + new /obj/item/clothing/under/color/jumpskirt/green(src) + new /obj/item/clothing/under/color/jumpskirt/orange(src) + new /obj/item/clothing/under/color/jumpskirt/pink(src) new /obj/item/clothing/shoes/blue(src) new /obj/item/clothing/shoes/yellow(src) new /obj/item/clothing/shoes/green(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 11409c535f17..b708793ac85b 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -38,7 +38,7 @@ if(showpiece_entry["trophy_message"]) trophy_message = showpiece_entry["trophy_message"] if(start_showpiece_type) - showpiece = new start_showpiece_type (src) + showpiece = new start_showpiece_type(src) update_icon(UPDATE_OVERLAYS) /obj/structure/displaycase/Destroy() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 6e3bcbd9171a..3511f2bb5e47 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -285,8 +285,7 @@ if(electronics) target.electronics = source.electronics source.electronics.forceMove(target) - target.update_icon(UPDATE_OVERLAYS) - target.update_name() + target.update_appearance(UPDATE_NAME|UPDATE_OVERLAYS) qdel(source) /obj/structure/door_assembly/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index dde36ebb6cee..de327bca7e24 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -243,6 +243,6 @@ blockage.max_integrity += 25 foam_level++ blockage.icon_state = "foamed_[foam_level]" - blockage.update_icon_state() + blockage.update_icon(UPDATE_ICON_STATE) #undef MAX_FOAM_LEVEL diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index bfc860d6bd5f..9836fb7343f4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -37,7 +37,7 @@ return flipped = !flipped - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/structure/transit_tube_construction/screwdriver_act(mob/living/user, obj/item/I) . = TRUE diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e625b8494cce..b90246baa5b5 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -776,6 +776,7 @@ glass_type = /obj/item/stack/sheet/plastitaniumglass smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_PLASTITANIUM_WALLS) canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS) + env_smash_level = ENVIRONMENT_SMASH_RWALLS //used in shuttles, same reason as above superconductivity = ZERO_HEAT_TRANSFER_COEFFICIENT /obj/structure/window/reinforced/clockwork diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 021c17091523..dce375016fde 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -2,7 +2,7 @@ GLOBAL_LIST_INIT(icons_to_ignore_at_floor_init, list("damaged1","damaged2","damaged3","damaged4", "damaged5","panelscorched","floorscorched1","floorscorched2","platingdmg1","platingdmg2", "platingdmg3","plating","light_on","warnplate", "warnplatecorner","metalfoam", "ironfoam", - "light_off","wall_thermite","grass1","grass2","grass3","grass4", + "light_off","grass1","grass2","grass3","grass4", "asteroid","asteroid_dug","asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", "asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12", "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "wood-broken", "carpet", diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index da4915de892b..5861ecf00f05 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -79,14 +79,15 @@ /turf/simulated/floor/plasteel/stairs icon_state = "stairs" + /turf/simulated/floor/plasteel/stairs/left icon_state = "stairs-l" + /turf/simulated/floor/plasteel/stairs/medium icon_state = "stairs-m" + /turf/simulated/floor/plasteel/stairs/right icon_state = "stairs-r" -/turf/simulated/floor/plasteel/stairs/old - icon_state = "stairs-old" /turf/simulated/floor/plasteel/grimy icon_state = "grimy" diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index e6d6844116ce..596dc3251eb4 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -139,7 +139,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons holder.rights = GLOB.admin_ranks[newrank] else holder = new /datum/admins(newrank,GLOB.admin_ranks[newrank],ckey) - remove_admin_verbs() + hide_verbs() holder.associate(src) /client/verb/changerights(newrights as num) @@ -147,7 +147,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons holder.rights = newrights else holder = new /datum/admins("testing",newrights,ckey) - remove_admin_verbs() + hide_verbs() holder.associate(src) #endif diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 1363484743c7..4b8b4c2288f2 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -209,7 +209,9 @@ set_pixel_offsets_from_dir(24, -24, 24, -24) GLOB.air_alarms += src - GLOB.air_alarms = sortAtom(GLOB.air_alarms) + + if(!mapload) + GLOB.air_alarms = sortAtom(GLOB.air_alarms) wires = new(src) diff --git a/code/modules/atmospherics/machinery/atmospherics.dm b/code/modules/atmospherics/machinery/atmospherics.dm index af620e41e27b..21f7103bab23 100644 --- a/code/modules/atmospherics/machinery/atmospherics.dm +++ b/code/modules/atmospherics/machinery/atmospherics.dm @@ -297,7 +297,7 @@ Pipelines + Other Objects -> Pipe network level = (T.intact || !can_be_undertile) ? 2 : 1 else level = 2 - update_icon_state() + update_icon(UPDATE_ICON_STATE) add_fingerprint(usr) if(!SSair.initialized) //If there's no atmos subsystem, we can't really initialize pipenets SSair.machinery_to_construct.Add(src) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm index 1690df3deffe..599c9c3f1a32 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm @@ -10,7 +10,7 @@ var/open = FALSE var/animating = FALSE - req_one_access_txt = "24;10" + req_one_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) /obj/machinery/atmospherics/binary/valve/examine(mob/user) . = ..() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 7826aed76402..ccefb2f7f983 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -1,5 +1,7 @@ /datum/canister_icons - var/list/possiblemaincolor = list( //these lists contain the possible colors of a canister + // these lists contain the possible colors of a canister + + var/list/possiblemaincolor = list( list("name" = "\[N2O\]", "icon" = "redws"), list("name" = "\[N2\]", "icon" = "red"), list("name" = "\[O2\]", "icon" = "blue"), @@ -10,7 +12,8 @@ list("name" = "\[SPECIAL\]", "icon" = "whiters") ) - var/list/possibleseccolor = list( // no point in having the N2O and "whiters" ones in these lists + // no point in having the N2O and "whiters" ones in these lists + var/list/possibleseccolor = list( list("name" = "\[None\]", "icon" = "none"), list("name" = "\[N2\]", "icon" = "red-c"), list("name" = "\[O2\]", "icon" = "blue-c"), diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index b4a654396e73..198621034bf4 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -35,7 +35,15 @@ GLOBAL_DATUM_INIT(_preloader, /datum/dmm_suite/preloader, new()) if(lastchar == "/" || lastchar == "\\") log_debug("Attempted to load map template without filename (Attempted [tfile])") return - tfile = wrap_file2text(tfile) + + // use rustlib to read, parse, process, mapmanip etc + // this will "crash"/stacktrace on fail + tfile = mapmanip_read_dmm(fname) + // if rustlib for whatever reason fails and returns null + // try to load it the old dm way instead + if(!tfile) + tfile = wrap_file2text(fname) + if(!length(tfile)) throw EXCEPTION("Map path '[fname]' does not exist!") diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm index 4e2f23fe7bcb..bc1991d71532 100644 --- a/code/modules/awaymissions/mob_spawn.dm +++ b/code/modules/awaymissions/mob_spawn.dm @@ -4,11 +4,6 @@ // To do: Allow customizing the bodies appearance (they're all bald and white right now). -/// this mob spawn creates the corpse instantly -#define CORPSE_INSTANT 1 -/// this mob spawn creates the corpse during GAME_STATE_PLAYING -#define CORPSE_ROUNDSTART 2 - /obj/effect/mob_spawn name = "Unknown" density = TRUE @@ -672,50 +667,13 @@ ADD_TRAIT(H, TRAIT_NON_INFECTIOUS_ZOMBIE, ROUNDSTART_TRAIT) return ..() -////////Non-human spawners//////// - -/obj/effect/mob_spawn/mouse - name = "sleeper" - mob_name = "space mouse" - mob_type = /mob/living/simple_animal/mouse - death = FALSE - roundstart = FALSE - icon = 'icons/obj/cryogenic2.dmi' - icon_state = "sleeper" - flavour_text = "Squeak!" - -/obj/effect/mob_spawn/cow - name = "sleeper" - mob_name = "space cow" - mob_type = /mob/living/simple_animal/cow - death = FALSE - roundstart = FALSE - mob_gender = FEMALE - icon = 'icons/obj/cryogenic2.dmi' - icon_state = "sleeper" - flavour_text = "Moo!" - /// these mob spawn subtypes trigger immediately (New or Initialize) and are not player controlled... since they're dead, you know? /obj/effect/mob_spawn/corpse - /// when this mob spawn should auto trigger. - var/spawn_when = CORPSE_INSTANT - /// what environmental storytelling script should this corpse have var/corpse_description = "" /// optionally different text to display if the target is a clown var/naive_corpse_description = "" -/obj/effect/mob_spawn/corpse/Initialize(mapload, no_spawn) - . = ..() - if(no_spawn) - return - switch(spawn_when) - if(CORPSE_INSTANT) - INVOKE_ASYNC(src, PROC_REF(create)) - if(CORPSE_ROUNDSTART) - if(mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)) - INVOKE_ASYNC(src, PROC_REF(create)) - /obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob) . = ..() spawned_mob.death(TRUE) @@ -737,7 +695,3 @@ icon = 'icons/mob/lavaland/lavaland_monsters.dmi' icon_state = "goliath_dead" pixel_x = -12 - - -#undef CORPSE_INSTANT -#undef CORPSE_ROUNDSTART diff --git a/code/modules/client/preference/link_processing.dm b/code/modules/client/preference/link_processing.dm index 99966235522f..b75a04e59c5b 100644 --- a/code/modules/client/preference/link_processing.dm +++ b/code/modules/client/preference/link_processing.dm @@ -322,7 +322,7 @@ active_character.metadata = new_metadata if("b_type") - var/new_b_type = tgui_input_list(user, "Choose your character's blood-type", "Character Preference", list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")) + var/new_b_type = tgui_input_list(user, "Choose your character's blood-type", "Character Preference", list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")) if(!new_b_type) return active_character.b_type = new_b_type diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm index 547f443981e9..97fdfaad69d2 100644 --- a/code/modules/client/preference/loadout/loadout_uniform.dm +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -102,6 +102,86 @@ display_name = "Jumpsuit, darkred" path = /obj/item/clothing/under/color/darkred +/datum/gear/uniform/suit/jumpskirtblack + display_name = "Jumpskirt, black" + path = /obj/item/clothing/under/color/jumpskirt/black + +/datum/gear/uniform/suit/jumpskirtblue + display_name = "Jumpskirt, blue" + path = /obj/item/clothing/under/color/jumpskirt/blue + +/datum/gear/uniform/suit/jumpskirtgreen + display_name = "Jumpskirt, green" + path = /obj/item/clothing/under/color/jumpskirt/green + +/datum/gear/uniform/suit/jumpskirtgrey + display_name = "Jumpskirt, grey" + path = /obj/item/clothing/under/color/jumpskirt/grey + +/datum/gear/uniform/suit/jumpskirtorange + display_name = "Jumpskirt, orange" + path = /obj/item/clothing/under/color/jumpskirt/orange + +/datum/gear/uniform/suit/jumpskirtpink + display_name = "Jumpskirt, pink" + path = /obj/item/clothing/under/color/jumpskirt/pink + +/datum/gear/uniform/suit/jumpskirtred + display_name = "Jumpskirt, red" + path = /obj/item/clothing/under/color/jumpskirt/red + +/datum/gear/uniform/suit/jumpskirtwhite + display_name = "Jumpskirt, white" + path = /obj/item/clothing/under/color/jumpskirt/white + +/datum/gear/uniform/suit/jumpskirtyellow + display_name = "Jumpskirt, yellow" + path = /obj/item/clothing/under/color/jumpskirt/yellow + +/datum/gear/uniform/suit/jumpskirtlightblue + display_name = "Jumpskirt, lightblue" + path = /obj/item/clothing/under/color/jumpskirt/lightblue + +/datum/gear/uniform/suit/jumpskirtaqua + display_name = "Jumpskirt, aqua" + path = /obj/item/clothing/under/color/jumpskirt/aqua + +/datum/gear/uniform/suit/jumpskirtpurple + display_name = "Jumpskirt, purple" + path = /obj/item/clothing/under/color/jumpskirt/purple + +/datum/gear/uniform/suit/jumpskirtlightpurple + display_name = "Jumpskirt, lightpurple" + path = /obj/item/clothing/under/color/jumpskirt/lightpurple + +/datum/gear/uniform/suit/jumpskirtlightgreen + display_name = "Jumpskirt, lightgreen" + path = /obj/item/clothing/under/color/jumpskirt/lightgreen + +/datum/gear/uniform/suit/jumpskirtlightbrown + display_name = "Jumpskirt, lightbrown" + path = /obj/item/clothing/under/color/jumpskirt/lightbrown + +/datum/gear/uniform/suit/jumpskirtbrown + display_name = "Jumpskirt, brown" + path = /obj/item/clothing/under/color/jumpskirt/brown + +/datum/gear/uniform/suit/jumpskirtyellowgreen + display_name = "Jumpskirt, yellowgreen" + path = /obj/item/clothing/under/color/jumpskirt/yellowgreen + +/datum/gear/uniform/suit/jumpskirtdarkblue + display_name = "Jumpskirt, darkblue" + path = /obj/item/clothing/under/color/jumpskirt/darkblue + +/datum/gear/uniform/suit/jumpskirtlightred + display_name = "Jumpskirt, lightred" + path = /obj/item/clothing/under/color/jumpskirt/lightred + +/datum/gear/uniform/suit/jumpskirtdarkred + display_name = "Jumpskirt, darkred" + path = /obj/item/clothing/under/color/jumpskirt/darkred + /datum/gear/uniform/suit/soviet display_name = "Old USSP uniform" path = /obj/item/clothing/under/costume/soviet diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 45983167d45f..88c8c8ee463e 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1,4 +1,5 @@ -GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts to play these roles +/// Minimum age (in days) for accounts to play these roles. +GLOBAL_LIST_INIT(special_role_times, list( ROLE_PAI = 0, ROLE_GUARDIAN = 0, ROLE_TRAITOR = 7, diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 9733856a3c3d..b2b560a4b7a1 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -281,7 +281,8 @@ sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/gloves.dmi', - "Drask" = 'icons/mob/clothing/species/drask/gloves.dmi' + "Drask" = 'icons/mob/clothing/species/drask/gloves.dmi', + "Kidan" = 'icons/mob/clothing/species/kidan/gloves.dmi' ) // Called just before an attack_hand(), in mob/UnarmedAttack() @@ -398,11 +399,153 @@ var/vision_flags = 0 var/see_in_dark = 0 var/lighting_alpha + /// the head clothing that this item may be attached to. + var/obj/item/clothing/under/has_under = null + /// the attached hats to this hat. + var/list/attached_hats = list() + /// if this hat can have hats placed on top of it. + var/can_have_hats = FALSE + /// if this hat can be a hat of a hat. Hat^2 + var/can_be_hat = TRUE /obj/item/clothing/head/update_icon_state() if(..()) item_state = "[replacetext("[item_state]", "_up", "")][up ? "_up" : ""]" +/obj/item/clothing/head/AltShiftClick(mob/user) + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user)) + return + if(!length(attached_hats)) + return + var/obj/item/clothing/head/hat + if(length(attached_hats) > 1) + var/pick = radial_menu_helper(usr, src, attached_hats, custom_check = FALSE, require_near = TRUE) + if(!pick || !istype(pick, /obj/item/clothing/head) || !Adjacent(usr)) + return + hat = pick + else + hat = attached_hats[1] + remove_hat(user, hat) + +/obj/item/clothing/head/Destroy() + if(is_equipped()) + var/mob/M = loc + for(var/obj/item/clothing/head/H as anything in attached_hats) + H.on_removed(M) + else + for(var/obj/item/clothing/head/H as anything in attached_hats) + H.forceMove(get_turf(src)) + attached_hats = null + return ..() + +/obj/item/clothing/head/dropped(mob/user, silent) + ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.get_item_by_slot(SLOT_HUD_HEAD) == src) + for(var/obj/item/clothing/head/hat as anything in attached_hats) + hat.attached_unequip() + +/obj/item/clothing/head/examine(mob/user) + . = ..() + for(var/obj/item/clothing/head/hat as anything in attached_hats) + . += "\A [hat] is placed neatly on top." + +//when user attached a hat to H (another hat) +/obj/item/clothing/head/proc/on_attached(obj/item/clothing/head/H, mob/user as mob) + if(!istype(H)) + return + has_under = H + forceMove(has_under) + has_under.overlays += item_state + has_under.actions += actions + + for(var/datum/action/A in actions) + if(has_under.is_equipped()) + var/mob/M = has_under.loc + A.Grant(M) + + if(user) + to_chat(user, "You attach [src] to [has_under].") + add_fingerprint(user) + +/obj/item/clothing/head/proc/on_removed(mob/user) + if(!has_under) + return + has_under.overlays -= icon_state + has_under.actions -= actions + + for(var/datum/action/A in actions) + if(ismob(has_under.loc)) + var/mob/M = has_under.loc + A.Remove(M) + + has_under = null + if(user) + user.put_in_hands(src) + add_fingerprint(user) + +/obj/item/clothing/head/proc/detach_hat(obj/item/clothing/head/hat, mob/user) + attached_hats -= hat + hat.on_removed(user) + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_head() + +/obj/item/clothing/head/proc/remove_hat(mob/user, obj/item/clothing/head/hat) + if(!(hat in attached_hats)) + return + if(!isliving(user)) + return + if(user.incapacitated()) + return + if(!Adjacent(user)) + return + detach_hat(hat, user) + to_chat(user, "You remove [hat] from [src].") + +/obj/item/clothing/head/proc/attached_unequip(mob/user) // If we need to do something special when clothing is removed from the user + return + +/obj/item/clothing/head/proc/attached_equip(mob/user) // If we need to do something special when clothing is removed from the user + return + +/* + * # can_attach_hat + * + * Arguments: + * * Hat - The clothing/head object being checked. MUST BE TYPE /obj/item/clothing/head +*/ +/obj/item/clothing/head/proc/can_attach_hat(obj/item/clothing/head/hat) + return length(attached_hats) < 1 && can_have_hats && hat.can_be_hat // this hat already has a hat or cannot be a hat of a hat! + +/obj/item/clothing/head/proc/attach_hat(obj/item/clothing/head/hat, mob/user, unequip = FALSE) + if(can_attach_hat(hat)) + if(unequip && !user.unEquip(hat)) // Make absolutely sure this hat is removed from hands + return FALSE + + attached_hats += hat + hat.on_attached(src, user) + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_head() + + return TRUE + else if(hat.has_under) + return FALSE + else + to_chat(user, "You cannot place [hat] ontop of [src].") + + return FALSE + +/obj/item/clothing/head/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clothing/head) && can_have_hats) + attach_hat(I, user, TRUE) + + return ..() + ////////////////////////////// // MARK: MASK ////////////////////////////// diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f63c0f0c727a..b24eff63868a 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -296,35 +296,35 @@ //Commander /obj/item/clothing/head/helmet/ert/command name = "emergency response team commander helmet" - desc = "An in-atmosphere helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights." + desc = "A mid-quality combat helmet produced by Citadel Armories. The visor is made of toughened plastic and the radio antenna is entirely decorative. This one has chipped blue Command stripes." icon_state = "erthelmet_cmd" //Security /obj/item/clothing/head/helmet/ert/security name = "emergency response team security helmet" - desc = "An in-atmosphere helmet worn by security members of the Nanotrasen Emergency Response Team. Has red highlights." + desc = "A mid-quality combat helmet produced by Citadel Armories. The visor is made of toughened plastic and the radio antenna is entirely decorative. This one has chipped red Security stripes." icon_state = "erthelmet_sec" /obj/item/clothing/head/helmet/ert/security/paranormal name = "paranormal emergency response team helmet" - desc = "An in-atmosphere helmet worn by paranormal members of the Nanotrasen Emergency Response Team. Has crusader sigils." + desc = "An antique steel helmet that looks straight out of a poorly-funded documentary about the Crusades. Where the hell did they even find this?" icon_state = "knight_templar" item_state = "knight_templar" //Engineer /obj/item/clothing/head/helmet/ert/engineer name = "emergency response team engineer helmet" - desc = "An in-atmosphere helmet worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights." + desc = "A mid-quality combat helmet produced by Citadel Armories. The visor is made of toughened plastic and the radio antenna is entirely decorative. This one has chipped orange Engineering stripes." icon_state = "erthelmet_eng" //Medical /obj/item/clothing/head/helmet/ert/medical name = "emergency response team medical helmet" - desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights." + desc = "A mid-quality combat helmet produced by Citadel Armories. The visor is made of toughened plastic and the radio antenna is entirely decorative. This one has chipped white Medical stripes." icon_state = "erthelmet_med" //Janitorial /obj/item/clothing/head/helmet/ert/janitor name = "emergency response team janitor helmet" - desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights." + desc = "A mid-quality combat helmet produced by Citadel Armories. The visor is made of toughened plastic and the radio antenna is entirely decorative. This one has chipped purple Janitorial stripes." icon_state = "erthelmet_jan" diff --git a/code/modules/clothing/head/misc_hats.dm b/code/modules/clothing/head/misc_hats.dm index 304a6c092f07..bc9ea7066eec 100644 --- a/code/modules/clothing/head/misc_hats.dm +++ b/code/modules/clothing/head/misc_hats.dm @@ -536,6 +536,7 @@ icon_state = "crown" armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 10, BOMB = 0, RAD = 0, FIRE = INFINITY, ACID = 50) resistance_flags = FIRE_PROOF + can_be_hat = FALSE /obj/item/clothing/head/crown/fancy name = "magnificent crown" diff --git a/code/modules/clothing/spacesuits/ert_hardsuits.dm b/code/modules/clothing/spacesuits/ert_hardsuits.dm index d14f22f8238e..84961e9cd940 100644 --- a/code/modules/clothing/spacesuits/ert_hardsuits.dm +++ b/code/modules/clothing/spacesuits/ert_hardsuits.dm @@ -1,7 +1,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/ert name = "emergency response team helmet" - desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility." icon_state = "hardsuit0-ert_commander" item_state = "helm-command" item_color = "ert_commander" @@ -53,7 +53,7 @@ /obj/item/clothing/suit/space/hardsuit/ert name = "emergency response team suit" - desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant." icon_state = "ert_commander" item_state = "suit-command" w_class = WEIGHT_CLASS_NORMAL @@ -76,14 +76,14 @@ //Commander /obj/item/clothing/head/helmet/space/hardsuit/ert/commander name = "emergency response team commander helmet" - desc = "A helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility. This one has blue Command stripes." icon_state = "hardsuit0-ert_commander" item_state = "helm-command" item_color = "ert_commander" /obj/item/clothing/suit/space/hardsuit/ert/commander name = "emergency response team commander suit" - desc = "A suit worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant. This one is covered in blue Command livery." icon_state = "ert_commander" item_state = "suit-command" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/commander @@ -91,14 +91,14 @@ //Security /obj/item/clothing/head/helmet/space/hardsuit/ert/security name = "emergency response team security helmet" - desc = "A helmet worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility. This one has red Security stripes." icon_state = "hardsuit0-ert_security" item_state = "syndicate-helm-black-red" item_color = "ert_security" /obj/item/clothing/suit/space/hardsuit/ert/security name = "emergency response team security suit" - desc = "A suit worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured, space ready, and fire resistant." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant. This one is covered in red Security livery." icon_state = "ert_security" item_state = "syndicate-black-red" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/security @@ -111,7 +111,7 @@ //Engineer /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer name = "emergency response team engineer helmet" - desc = "A helmet worn by engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility. This one has orange Engineering stripes, and additional lead plating for improved radiation protection." armor = list(MELEE = 40, BULLET = 15, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 150, FIRE = 200, ACID = 200) icon_state = "hardsuit0-ert_engineer" item_state = "helm-orange" @@ -127,7 +127,7 @@ /obj/item/clothing/suit/space/hardsuit/ert/engineer name = "emergency response team engineer suit" - desc = "A suit worn by the engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured, space ready, and fire resistant." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant. This one is covered in orange Engineering livery, and has additional lead inserts for added radiation protection." icon_state = "ert_engineer" item_state = "suit-orange" armor = list(MELEE = 40, BULLET = 15, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 150, FIRE = 200, ACID = 200) @@ -145,13 +145,13 @@ //Medical /obj/item/clothing/head/helmet/space/hardsuit/ert/medical name = "emergency response team medical helmet" - desc = "A helmet worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility. This one's got white Medical stripes." icon_state = "hardsuit0-ert_medical" item_color = "ert_medical" /obj/item/clothing/suit/space/hardsuit/ert/medical name = "emergency response team medical suit" - desc = "A suit worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant. This one is covered in white Medical livery." icon_state = "ert_medical" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/medical @@ -163,20 +163,20 @@ //Janitor /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor name = "emergency response team janitor helmet" - desc = "A helmet worn by janitorial members of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured and space ready." + desc = "An environmentally sealed combat helmet with a wide plexiglass visor for maximum visibility. This one has purple Janitorial stripes." icon_state = "hardsuit0-ert_janitor" item_color = "ert_janitor" /obj/item/clothing/suit/space/hardsuit/ert/janitor name = "emergency response team janitor suit" - desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant." + desc = "A powered combat hardsuit produced by Citadel Armories. Decently armored, environmentally sealed, and fire-resistant. This one is covered in purple Janitorial livery." icon_state = "ert_janitor" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor //Paranormal /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal name = "paranormal response unit helmet" - desc = "A helmet worn by those who deal with paranormal threats for a living." + desc = "An environmentally-sealed combat helmet covered in runes and warding sigils. The internal HUD is fairly outdated, and has Latin as a selectable language." icon_state = "hardsuit0-ert_paranormal" item_color = "ert_paranormal" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -191,7 +191,7 @@ /obj/item/clothing/suit/space/hardsuit/ert/paranormal name = "paranormal response team suit" - desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats." + desc = "A specially designed combat hardsuit produced by Citadel Armories for engaging paranormal threats, this suit is inlaid with interlocking geometric warding sigils and uses a unique holy water liquid-cooling system." icon_state = "hardsuit-paranormal" max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 461f780e99d2..500a1f000a8f 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -23,6 +23,8 @@ icon = 'icons/obj/clothing/species/plasmaman/hats.dmi' species_restricted = list("Plasmaman") sprite_sheets = list("Plasmaman" = 'icons/mob/clothing/species/plasmaman/helmet.dmi') + can_have_hats = TRUE + can_be_hat = FALSE /obj/item/clothing/head/helmet/space/plasmaman/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/armor_suits.dm b/code/modules/clothing/suits/armor_suits.dm index 9a62ffdb512c..0ef37b03aa22 100644 --- a/code/modules/clothing/suits/armor_suits.dm +++ b/code/modules/clothing/suits/armor_suits.dm @@ -248,7 +248,8 @@ desc = "An old style captain tunic. Makes you look and feel like you're wearing a cardboard box with arm holes cut in it but looks like it would be great for a wedding... or a funeral." icon_state = "captain_white" - sprite_sheets = list( //Drask look fine in the regular human version + // Drask look fine in the regular human version + sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Kidan" = 'icons/mob/clothing/species/kidan/suit.dmi', @@ -753,7 +754,7 @@ //Non-hardsuit ERT armor. /obj/item/clothing/suit/armor/vest/ert name = "emergency response team armor" - desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests." icon_state = "ertarmor_cmd" item_state = "armor" armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 10, RAD = 0, FIRE = 50, ACID = 50) @@ -761,37 +762,37 @@ //Commander /obj/item/clothing/suit/armor/vest/ert/command name = "emergency response team commander armor" - desc = "A set of armor worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests. This one has chipped blue Command insignia on the shoulders." //Security /obj/item/clothing/suit/armor/vest/ert/security name = "emergency response team security armor" - desc = "A set of armor worn by security members of the Nanotrasen Emergency Response Team. Has red highlights." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests. This one has chipped red Security insignia on the shoulders." icon_state = "ertarmor_sec" - +//Paranormal /obj/item/clothing/suit/armor/vest/ert/security/paranormal name = "emergency response team paranormal armor" - desc = "A set of armor worn by paranormal members of the Nanotrasen Emergency Response Team. Has crusader sigils." + desc = "A full suit of medieval plate armor, kitted out in crusader colors. Where the hell did they even find this? There are chipped black insignia on the shoulders." icon_state = "knight_templar" item_state = "knight_templar" //Engineer /obj/item/clothing/suit/armor/vest/ert/engineer name = "emergency response team engineer armor" - desc = "A set of armor worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests. This one has chipped orange Engineering insignia on the shoulders." icon_state = "ertarmor_eng" //Medical /obj/item/clothing/suit/armor/vest/ert/medical name = "emergency response team medical armor" - desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests. This one has chipped white Medical insignia on the shoulders." icon_state = "ertarmor_med" //Janitorial /obj/item/clothing/suit/armor/vest/ert/janitor name = "emergency response team janitor armor" - desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights." + desc = "A mid-quality protective vest produced by Citadel Armories. Additional polymer paneling over the chest and shoulders offers moderately improved energy protection compared to standard kevlar vests. This one has chipped purple Janitorial insignia on the shoulders." icon_state = "ertarmor_jan" //same defense as basic sec armor diff --git a/code/modules/clothing/suits/misc_suits.dm b/code/modules/clothing/suits/misc_suits.dm index 4c6a85d0d2c0..24590a05b18b 100644 --- a/code/modules/clothing/suits/misc_suits.dm +++ b/code/modules/clothing/suits/misc_suits.dm @@ -175,7 +175,7 @@ icon_state = "corgisuit" item_state = "chickensuit" body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET - flags_inv = HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEJUMPSUIT dog_fashion = /datum/dog_fashion/back /obj/item/clothing/suit/corgisuit/en diff --git a/code/modules/clothing/suits/suit_storage.dm b/code/modules/clothing/suits/suit_storage.dm index 2286470a59d3..b932d45d6933 100644 --- a/code/modules/clothing/suits/suit_storage.dm +++ b/code/modules/clothing/suits/suit_storage.dm @@ -62,7 +62,7 @@ /obj/item/clothing/suit/storage/proc/return_inv() - var/list/L = list( ) + var/list/L = list() L += src.contents diff --git a/code/modules/clothing/under/accessories/storage_accessories.dm b/code/modules/clothing/under/accessories/storage_accessories.dm index bf833ecf7cf5..d295056c5b8b 100644 --- a/code/modules/clothing/under/accessories/storage_accessories.dm +++ b/code/modules/clothing/under/accessories/storage_accessories.dm @@ -50,7 +50,7 @@ /obj/item/clothing/accessory/storage/proc/return_inv() - var/list/L = list( ) + var/list/L = list() L += src.contents diff --git a/code/modules/clothing/under/centcom.dm b/code/modules/clothing/under/centcom.dm index 420a29da7d1e..a84ad49065ef 100644 --- a/code/modules/clothing/under/centcom.dm +++ b/code/modules/clothing/under/centcom.dm @@ -28,8 +28,8 @@ random_sensor = FALSE /obj/item/clothing/under/rank/centcom/ert/chaplain - name = "response team inquisitor uniform" - desc = "An armoured uniform designed for emergency response teams. This one belongs to an inquisitor." + name = "response team chaplain uniform" + desc = "An armoured uniform designed for emergency response teams. This one belongs to a chaplain." icon_state = "ert_chaplain" item_state = "ert_chaplain" item_color = "ert_chaplain" diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index e5a6769e3084..56d82237590b 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -11,6 +11,11 @@ "Kidan" = 'icons/mob/clothing/species/kidan/under/color.dmi' ) +/obj/item/clothing/under/color/jumpskirt + desc = "A standard issue colored jumpskirt. Variety is the spice of life!" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + dyeing_key = DYE_REGISTRY_JUMPSKIRT + /obj/item/clothing/under/color/random/Initialize(mapload) . = ..() var/list/excluded = list(/obj/item/clothing/under/color/random, @@ -33,12 +38,25 @@ item_color = "black" resistance_flags = NONE +/obj/item/clothing/under/color/jumpskirt/black + name = "black jumpskirt" + icon_state = "blackjumpskirt" + item_state = "bl_suit" + item_color = "blackskirt" + resistance_flags = NONE // I am going to assume this is here for a reason + /obj/item/clothing/under/color/blue name = "blue jumpsuit" icon_state = "blue" item_state = "b_suit" item_color = "blue" +/obj/item/clothing/under/color/jumpskirt/blue + name = "blue jumpskirt" + icon_state = "bluejumpskirt" + item_state = "b_suit" + item_color = "blueskirt" + /obj/item/clothing/under/color/blue/dodgeball flags = NODROP @@ -48,6 +66,12 @@ item_state = "g_suit" item_color = "green" +/obj/item/clothing/under/color/jumpskirt/green + name = "green jumpskirt" + icon_state = "greenjumpskirt" + item_state = "g_suit" + item_color = "greenskirt" + /obj/item/clothing/under/color/grey name = "grey jumpsuit" desc = "A tasteful grey jumpsuit that reminds you of the good old days." @@ -58,6 +82,13 @@ /obj/item/clothing/under/color/grey/greytide flags = NODROP +/obj/item/clothing/under/color/jumpskirt/grey + name = "grey jumpskirt" + desc = "A tasteful grey jumpskirt that reminds you of the good old days." + icon_state = "greyjumpskirt" + item_state = "gy_suit" + item_color = "greyskirt" + /obj/item/clothing/under/color/grey/glorf name = "ancient jumpsuit" desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade." @@ -72,6 +103,13 @@ item_state = "o_suit" item_color = "orange" +/obj/item/clothing/under/color/jumpskirt/orange + name = "orange jumpskirt" + desc = "Don't wear this near paranoid security officers." + icon_state = "orangejumpskirt" + item_state = "o_suit" + item_color = "orangeskirt" + /obj/item/clothing/under/color/orange/prison name = "orange jumpsuit" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." @@ -81,6 +119,15 @@ has_sensor = 2 sensor_mode = SENSOR_COORDS +/obj/item/clothing/under/color/jumpskirt/orange/prison + name = "orange jumpskirt" + desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." + icon_state = "prisonerjumpskirt" + item_state = "prisoner" + item_color = "prisonerskirt" + has_sensor = 2 + sensor_mode = SENSOR_COORDS + /obj/item/clothing/under/color/pink name = "pink jumpsuit" desc = "Just looking at this makes you feel fabulous." @@ -88,12 +135,25 @@ item_state = "p_suit" item_color = "pink" +/obj/item/clothing/under/color/jumpskirt/pink + name = "pink jumpskirt" + desc = "Just looking at this makes you feel fabulous." + icon_state = "pinkjumpskirt" + item_state = "p_suit" + item_color = "pinkskirt" + /obj/item/clothing/under/color/red name = "red jumpsuit" icon_state = "red" item_state = "r_suit" item_color = "red" +/obj/item/clothing/under/color/jumpskirt/red + name = "red jumpskirt" + icon_state = "redjumpskirt" + item_state = "r_suit" + item_color = "redskirt" + /obj/item/clothing/under/color/red/dodgeball flags = NODROP @@ -103,12 +163,24 @@ item_state = "w_suit" item_color = "white" +/obj/item/clothing/under/color/jumpskirt/white + name = "white jumpskirt" + icon_state = "whitejumpskirt" + item_state = "w_suit" + item_color = "whiteskirt" + /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" icon_state = "yellow" item_state = "y_suit" item_color = "yellow" +/obj/item/clothing/under/color/jumpskirt/yellow + name = "yellow jumpskirt" + icon_state = "yellowjumpskirt" + item_state = "y_suit" + item_color = "yellowskirt" + /obj/item/clothing/under/color/psyche name = "psychedelic jumpsuit" desc = "Groovy!" @@ -120,17 +192,33 @@ icon_state = "lightblue" item_color = "lightblue" +/obj/item/clothing/under/color/jumpskirt/lightblue + name = "light blue jumpskirt" + icon_state = "lightbluejumpskirt" + item_color = "lightblueskirt" + /obj/item/clothing/under/color/aqua name = "aqua jumpsuit" icon_state = "aqua" item_color = "aqua" +/obj/item/clothing/under/color/jumpskirt/aqua + name = "aqua jumpskirt" + icon_state = "aquajumpskirt" + item_color = "aquaskirt" + /obj/item/clothing/under/color/purple name = "purple jumpsuit" icon_state = "purple" item_state = "p_suit" item_color = "purple" +/obj/item/clothing/under/color/jumpskirt/purple + name = "purple jumpskirt" + icon_state = "purplejumpskirt" + item_state = "p_suit" + item_color = "purpleskirt" + /// for jani ert /obj/item/clothing/under/color/purple/sensor sensor_mode = SENSOR_COORDS @@ -141,41 +229,81 @@ icon_state = "lightpurple" item_color = "lightpurple" +/obj/item/clothing/under/color/jumpskirt/lightpurple + name = "light purple jumpskirt" + icon_state = "lightpurplejumpskirt" + item_color = "lightpurpleskirt" + /obj/item/clothing/under/color/lightgreen name = "light green jumpsuit" icon_state = "lightgreen" item_color = "lightgreen" +/obj/item/clothing/under/color/jumpskirt/lightgreen + name = "light green jumpskirt" + icon_state = "lightgreenjumpskirt" + item_color = "lightgreenskirt" + /obj/item/clothing/under/color/lightbrown name = "light brown jumpsuit" icon_state = "lightbrown" item_color = "lightbrown" +/obj/item/clothing/under/color/jumpskirt/lightbrown + name = "light brown jumpskirt" + icon_state = "lightbrownjumpskirt" + item_color = "lightbrownskirt" + /obj/item/clothing/under/color/brown name = "brown jumpsuit" icon_state = "brown" item_color = "brown" +/obj/item/clothing/under/color/jumpskirt/brown + name = "brown jumpskirt" + icon_state = "brownjumpskirt" + item_color = "brownskirt" + /obj/item/clothing/under/color/yellowgreen name = "yellow green jumpsuit" icon_state = "yellowgreen" item_color = "yellowgreen" +/obj/item/clothing/under/color/jumpskirt/yellowgreen + name = "yellow green jumpskirt" + icon_state = "yellowgreenjumpskirt" + item_color = "yellowgreenskirt" + /obj/item/clothing/under/color/darkblue name = "dark blue jumpsuit" icon_state = "darkblue" item_color = "darkblue" +/obj/item/clothing/under/color/jumpskirt/darkblue + name = "dark blue jumpskirt" + icon_state = "darkbluejumpskirt" + item_color = "darkblueskirt" + /obj/item/clothing/under/color/lightred name = "light red jumpsuit" icon_state = "lightred" item_color = "lightred" +/obj/item/clothing/under/color/jumpskirt/lightred + name = "light red jumpskirt" + icon_state = "lightredjumpskirt" + item_color = "lightredskirt" + /obj/item/clothing/under/color/darkred name = "dark red jumpsuit" icon_state = "darkred" item_color = "darkred" +/obj/item/clothing/under/color/jumpskirt/darkred + name = "dark red jumpskirt" + icon_state = "darkredjumpskirt" + item_color = "darkredskirt" + /obj/item/clothing/under/color/rainbow name = "rainbow" desc = "rainbow" @@ -183,6 +311,13 @@ item_state = "rainbow" item_color = "rainbow" +/obj/item/clothing/under/color/jumpskirt/rainbow + name = "rainbow jumpskirt" + desc = "Rainbow." + icon_state = "rainbowjumpskirt" + item_state = "rainbow" + item_color = "rainbowskirt" + /obj/item/clothing/under/color/red/jersey name = "red team jersey" desc = "The jersey of the Nanotrasen Phi-ghters!" diff --git a/code/modules/clothing/under/costumes.dm b/code/modules/clothing/under/costumes.dm index 6593a1c96d64..8804b0d4d719 100644 --- a/code/modules/clothing/under/costumes.dm +++ b/code/modules/clothing/under/costumes.dm @@ -139,12 +139,13 @@ item_state = "psysuit" item_color = "psysuit" - sprite_sheets = list( //it is what it is + //it is what it is + sprite_sheets = list( "Human" = 'icons/mob/clothing/under/costumes.dmi', "Vox" = 'icons/mob/clothing/species/vox/under/costumes.dmi', "Drask" = 'icons/mob/clothing/species/drask/under/costumes.dmi', "Grey" = 'icons/mob/clothing/species/grey/under/costumes.dmi' - ) + ) /obj/item/clothing/under/costume/redcoat name = "redcoat uniform" diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 68845b5eca12..3cd99b4a1e1b 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -11,20 +11,26 @@ CAT_DECORATIONS, CAT_CLOTHING) var/list/subcategories = list( - list( //Weapon subcategories + //Weapon subcategories + list( CAT_WEAPON, - CAT_AMMO), + CAT_AMMO + ), CAT_NONE, //Robot subcategories CAT_NONE, //Misc subcategories CAT_NONE, //Tribal subcategories - list( //Food subcategories + // Food subcategories + list( CAT_CAKE, CAT_SUSHI, - CAT_SANDWICH), - list( //Decoration subcategories + CAT_SANDWICH + ), + // Decoration subcategories + list( CAT_DECORATION, CAT_HOLIDAY, - CAT_LARGE_DECORATIONS), + CAT_LARGE_DECORATIONS + ), CAT_CLOTHING) //Clothing subcategories var/display_craftable_only = FALSE var/display_compact = TRUE diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index fb79cb5c35b2..dabe63331564 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -41,4 +41,5 @@ spawncount-- successSpawn = TRUE - SSevents.biohazards_this_round += "Xenomorphs" + SSticker.record_biohazard_start(BIOHAZARD_XENO) + SSevents.biohazards_this_round += BIOHAZARD_XENO diff --git a/code/modules/events/blob_spawn.dm b/code/modules/events/blob_spawn.dm index 1fbc9a4a0b94..ec180703ab7b 100644 --- a/code/modules/events/blob_spawn.dm +++ b/code/modules/events/blob_spawn.dm @@ -39,4 +39,4 @@ to_chat(B, "For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Blob)") notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, action = NOTIFY_FOLLOW) successSpawn = TRUE - SSevents.biohazards_this_round += "Blob" + SSevents.biohazards_this_round += BIOHAZARD_BLOB diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm index 2b2c85cb5c1d..ead04dc76e98 100644 --- a/code/modules/events/spider_terror.dm +++ b/code/modules/events/spider_terror.dm @@ -66,6 +66,7 @@ S.give_intro_text() spawncount-- successSpawn = TRUE + SSticker.record_biohazard_start(infestation_type) SSevents.biohazards_this_round += infestation_type #undef TS_HIGHPOP_TRIGGER diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index c1b6dc49b046..4ef39f8aa2e5 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -630,7 +630,7 @@ /obj/machinery/smartfridge/secure/circuits/aiupload/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_AI_UPLOAD]" + req_access = list(ACCESS_AI_UPLOAD) if(mapload && HAS_TRAIT(SSstation, STATION_TRAIT_UNIQUE_AI) && is_station_level(z)) drop_contents_on_delete = FALSE return INITIALIZE_HINT_QDEL @@ -649,7 +649,7 @@ /obj/machinery/smartfridge/secure/circuits/aiupload/experimental/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_RD]" + req_access = list(ACCESS_RD) /obj/machinery/smartfridge/secure/circuits/aiupload/highrisk name = "\improper High-Risk Laws Storage" @@ -665,7 +665,7 @@ /obj/machinery/smartfridge/secure/circuits/aiupload/highrisk/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_CAPTAIN]" + req_access = list(ACCESS_CAPTAIN) /** * # Refrigerated Medicine Storage @@ -702,7 +702,7 @@ /obj/machinery/smartfridge/secure/extract/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_RESEARCH]" + req_access = list(ACCESS_RESEARCH) accepted_items_typecache = typecacheof(list( /obj/item/slime_extract )) @@ -716,7 +716,7 @@ name = "\improper Secure Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. - req_one_access_txt = "5;33" + req_one_access = list(ACCESS_MEDICAL, ACCESS_CHEMISTRY) board_type = /obj/machinery/smartfridge/secure/medbay /obj/machinery/smartfridge/secure/medbay/Initialize(mapload) @@ -744,7 +744,7 @@ /obj/machinery/smartfridge/secure/chemistry/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_CHEMISTRY]" + req_access = list(ACCESS_CHEMISTRY) // Accepted items accepted_items_typecache = typecacheof(list( /obj/item/storage/pill_bottle, @@ -774,10 +774,6 @@ * A [Smart Chemical Storage (Preloaded)][/obj/machinery/smartfridge/secure/chemistry/preloaded] but with exclusive access to Syndicate. */ /obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate - req_access_txt = null - -/obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate/Initialize(mapload) - . = ..() req_access = list(ACCESS_SYNDICATE) /** @@ -840,10 +836,10 @@ desc = "A refrigerated storage unit for volatile sample storage." board_type = /obj/machinery/smartfridge/secure/chemistry/virology icon_addon = "smartfridge_virology" + req_access = list(ACCESS_VIROLOGY) /obj/machinery/smartfridge/secure/chemistry/virology/Initialize(mapload) . = ..() - req_access_txt = "[ACCESS_VIROLOGY]" accepted_items_typecache = typecacheof(list( /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/glass/bottle, @@ -876,7 +872,7 @@ * A [Smart Virus Storage (Preloaded)][/obj/machinery/smartfridge/secure/chemistry/virology/preloaded] but with exclusive access to Syndicate. */ /obj/machinery/smartfridge/secure/chemistry/virology/preloaded/syndicate - req_access_txt = null + req_access = list(ACCESS_SYNDICATE) /obj/machinery/smartfridge/secure/chemistry/virology/preloaded/syndicate/Initialize(mapload) starting_items = list( @@ -889,7 +885,6 @@ /obj/item/reagent_containers/glass/bottle/reagent/formaldehyde = 1 ) . = ..() - req_access = list(ACCESS_SYNDICATE) /** * # Drink Showcase diff --git a/code/modules/hydroponics/compost_bin.dm b/code/modules/hydroponics/compost_bin.dm index 027b0d03f9ee..d42c6f74b956 100644 --- a/code/modules/hydroponics/compost_bin.dm +++ b/code/modules/hydroponics/compost_bin.dm @@ -96,7 +96,7 @@ to_chat(user, "You have very nearly saturated the contents of [src] with potassium.") SStgui.update_uis(src) - update_icon_state() + update_icon(UPDATE_ICON_STATE) return TRUE if(istype(O, /obj/item/food/grown)) @@ -110,7 +110,7 @@ make_biomass(O) to_chat(user, "You put [O] in [src].") SStgui.update_uis(src) - update_icon_state() + update_icon(UPDATE_ICON_STATE) return TRUE if(istype(O, /obj/item/reagent_containers)) var/proportion = 0 @@ -154,7 +154,7 @@ to_chat(user, "[src] has been nearly filled with potash.") SStgui.update_uis(src) - update_icon_state() + update_icon(UPDATE_ICON_STATE) return TRUE @@ -199,7 +199,7 @@ biomass -= conversion_amount + potash_saltpetre_conversion + potassium_saltpetre_conversion compost += conversion_amount - update_icon_state() + update_icon(UPDATE_ICON_STATE) SStgui.update_uis(src) // Makes soil from compost @@ -209,7 +209,7 @@ return new /obj/item/stack/sheet/soil(loc, amount) compost -= SOIL_COST * amount - update_icon_state() + update_icon(UPDATE_ICON_STATE) SStgui.update_uis(src) /obj/machinery/compost_bin/attack_hand(mob/user) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index fdbed68d1395..24521ccb0f85 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -451,7 +451,7 @@ else core_gene.value = min(core_gene.value, genemod_var) - disk.update_name() + disk.update_appearance(UPDATE_NAME) QDEL_NULL(seed) update_icon(UPDATE_OVERLAYS) update_genes() @@ -493,7 +493,7 @@ var/datum/plant_gene/core/C = gene.Copy() disk.core_genes += C - disk.update_name() + disk.update_appearance(UPDATE_NAME) QDEL_NULL(seed) update_icon(UPDATE_OVERLAYS) update_genes() diff --git a/code/modules/library/library_catalog.dm b/code/modules/library/library_catalog.dm index cabc94a9c3b1..7a1b39fe3135 100644 --- a/code/modules/library/library_catalog.dm +++ b/code/modules/library/library_catalog.dm @@ -452,7 +452,8 @@ var/list/flag_json = list() //Flagged book json is stored as such: "[[reporter_ckey1, report_id1],[reporter_ckey2, report_id2]]"" for(var/datum/flagged_book/book in reportedbook.reports) - flag_json += list(list( //yes this is intentional + //yes this is intentional + flag_json += list(list( book.reporter, book.category_id, )) diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index 54582614ccfa..6b6506c6fc28 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -5,29 +5,20 @@ // These are mutually exclusive; can't have req_any and req_all /obj/effect/mapping_helpers/airlock/access/any/payload(obj/machinery/door/airlock/airlock) - if(is_type_in_list(airlock, blacklist)) + if(length(airlock.req_access)) + log_world("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") return - if(airlock.req_access_txt == "0") - // Overwrite if there is no access set, otherwise add onto existing access - if(airlock.req_one_access_txt == "0") - airlock.req_one_access_txt = "[access]" - else - airlock.req_one_access_txt += ";[access]" - else - log_world("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") + LAZYINITLIST(airlock.req_one_access) + airlock.req_one_access |= access /obj/effect/mapping_helpers/airlock/access/all/payload(obj/machinery/door/airlock/airlock) - if(is_type_in_list(airlock, blacklist)) + if(length(airlock.req_one_access)) + log_world("[src] at [AREACOORD(src)] tried to set req_access, but req_one_access was already set!") return - if(airlock.req_one_access_txt == "0") - if(airlock.req_access_txt == "0") - airlock.req_access_txt = "[access]" - else - airlock.req_access_txt += ";[access]" - else - log_world("[src] at [AREACOORD(src)] tried to set req_access, but req_one_access was already set!") + LAZYINITLIST(airlock.req_access) + airlock.req_access |= access // -------------------- Req Any (Only requires ONE of the given accesses to open) // -------------------- Command access helpers @@ -467,3 +458,37 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mule_bot access = ACCESS_CARGO_BOT + +// Miscellaneous access helpers +/obj/effect/mapping_helpers/airlock/access/all/ruins/deepstorage + access = ACCESS_DEEPSTORAGE + +/obj/effect/mapping_helpers/airlock/access/all/ruins/moonoutpost19 + access = ACCESS_AWAY01 + +/obj/effect/mapping_helpers/airlock/access/all/ruins/theta + access = ACCESS_THETA_STATION + +/obj/effect/mapping_helpers/airlock/access/all/syndicate + access = ACCESS_SYNDICATE + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/general + access = ACCESS_CENT_GENERAL + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/security + access = ACCESS_CENT_SECURITY + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/shuttles + access = ACCESS_CENT_SHUTTLES + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/specops + access = ACCESS_CENT_SPECOPS + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/commander + access = ACCESS_CENT_COMMANDER + +/obj/effect/mapping_helpers/airlock/access/all/shuttles/vox + access = ACCESS_VOX + +/obj/effect/mapping_helpers/airlock/access/all/centcomm/traders + access = ACCESS_TRADE_SOL diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 784f6672c1c7..ce504e0e2f04 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -91,11 +91,17 @@ /obj/effect/mapping_helpers/airlock/LateInitialize() . = ..() - if(!(locate(/obj/machinery/door) in get_turf(src))) - log_world("[src] failed to find an airlock at [AREACOORD(src)]") + var/list/valid_airlocks = list() for(var/obj/machinery/door/D in get_turf(src)) - payload(D) + if(!is_type_in_list(D, blacklist)) + valid_airlocks += D + + if(length(valid_airlocks)) + for(var/obj/machinery/door/D in valid_airlocks) + payload(D) + else + log_world("[src] failed to find any valid airlocks at [AREACOORD(src)]") qdel(src) diff --git a/code/modules/mapping/windoor_access_helpers.dm b/code/modules/mapping/windoor_access_helpers.dm index 8d3195cf9cab..d193060c9a5f 100644 --- a/code/modules/mapping/windoor_access_helpers.dm +++ b/code/modules/mapping/windoor_access_helpers.dm @@ -11,30 +11,23 @@ return // Access already set in map edit - if(windoor.req_access_txt != "0") + if(length(windoor.req_access)) log_world("[src] at [AREACOORD(src)] tried to set req_one_access, but req_access was already set!") return - // Overwrite if there is no access set, otherwise add onto existing access - if(windoor.req_one_access_txt == "0") - windoor.req_one_access_txt = "[access]" - return - - windoor.req_one_access_txt += ";[access]" + LAZYINITLIST(windoor.req_one_access) + windoor.req_one_access |= access /obj/effect/mapping_helpers/airlock/windoor/access/all/payload(obj/machinery/door/window/windoor) if(windoor.dir != dir) return - if(windoor.req_one_access_txt != "0") + if(length(windoor.req_one_access)) log_world("[src] at [AREACOORD(src)] tried to set req_access, but req_one_access was already set!") return - if(windoor.req_access_txt == "0") - windoor.req_access_txt = "[access]" - return - - windoor.req_access_txt += ";[access]" + LAZYINITLIST(windoor.req_access) + windoor.req_access |= access // -------------------- Req Any (Only requires ONE of the given accesses to open) // -------------------- Command access helpers diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 83043998792e..6f7fccc38d53 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -373,7 +373,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/economy/vending/wallmed/survival_pod, /obj/item/stack/telecrystal/twenty, /obj/item/banhammer) -/obj/item/fakeartefact/New() +/obj/item/fakeartefact/Initialize(mapload) . = ..() var/obj/item/I = pick(possible) name = initial(I.name) @@ -381,3 +381,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/economy/vending/wallmed/survival_pod, desc = initial(I.desc) icon_state = initial(I.icon_state) item_state = initial(I.item_state) + lefthand_file = initial(I.lefthand_file) + righthand_file = initial(I.righthand_file) + slot_flags = initial(I.slot_flags) + w_class = initial(I.w_class) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index f476be923f9f..bc3a2f957d9a 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -154,7 +154,13 @@ var/list/cat_items = list() for(var/prize_name in prize_list[cat]) var/datum/data/mining_equipment/prize = prize_list[cat][prize_name] - cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost) + var/obj/item = prize.equipment_path + cat_items[prize_name] = list( + "name" = prize_name, + "price" = prize.cost, + "icon" = item.icon, + "icon_state" = item.icon_state + ) static_data["items"][cat] = cat_items return static_data diff --git a/code/modules/mob/living/brain/robotic_brain.dm b/code/modules/mob/living/brain/robotic_brain.dm index 0fd4dc8cdbc4..fbaa53320c67 100644 --- a/code/modules/mob/living/brain/robotic_brain.dm +++ b/code/modules/mob/living/brain/robotic_brain.dm @@ -16,7 +16,8 @@ var/requires_master = TRUE var/mob/living/carbon/human/imprinted_master = null var/ejected_flavor_text = "circuit" - + /// If this is a posibrain, which will reject attempting to put a new ghost in it, because this a real brain we care about, not a robobrain + var/can_be_reinhabited = TRUE dead_icon = "boris_blank" /obj/item/mmi/robotic_brain/Destroy() @@ -31,7 +32,7 @@ to_chat(user, "You press your thumb on [src] and imprint your user information.") imprinted_master = user return - if(brainmob && !brainmob.key && !searching) + if(brainmob && !brainmob.key && !searching && can_be_reinhabited) //Start the process of searching for a new user. to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.") request_player() @@ -93,7 +94,7 @@ become_occupied(occupied_icon) /obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - if(brainmob && brainmob.key) + if(brainmob && brainmob.key || !searching) return searching = FALSE @@ -104,6 +105,8 @@ /obj/item/mmi/robotic_brain/proc/volunteer(mob/dead/observer/user) if(!searching) return + if(brainmob && brainmob.key) + return // No, something is wrong, abort. if(!istype(user) && !HAS_TRAIT(user, TRAIT_RESPAWNABLE)) to_chat(user, "Seems you're not a ghost. Could you please file an exploit report on the forums?") return @@ -182,11 +185,11 @@ ..() /obj/item/mmi/robotic_brain/attack_ghost(mob/dead/observer/O) + if(brainmob && brainmob.key) + return // No point pinging a posibrain with a player already inside if(searching) volunteer(O) return - if(brainmob && brainmob.key) - return // No point pinging a posibrain with a player already inside if(validity_checks(O) && (world.time >= next_ping_at)) next_ping_at = world.time + (20 SECONDS) playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0) @@ -204,3 +207,4 @@ requires_master = FALSE ejected_flavor_text = "metal cube" dead_icon = "posibrain" + can_be_reinhabited = FALSE diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e1e610d7a32d..2c2f3d4d7417 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -840,3 +840,5 @@ emp_act /mob/living/carbon/human/projectile_hit_check(obj/item/projectile/P) return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density // hit mobs that are intentionally lying down to prevent combat crawling. +/mob/living/carbon/human/canBeHandcuffed() + return has_left_hand() || has_right_hand() diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 47f744999feb..52db0245ce1c 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -855,15 +855,24 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/mutable_appearance/standing if(head.sprite_sheets && head.sprite_sheets[dna.species.sprite_sheet_name]) standing = mutable_appearance(head.sprite_sheets[dna.species.sprite_sheet_name], "[head.icon_state]", layer = -HEAD_LAYER) - if(istype(head, /obj/item/clothing/head/helmet/space/plasmaman)) - var/obj/item/clothing/head/helmet/space/plasmaman/P = head - if(!P.up) - standing.overlays += P.visor_icon else if(head.icon_override) standing = mutable_appearance(head.icon_override, "[head.icon_state]", layer = -HEAD_LAYER) else standing = mutable_appearance('icons/mob/clothing/head.dmi', "[head.icon_state]", layer = -HEAD_LAYER) + if(istype(head, /obj/item/clothing/head/helmet/space/plasmaman)) + var/obj/item/clothing/head/helmet/space/plasmaman/P = head + if(!P.up) + standing.overlays += P.visor_icon + + if(istype(head, /obj/item/clothing/head)) + var/obj/item/clothing/head/w_hat = head + for(var/obj/item/clothing/head/hat in w_hat.attached_hats) + if(hat.sprite_sheets && hat.sprite_sheets[dna.species.sprite_sheet_name]) + standing.overlays += image("icon" = hat.sprite_sheets[dna.species.sprite_sheet_name], "icon_state" = "[hat.icon_state]") + else + standing.overlays += image("icon" = hat.icon_override, "icon_state" = "[hat.icon_state]") + if(head.blood_DNA) var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood") bloodsies.color = head.blood_color diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index 263b8f947df1..5cc343669642 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -159,16 +159,16 @@ //Defining lists of icon skin tones for species that have them. var/list/icon_skin_tones = list() - // Determines the organs that the species spawns with and - var/list/has_organ = list( // which required-organ checks are conducted. - "heart" = /obj/item/organ/internal/heart, - "lungs" = /obj/item/organ/internal/lungs, - "liver" = /obj/item/organ/internal/liver, - "kidneys" = /obj/item/organ/internal/kidneys, - "brain" = /obj/item/organ/internal/brain, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes - ) + /// Determines the organs that the species spawns with and which required-organ checks are conducted. + var/list/has_organ = list( + "heart" = /obj/item/organ/internal/heart, + "lungs" = /obj/item/organ/internal/lungs, + "liver" = /obj/item/organ/internal/liver, + "kidneys" = /obj/item/organ/internal/kidneys, + "brain" = /obj/item/organ/internal/brain, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes + ) var/vision_organ = /obj/item/organ/internal/eyes // If set, this organ is required for vision. var/list/has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest, "descriptor" = "chest"), diff --git a/code/modules/mob/living/carbon/human/species/human_species.dm b/code/modules/mob/living/carbon/human/species/human_species.dm index d6bf6d4f933a..ef5fa94650b4 100644 --- a/code/modules/mob/living/carbon/human/species/human_species.dm +++ b/code/modules/mob/living/carbon/human/species/human_species.dm @@ -14,7 +14,8 @@ With a constant desire to colonize and spread their influence onto other species, they have begun to develop alliances and enemies, \ making humans one of the most recognizable and socially diverse species in the sector." - icon_skin_tones = list( //Organized to be from Light to Dark. + /// Organized to be from Light to Dark. + icon_skin_tones = list( 1 = "Default White", 2 = "Pale", 3 = "Classic", @@ -28,7 +29,7 @@ 11 = "Caramel", 12 = "Coffee", 13 = "Chestnut" - ) + ) reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index bf00c89cb961..d0102489d666 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -121,15 +121,16 @@ species_traits = list(LIPS, NOT_SELECTABLE) inherent_traits = list(TRAIT_CHUNKYFINGERS) - has_organ = list( // same as unathi's organs, aside for the lungs as they need to be able to breathe on lavaland. - "heart" = /obj/item/organ/internal/heart/unathi, - "lungs" = /obj/item/organ/internal/lungs/unathi/ash_walker, - "liver" = /obj/item/organ/internal/liver/unathi, - "kidneys" = /obj/item/organ/internal/kidneys/unathi, - "brain" = /obj/item/organ/internal/brain/unathi, - "appendix" = /obj/item/organ/internal/appendix, - "eyes" = /obj/item/organ/internal/eyes/unathi - ) + // same as unathi's organs, aside for the lungs as they need to be able to breathe on lavaland. + has_organ = list( + "heart" = /obj/item/organ/internal/heart/unathi, + "lungs" = /obj/item/organ/internal/lungs/unathi/ash_walker, + "liver" = /obj/item/organ/internal/liver/unathi, + "kidneys" = /obj/item/organ/internal/kidneys/unathi, + "brain" = /obj/item/organ/internal/brain/unathi, + "appendix" = /obj/item/organ/internal/appendix, + "eyes" = /obj/item/organ/internal/eyes/unathi + ) /datum/species/unathi/ashwalker/on_species_gain(mob/living/carbon/human/H) ..() diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 9f3f30662a8c..bb0c73ac7d6c 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -1,4 +1,5 @@ #define BATON_COOLDOWN 3.5 SECONDS +#define BOT_REBATON_THRESHOLD 5 SECONDS /mob/living/simple_animal/bot/ed209 name = "\improper ED-209 Security Robot" @@ -279,6 +280,10 @@ back_to_idle() return + if(target.stat == DEAD) + back_to_idle() // Stop beating up the dead guy + return + if(Adjacent(target) && isturf(target.loc) && !baton_delayed) // if right next to perp stun_attack(target) if(!lasercolor) @@ -296,7 +301,7 @@ if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if(!Adjacent(target) || !isturf(target.loc) || world.time - target.stam_regen_start_time < 4 SECONDS && target.getStaminaLoss() <= 100) + if(!Adjacent(target) || !isturf(target.loc) || target.stam_regen_start_time - world.time <= BOT_REBATON_THRESHOLD || target.getStaminaLoss() <= 100) back_to_hunt() return @@ -321,7 +326,7 @@ back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && world.time - target.stam_regen_start_time < 4 SECONDS && target.getStaminaLoss() <= 100)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.stam_regen_start_time - world.time <= BOT_REBATON_THRESHOLD || target.getStaminaLoss() <= 100)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. back_to_hunt() return @@ -582,3 +587,4 @@ back_to_idle() #undef BATON_COOLDOWN +#undef BOT_REBATON_THRESHOLD diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 05704ccb59b0..82b3a1c68802 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -1,4 +1,5 @@ #define BATON_COOLDOWN 3.5 SECONDS +#define BOT_REBATON_THRESHOLD 5 SECONDS /mob/living/simple_animal/bot/secbot name = "\improper Securitron" @@ -330,6 +331,10 @@ back_to_idle() return + if(target.stat == DEAD) + back_to_idle() // Stop beating up the dead guy + return + if(Adjacent(target) && isturf(target.loc) && !baton_delayed) // if right next to perp stun_attack(target) mode = BOT_PREP_ARREST @@ -341,7 +346,7 @@ if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if(!Adjacent(target) || !isturf(target.loc) || world.time - target.stam_regen_start_time < 4 SECONDS && target.getStaminaLoss() <= 100) + if(!Adjacent(target) || !isturf(target.loc) || target.stam_regen_start_time - world.time <= BOT_REBATON_THRESHOLD|| target.getStaminaLoss() <= 100) back_to_hunt() return // target is stunned and nearby @@ -362,12 +367,12 @@ back_to_idle() - if(BOT_ARREST) + if(BOT_ARREST) // Fun fact: This is not called if(!target || target.handcuffed) back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountWeakened() < 4 SECONDS)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.stam_regen_start_time - world.time <= BOT_REBATON_THRESHOLD || target.getStaminaLoss() <= 100)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. back_to_hunt() return //Try arresting again if the target escapes. @@ -407,7 +412,7 @@ if((C.stat) || (C.handcuffed)) continue - if((C.name == oldtarget_name) && (world.time < last_found + 100)) + if((C.name == oldtarget_name) && (world.time < last_found + 5 SECONDS)) continue threatlevel = C.assess_threat(src) @@ -470,3 +475,4 @@ ..() #undef BATON_COOLDOWN +#undef BOT_REBATON_THRESHOLD diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index e8064e07b772..2ceba7b97492 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -166,10 +166,12 @@ spawn(rand(20,50)) if(stat == CONSCIOUS && M) icon_state = icon_living - var/list/responses = list( "[src] looks at you imploringly.", - "[src] looks at you pleadingly", - "[src] looks at you with a resigned expression.", - "[src] seems resigned to its fate.") + var/list/responses = list( + "[src] looks at you imploringly.", + "[src] looks at you pleadingly", + "[src] looks at you with a resigned expression.", + "[src] seems resigned to its fate." + ) to_chat(M, pick(responses)) else ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ae48d73f78bb..b07a72482e6a 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -217,6 +217,8 @@ if(!gibbed) gib() + SSticker.record_biohazard_start(BIOHAZARD_BLOB) + /mob/living/simple_animal/mouse/blobinfected/get_scooped(mob/living/carbon/grabber) to_chat(grabber, "You try to pick up [src], but they slip out of your grasp!") to_chat(src, "[src] tries to pick you up, but you wriggle free of their grasp!") diff --git a/code/modules/mob/living/simple_animal/slime/slime_death.dm b/code/modules/mob/living/simple_animal/slime/slime_death.dm index 3136f8f07700..fcd7eb8d2b47 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_death.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_death.dm @@ -22,7 +22,7 @@ E.Grant(src) revive() regenerate_icons() - update_name() + update_appearance(UPDATE_NAME) return set_stat(DEAD) //Temporarily set to dead for icon updates diff --git a/code/modules/mob/living/simple_animal/slime/slime_mob.dm b/code/modules/mob/living/simple_animal/slime/slime_mob.dm index 304f9ed74c0a..08682a4717ad 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_mob.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_mob.dm @@ -113,7 +113,7 @@ /mob/living/simple_animal/slime/proc/set_colour(new_colour) colour = new_colour - update_name() + update_appearance(UPDATE_NAME) slime_mutation = mutation_table(colour) var/sanitizedcolour = replacetext(colour, " ", "") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") diff --git a/code/modules/mob/living/simple_animal/slime/slime_powers.dm b/code/modules/mob/living/simple_animal/slime/slime_powers.dm index 1fef3f12c225..cb536acb6bba 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_powers.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_powers.dm @@ -132,7 +132,7 @@ for(var/datum/action/innate/slime/evolve/E in actions) E.Remove(src) regenerate_icons() - update_name() + update_appearance(UPDATE_NAME) else to_chat(src, "I am not ready to evolve yet...") else diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3dcac7d1c695..140dd1c76a0e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -670,7 +670,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \ G.affecting.ret_grab(L, 1) if(!flag) if(L.master == src) - var/list/temp = list( ) + var/list/temp = list() temp += L.container //L = null qdel(L) diff --git a/code/modules/mob/mob_misc_procs.dm b/code/modules/mob/mob_misc_procs.dm index e61b11b16be7..70e0b54360ae 100644 --- a/code/modules/mob/mob_misc_procs.dm +++ b/code/modules/mob/mob_misc_procs.dm @@ -194,7 +194,8 @@ message_admins("No ghosts were willing to take control of [key_name_admin(M)])") /proc/check_zone(zone) - if(!zone) return "chest" + if(!zone) + return "chest" switch(zone) if("eyes") zone = "head" @@ -214,18 +215,28 @@ if(prob(probability)) return zone - var/t = rand(1, 18) // randomly pick a different zone, or maybe the same one - switch(t) - if(1) return "head" - if(2) return "chest" - if(3 to 4) return "l_arm" - if(5 to 6) return "l_hand" - if(7 to 8) return "r_arm" - if(9 to 10) return "r_hand" - if(11 to 12) return "l_leg" - if(13 to 14) return "l_foot" - if(15 to 16) return "r_leg" - if(17 to 18) return "r_foot" + var/random_zone = rand(1, 18) // randomly pick a different zone, or maybe the same one + switch(random_zone) + if(1) + return "head" + if(2) + return "chest" + if(3 to 4) + return "l_arm" + if(5 to 6) + return "l_hand" + if(7 to 8) + return "r_arm" + if(9 to 10) + return "r_hand" + if(11 to 12) + return "l_leg" + if(13 to 14) + return "l_foot" + if(15 to 16) + return "r_leg" + if(17 to 18) + return "r_foot" return zone diff --git a/code/modules/mob/mob_vars.dm b/code/modules/mob/mob_vars.dm index ba6fbbbb7ef6..605a1043d4f4 100644 --- a/code/modules/mob/mob_vars.dm +++ b/code/modules/mob/mob_vars.dm @@ -35,7 +35,7 @@ var/computer_id = null var/lastattacker = null // real name of the person doing the attacking var/lastattackerckey = null // their ckey - var/list/attack_log_old = list( ) + var/list/attack_log_old = list() var/list/debug_log = null var/last_known_ckey = null // Used in logging diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index fc10b7448e00..9fbf636001c4 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -102,10 +102,12 @@ ..() module = linked_module button_overlay_icon_state = module.icon_state + button_background_icon_state = ((module.module_type == MODULE_TOGGLE && module.active) ? "bg_mod_active" : "bg_mod") if(linked_module.allow_flags & MODULE_ALLOW_INCAPACITATED) // clears check hands check_flags = AB_CHECK_CONSCIOUS Grant(user) + RegisterSignals(module, list(COMSIG_MODULE_ACTIVATED, COMSIG_MODULE_DEACTIVATED), PROC_REF(linked_button_update)) /datum/action/item_action/mod/pinned_module/Destroy() UnregisterSignal(module, list(COMSIG_MODULE_ACTIVATED, COMSIG_MODULE_DEACTIVATED, COMSIG_MODULE_USED)) @@ -127,3 +129,8 @@ if(!.) return module.on_select() + +/datum/action/item_action/mod/pinned_module/proc/linked_button_update() + if(module.module_type != MODULE_PASSIVE) + button_background_icon_state = (module.active ? "bg_mod_active" : "bg_mod") + UpdateButtons() diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 93e7c2100f25..5dd2e207e106 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -223,7 +223,7 @@ module.on_suit_deactivation() STOP_PROCESSING(SSobj, src) update_speed() - update_icon_state() + update_icon(UPDATE_ICON_STATE) wearer.regenerate_icons() /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 77fedf4c5292..d526ae37a71b 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -250,7 +250,7 @@ if(part.use_tool(src, user, 0, volume = 30)) to_chat(user, "Assembly unscrewed.") construction_step = SCREWED_ASSEMBLY_STEP - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/mod/construction/shell/update_icon_state() . = ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index d841c96b886e..635b99e03d14 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -1113,13 +1113,14 @@ armor = list(MELEE = 20, BULLET = 5, LASER = 10, ENERGY = 10, BOMB = 50, RAD = 50, FIRE = 150, ACID = 150) /datum/mod_theme/responsory - name = "responsory" - desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." - extended_desc = "A streamlined suit of Nanotrasen design, these sleek black suits are only worn by \ - elite emergency response personnel to help save the day. While the slim and nimble design of the suit \ - cuts the ceramics and ablatives in it down, dropping the protection, \ - it keeps the wearer safe from the harsh void of space while sacrificing no speed whatsoever. \ - While wearing it you feel an extreme deference to darkness. " + name = "\improper 'Ward' responsory" + desc = "A high-tech combat modsuit designed and produced by Nanotrasen. Well armored, environmentally sealed, and outfitted with all manner of useful gadgetry. \ + The pinnacle of corporate security hardware." + extended_desc = "A streamlined suit of powered armor produced entirely in-house by the Nanotrasen Corporation, the NA-22 'Ward' rapid response suit is one of the finest combat modsuits available on the market today. \ + Equipped with a fire-resistant polybenzimidazole bodyglove and lightweight nano-polymer impact panels underneath a steel armored shell, the NA-22 offers reliable protection \ + while retaining combat mobility. Internally, the NA-22 comes pre-loaded with NTOS-11 on a five-year subscription, which enables unparallelled customization options in conjunction \ + with the Ward's unusually generous design specifications. Naturally, the NA-22 has a price tag to match its quality, and is thus only found within Nanotrasen's \ + personal response units, as well as among the wealthiest of Sector PMCs and mercenary groups." default_skin = "responsory" armor_type_1 = /obj/item/mod/armor/mod_theme_responsory diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 770c256ff26d..051e5e8658e7 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -80,6 +80,7 @@ ) default_pins = list( /obj/item/mod/module/magboot, + /obj/item/mod/module/firefighting_tank ) @@ -97,6 +98,7 @@ default_pins = list( /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/firefighting_tank ) /obj/item/mod/control/pre_equipped/loader @@ -484,7 +486,8 @@ /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug applied_core = /obj/item/mod/core/infinite - applied_modules = list( //one of every type of module, for testing if they all work correctly // boy this isn't even 25% the modules + /// One of every type of module, for testing if they all work correctly // boy this isn't even 25% the modules + applied_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, diff --git a/code/modules/mod/modules/_modules.dm b/code/modules/mod/modules/_modules.dm index 35f6b60db828..6ba416447e6a 100644 --- a/code/modules/mod/modules/_modules.dm +++ b/code/modules/mod/modules/_modules.dm @@ -362,7 +362,7 @@ return var/core_path = pick(accepted_anomalies) core = new core_path(src) - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/mod/module/anomaly_locked/Destroy() QDEL_NULL(core) @@ -407,7 +407,7 @@ core = item to_chat(user, "You install [item].") playsound(src, 'sound/machines/click.ogg', 30, TRUE) - update_icon_state() + update_icon(UPDATE_ICON_STATE) core.forceMove(src) else return ..() @@ -424,7 +424,7 @@ if(Adjacent(user) && !issilicon(user)) user.put_in_hands(core) core = null - update_icon_state() + update_icon(UPDATE_ICON_STATE) /obj/item/mod/module/anomaly_locked/update_icon_state() icon_state = initial(icon_state) + (core ? "-core" : "") diff --git a/code/modules/newscaster/obj/newscaster.dm b/code/modules/newscaster/obj/newscaster.dm index f086ec662bb2..872bf29a8c1a 100644 --- a/code/modules/newscaster/obj/newscaster.dm +++ b/code/modules/newscaster/obj/newscaster.dm @@ -645,18 +645,9 @@ GLOBAL_LIST_EMPTY(allNewscasters) /obj/machinery/newscaster/proc/get_scanned_user(mob/user) . = list(name = "Unknown", security = user.can_admin_interact()) if(ishuman(user)) - var/mob/living/carbon/human/M = user - // No ID, no luck - if(!M.wear_id) - return - // Try to get the ID - var/obj/item/card/id/ID - if(istype(M.wear_id, /obj/item/pda)) - var/obj/item/pda/P = M.wear_id - ID = P.id - else if(istype(M.wear_id, /obj/item/card/id)) - ID = M.wear_id - if(istype(ID)) + var/mob/living/carbon/human/human_user = user + var/obj/item/card/id/ID = human_user.get_id_card() + if(ID) return list(name = "[ID.registered_name] ([ID.assignment])", security = has_access(list(), list(ACCESS_SECURITY), ID.access)) else if(issilicon(user)) var/mob/living/silicon/ai_user = user diff --git a/code/modules/ninja/suit/ninja_head.dm b/code/modules/ninja/suit/ninja_head.dm index ace19a439234..fa095416b75b 100644 --- a/code/modules/ninja/suit/ninja_head.dm +++ b/code/modules/ninja/suit/ninja_head.dm @@ -5,5 +5,6 @@ name = "ninja hood" icon_state = "s-ninja" item_state = "s-ninja_hood" + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE armor = list(MELEE = 75, BULLET = 50, LASER = 20, ENERGY = 10, BOMB = 20, RAD = 15, FIRE = INFINITY, ACID = INFINITY) blockTracking = 1 diff --git a/code/modules/ninja/suit/ninja_mask.dm b/code/modules/ninja/suit/ninja_mask.dm index b61258440bd0..e024ea822a5b 100644 --- a/code/modules/ninja/suit/ninja_mask.dm +++ b/code/modules/ninja/suit/ninja_mask.dm @@ -10,7 +10,7 @@ Contents: name = "ninja mask" desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." icon_state = "s-ninja(norm)" - item_state = "s-ninja_mask" + item_state = "s-ninja(norm)" sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/mask.dmi', diff --git a/code/modules/ninja/suit/ninja_suit.dm b/code/modules/ninja/suit/ninja_suit.dm index 47d7fbe3c904..b5ee1aedda7b 100644 --- a/code/modules/ninja/suit/ninja_suit.dm +++ b/code/modules/ninja/suit/ninja_suit.dm @@ -14,6 +14,7 @@ Contents: item_state = "s-ninja_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/melee/baton, /obj/item/tank/internals, /obj/item/stock_parts/cell) slowdown = 0 + flags_inv = HIDEJUMPSUIT|HIDETAIL armor = list(MELEE = 75, BULLET = 50, LASER = 20, ENERGY = 10, BOMB = 20, RAD = 15, FIRE = INFINITY, ACID = INFINITY) dyeable = FALSE diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index c8a08ca60696..24ef741d3547 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_EMPTY(adminfaxes) var/list/reply_to = null /datum/fax/admin/New() - GLOB.adminfaxes += src + return // Fax panel - lets admins check all faxes sent during the round /client/proc/fax_panel() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index d653f5917750..0188fcbb5b60 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -299,22 +299,22 @@ GLOBAL_LIST_EMPTY(fax_blacklist) var/success = 0 for(var/obj/machinery/photocopier/faxmachine/F in GLOB.allfaxes) if(F.department == destination) - success = F.receivefax(copyitem) + var/datum/fax/A = new /datum/fax() + A.name = copyitem.name + A.from_department = department + A.to_department = destination + A.origin = src + A.message = copyitem + A.sent_by = sender + A.sent_at = world.time + + success = F.receivefax(A) if(success) - var/datum/fax/F = new /datum/fax() - F.name = copyitem.name - F.from_department = department - F.to_department = destination - F.origin = src - F.message = copyitem - F.sent_by = sender - F.sent_at = world.time - visible_message("[src] beeps, \"Message transmitted successfully.\"") else visible_message("[src] beeps, \"Error transmitting message.\"") -/obj/machinery/photocopier/faxmachine/proc/receivefax(obj/item/incoming) +/obj/machinery/photocopier/faxmachine/proc/receivefax(datum/fax/incoming) if(stat & (BROKEN|NOPOWER)) return FALSE @@ -327,16 +327,31 @@ GLOBAL_LIST_EMPTY(fax_blacklist) addtimer(CALLBACK(src, PROC_REF(print_fax), incoming), 2 SECONDS) return TRUE -/obj/machinery/photocopier/faxmachine/proc/print_fax(obj/item/incoming) - if(istype(incoming, /obj/item/paper)) - papercopy(incoming) - else if(istype(incoming, /obj/item/photo)) - photocopy(incoming) - else if(istype(incoming, /obj/item/paper_bundle)) - bundlecopy(incoming) +/obj/machinery/photocopier/faxmachine/proc/print_fax(datum/fax/incoming) + var/obj/item/new_copy = null + if(istype(incoming.message, /obj/item/paper)) + new_copy = papercopy(incoming.message) + else if(istype(incoming.message, /obj/item/photo)) + new_copy = photocopy(incoming.message) + else if(istype(incoming.message, /obj/item/paper_bundle)) + new_copy = bundlecopy(incoming.message) else return + // Store the fax that was received in the admin room in adminfaxes + // Fixes issue where deleting the original would make it unreadable in the admin panel + if(istype(incoming, /datum/fax/admin)) + var/datum/fax/admin/A = new /datum/fax/admin() + A.name = new_copy.name + A.from_department = incoming.from_department + A.to_department = incoming.to_department + A.origin = incoming.origin + A.message = new_copy + A.sent_by = incoming.sent_by + A.sent_at = incoming.sent_at + + GLOB.adminfaxes += A + use_power(active_power_consumption) /obj/machinery/photocopier/faxmachine/proc/log_fax(mob/sender, destination) @@ -387,7 +402,7 @@ GLOBAL_LIST_EMPTY(fax_blacklist) message_admins(sender, "SYNDICATE FAX", destination, copyitem, "#DC143C") for(var/obj/machinery/photocopier/faxmachine/F in GLOB.allfaxes) if(F.department == destination) - F.receivefax(copyitem) + F.receivefax(A) visible_message("[src] beeps, \"Message transmitted successfully.\"") log_fax(sender, destination) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 80dba5fd47e9..4bd0eef2f6a2 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -268,7 +268,7 @@ . += sheet . += "clip" - update_desc() + update_appearance(UPDATE_DESC) /obj/item/paper_bundle/proc/get_page(page_override) if(page_override) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index ebe264a44717..a1395f0f19a3 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -179,19 +179,25 @@ name = "fancy pen" desc = "A fancy metal pen. An inscription on one side reads, \"L.L. - L.R.\"" icon_state = "fancypen" - container_type = DRAINABLE //cannot be refilled, love can be extracted for use in other items with syringe + container_type = (DRAINABLE | TRANSPARENT) //cannot be refilled, but pax can be extracted for use in other items with syringe origin_tech = "engineering=4;syndicate=2" transfer_amount = 25 // 4 Dosages instead of 2 -/obj/item/pen/sleepy/love/attack(mob/living/M, mob/user) - var/can_transfer = reagents.total_volume && M.reagents +/obj/item/pen/sleepy/love/Initialize(mapload) . = ..() - if(can_transfer && .) - M.apply_status_effect(STATUS_EFFECT_PACIFIED) //pacifies for 40 seconds - return TRUE + START_PROCESSING(SSobj, src) + +/obj/item/pen/sleepy/love/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() /obj/item/pen/sleepy/love/fill_pen() - reagents.add_reagent("love", 100) + reagents.add_reagent("pax", 100) // strong and unique reagent, making you a pacifist for a long time. + +/obj/item/pen/sleepy/love/process() + if(reagents.total_volume < 100) + reagents.add_reagent("pax", 0.5) // slow refill over time. In average 1 dose every 100 seconds. + /obj/item/pen/sleepy/undisguised name = "sleepy pen" diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm index 8bfc36d51321..b5155a3acb32 100644 --- a/code/modules/pda/PDA.dm +++ b/code/modules/pda/PDA.dm @@ -160,8 +160,12 @@ GLOBAL_LIST_EMPTY(PDAs) . = ..() if(id) . += image('icons/goonstation/objects/pda_overlay.dmi', id.icon_state) + if(length(notifying_programs)) - . += image('icons/obj/pda.dmi', "pda-r") + if(icon_state == "pda-library") + . += image('icons/obj/pda.dmi', "pda-r-library") + else + . += image('icons/obj/pda.dmi', "pda-r") /obj/item/pda/proc/close(mob/user) SStgui.close_uis(src) diff --git a/code/modules/pda/pdas.dm b/code/modules/pda/pdas.dm index 3b848311b7ed..4191bd58f10e 100644 --- a/code/modules/pda/pdas.dm +++ b/code/modules/pda/pdas.dm @@ -16,7 +16,7 @@ /obj/item/pda/detective default_cartridge = /obj/item/cartridge/detective - icon_state = "pda-security" + icon_state = "pda-detective" default_pen = /obj/item/pen/multi /obj/item/pda/warden @@ -79,6 +79,11 @@ icon_state = "pda-rd" default_pen = /obj/item/pen/rd +/obj/item/pda/heads/qm + default_cartridge = /obj/item/cartridge/qm + icon_state = "pda-qm" + default_pen = /obj/item/pen/qm + /obj/item/pda/captain default_cartridge = /obj/item/cartridge/captain icon_state = "pda-captain" @@ -88,12 +93,12 @@ /obj/item/pda/heads/ntrep default_cartridge = /obj/item/cartridge/supervisor - icon_state = "pda-h" + icon_state = "pda-ntr" default_pen = /obj/item/pen/multi/fountain /obj/item/pda/heads/magistrate default_cartridge = /obj/item/cartridge/supervisor - icon_state = "pda-h" + icon_state = "pda-magistrate" default_pen = /obj/item/pen/multi/gold /obj/item/pda/heads/blueshield @@ -125,11 +130,6 @@ default_cartridge = /obj/item/cartridge/cargo icon_state = "pda-cargo" -/obj/item/pda/quartermaster - default_cartridge = /obj/item/cartridge/qm - icon_state = "pda-qm" - default_pen = /obj/item/pen/qm - /obj/item/pda/shaftminer icon_state = "pda-miner" @@ -174,7 +174,7 @@ default_pen = /obj/item/pen/multi /obj/item/pda/clear - icon_state = "pda-transp" + icon_state = "pda-clear" desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition with a transparent case." model_name = "Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition" diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm index e1f99ebb895a..f818ad845c98 100644 --- a/code/modules/power/apc/apc.dm +++ b/code/modules/power/apc/apc.dm @@ -131,7 +131,6 @@ armor = list(MELEE = 20, BULLET = 20, LASER = 10, ENERGY = 100, BOMB = 30, RAD = 100, FIRE = 90, ACID = 50) ..() GLOB.apcs += src - GLOB.apcs = sortAtom(GLOB.apcs) wires = new(src) @@ -179,6 +178,7 @@ A.powernet.powernet_apc = src if(!mapload) + GLOB.apcs = sortAtom(GLOB.apcs) return electronics_state = APC_ELECTRONICS_SECURED diff --git a/code/modules/power/engines/supermatter/supermatter.dm b/code/modules/power/engines/supermatter/supermatter.dm index a3e315bc83d2..366273e4bfe9 100644 --- a/code/modules/power/engines/supermatter/supermatter.dm +++ b/code/modules/power/engines/supermatter/supermatter.dm @@ -601,7 +601,7 @@ //After this point power is lowered //This wraps around to the begining of the function //Handle high power zaps/anomaly generation - if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point) //If the power is above 5000 or if the damage is above 550 + if(power > POWER_PENALTY_THRESHOLD || damage > damage_penalty_point || combined_gas > MOLE_CRUNCH_THRESHOLD) //If the power is above 5000, if the damage is above 550, or mole crushing var/range = 4 zap_cutoff = 1500 if(removed && removed.return_pressure() > 0 && removed.temperature() > 0) @@ -640,9 +640,9 @@ if(prob(5)) supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10)) - if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(1)) + if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(1) || combined_gas > MOLE_CRUNCH_THRESHOLD && prob(5)) supermatter_anomaly_gen(src, GRAVITATIONAL_ANOMALY, rand(5, 10)) - if((power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2)) || (prob(0.3) && power > POWER_PENALTY_THRESHOLD)) + if((power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2)) || (prob(0.3) && power > POWER_PENALTY_THRESHOLD) || combined_gas > MOLE_CRUNCH_THRESHOLD && prob(2)) supermatter_anomaly_gen(src, BLUESPACE_ANOMALY, rand(5, 10)) if(prob(15)) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index ff397b39e9cb..5a0fbf434ff6 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -128,7 +128,7 @@ var/list/stored_ammo = list() var/ammo_type = /obj/item/ammo_casing var/max_ammo = 7 - var/multi_sprite_step = AMMO_BOX_MULTI_SPRITE_STEP_NONE // see update_icon_state() for details + var/multi_sprite_step = AMMO_BOX_MULTI_SPRITE_STEP_NONE // see update_icon_state for details var/caliber var/multiload = 1 var/slow_loading = FALSE diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 1e9c05ef2257..889d8d5c6e46 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -604,6 +604,11 @@ materials = list(MAT_METAL = 20000) var/charge = 1000 +// Overwrite description so shells aren't displayed +/obj/item/ammo_box/magazine/detective/speedcharger/update_desc() + . = ..() + desc = "[initial(desc)]" + /obj/item/ammo_box/magazine/detective/speedcharger/update_icon_state() return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 36984e63b5ef..aa6c863cd63d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -352,6 +352,7 @@ if(!user.unEquip(I)) return to_chat(user, "You click [S] into place on [src].") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) if(S.on) set_light(0) gun_light = S @@ -375,6 +376,7 @@ return K.forceMove(src) to_chat(user, "You attach [K] to [src]'s bayonet lug.") + playsound(src, 'sound/machines/click.ogg', 50, TRUE) bayonet = K var/state = "bayonet" //Generic state. if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? @@ -389,21 +391,23 @@ /obj/item/gun/screwdriver_act(mob/user, obj/item/I) . = TRUE - if(!I.use_tool(src, user, 0, volume = I.tool_volume)) - return - if(gun_light && can_flashlight) - for(var/obj/item/flashlight/seclite/S in src) - to_chat(user, "You unscrew the seclite from [src].") - gun_light = null - S.loc = get_turf(user) - update_gun_light(user) - S.update_brightness(user) - update_icon() - for(var/datum/action/item_action/toggle_gunlight/TGL in actions) - qdel(TGL) - else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed - bayonet.forceMove(get_turf(user)) - clear_bayonet() + if(gun_light || bayonet) + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(gun_light && can_flashlight) + for(var/obj/item/flashlight/seclite/S in src) + to_chat(user, "You unscrew the seclite from [src].") + gun_light = null + S.loc = get_turf(user) + update_gun_light(user) + S.update_brightness(user) + update_icon() + for(var/datum/action/item_action/toggle_gunlight/TGL in actions) + qdel(TGL) + else if(bayonet && can_bayonet) // if it has a bayonet, and the bayonet can be removed + bayonet.forceMove(get_turf(user)) + to_chat(user, "You remove [bayonet] from [src].") + clear_bayonet() /obj/item/gun/proc/toggle_gunlight() if(!gun_light) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 5e1c90749583..ad7350420cda 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -463,7 +463,7 @@ if(slime.docile) //Undoes docility, but doesn't make rabid. slime.visible_message("[slime] forgets its training, becoming wild once again!") slime.docile = FALSE - slime.update_name() + slime.update_appearance(UPDATE_NAME) continue slime.rabid = TRUE slime.visible_message("[slime] is driven into a frenzy!") diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 1448089796be..52ec63933a7c 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1611,7 +1611,7 @@ /obj/effect/decal/cleanable/blood/gibs/pipe_eject(direction) var/list/dirs if(direction) - dirs = list( direction, turn(direction, -45), turn(direction, 45)) + dirs = list(direction, turn(direction, -45), turn(direction, 45)) else dirs = GLOB.alldirs.Copy() @@ -1620,7 +1620,7 @@ /obj/effect/decal/cleanable/blood/gibs/robot/gib/pipe_eject(direction) var/list/dirs if(direction) - dirs = list( direction, turn(direction, -45), turn(direction, 45)) + dirs = list(direction, turn(direction, -45), turn(direction, 45)) else dirs = GLOB.alldirs.Copy() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 9351978962e9..c7a23b33c67e 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -450,7 +450,7 @@ to_chat(user, "You seal [src], preparing it for delivery.") icon_state = "shippack_sealed" sealed = 1 - update_desc() + update_appearance(UPDATE_DESC) else if(tgui_alert(user, "Do you want to tear up the package?", "Shipping", list("Yes", "No")) == "Yes") to_chat(user, "You shred [src].") diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 8f9247bd5d54..da2d8dd774d9 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -350,10 +350,11 @@ desc = "An implant that enhances your muscles to punch harder and throw people back." id = "muscle_implant" req_tech = list("combat" = 7, "syndicate" = 4, "biotech" = 7) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(MAT_GOLD = 5000, MAT_METAL = 10000, MAT_TITANIUM = 3000, MAT_BLUESPACE = 2000) + construction_time = 200 build_path = /obj/item/organ/internal/cyberimp/arm/muscle - category = list("Weapons") + category = list("Medical", "Weapons") /datum/design/upgraded_chemical_flamethrower name = "Extended Capacity Chemical Flamethrower Parts" diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 216f680e8556..28b410b9d373 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -419,7 +419,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, /obj/machinery/computer/rdconsole/proc/finish_machine(key, amount, enough_materials, obj/machinery/r_n_d/machine, datum/design/being_built, list/efficient_mats) if(machine) if(enough_materials && being_built) - SSblackbox.record_feedback("nested tally", "RND Production List", amount, list("[being_built.category]", "[being_built.name]")) + if(is_station_level(z)) + SSblackbox.record_feedback("tally", "station_protolathe_production", amount, "[being_built.type]") for(var/i in 1 to amount) var/obj/item/new_item = new being_built.build_path(src) if(istype(new_item)) // Only want a random pixel offset if it IS actually an item, and not a structure like a bluespace closet diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index afd6c3a35972..d6b2b7f576cd 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -146,9 +146,9 @@ /obj/machinery/bsa/full/proc/get_front_turf() switch(dir) if(WEST) - return locate(x - 6,y,z) + return locate(x - 7,y,z) if(EAST) - return locate(x + 4,y,z) + return locate(x + 5,y,z) return get_turf(src) /obj/machinery/bsa/full/proc/get_back_turf() @@ -206,6 +206,7 @@ A.ex_act(EXPLODE_DEVASTATE) point.Beam(get_target_turf(), icon_state = "bsa_beam", time = 50, maxdistance = world.maxx, beam_type = /obj/effect/ebeam/deadly) //ZZZAP + new /obj/effect/temp_visual/bsa_splash(point, dir) playsound(src, 'sound/machines/bsa_fire.ogg', 100, 1) if(istype(target, /obj/item/gps)) var/obj/item/gps/G = target diff --git a/code/modules/supply/supply_packs/pack_security.dm b/code/modules/supply/supply_packs/pack_security.dm index f95c3cbc5756..1adad3d58c9e 100644 --- a/code/modules/supply/supply_packs/pack_security.dm +++ b/code/modules/supply/supply_packs/pack_security.dm @@ -278,15 +278,15 @@ /datum/supply_packs/security/armory/tranqammo name = "Tranquilizer Shell Crate" - contains = list(/obj/item/storage/box/tranquilizer, - /obj/item/storage/box/tranquilizer) + contains = list(/obj/item/storage/fancy/shell/tranquilizer, + /obj/item/storage/fancy/shell/tranquilizer) cost = 400 containername = "tranquilizer shell crate" /datum/supply_packs/security/armory/holyammo name = "Holy Water Shell Crate" - contains = list(/obj/item/storage/box/holy, - /obj/item/storage/box/holy) + contains = list(/obj/item/storage/fancy/shell/holy, + /obj/item/storage/fancy/shell/holy) cost = 400 containername = "holy water shell crate" diff --git a/code/modules/tgui/tgui_input/list_input.dm b/code/modules/tgui/tgui_input/list_input.dm index f43ceffdaafa..e037b595fac6 100644 --- a/code/modules/tgui/tgui_input/list_input.dm +++ b/code/modules/tgui/tgui_input/list_input.dm @@ -73,6 +73,8 @@ var/datum/ui_state/state /// Whether the tgui list input is invalid or not (i.e. due to all list entries being null) var/invalid = FALSE + /// The TGUI modal to use for this popup + var/modal_type = "ListInputModal" /datum/tgui_list_input/New(mob/user, message, title, list/items, default, timeout, ui_state) src.title = title @@ -122,7 +124,7 @@ /datum/tgui_list_input/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "ListInputModal") + ui = new(user, src, modal_type) ui.set_autoupdate(FALSE) ui.open() @@ -152,9 +154,8 @@ switch(action) if("submit") - if(!(params["entry"] in items)) + if(!handle_submit_action(params)) return - set_choice(items_map[params["entry"]]) closed = TRUE SStgui.close_uis(src) return TRUE @@ -163,5 +164,12 @@ SStgui.close_uis(src) return TRUE + +/datum/tgui_list_input/proc/handle_submit_action(params) + if(!(params["entry"] in items)) + return FALSE + set_choice(items_map[params["entry"]]) + return TRUE + /datum/tgui_list_input/proc/set_choice(choice) src.choice = choice diff --git a/code/modules/tgui/tgui_input/ranked_list_input.dm b/code/modules/tgui/tgui_input/ranked_list_input.dm new file mode 100644 index 000000000000..80631d568236 --- /dev/null +++ b/code/modules/tgui/tgui_input/ranked_list_input.dm @@ -0,0 +1,56 @@ +/** + * Creates a TGUI input list window and returns the user's response. + * + * This proc should be used to create alerts that the caller will wait for a response from. + * Arguments: + * * user - The user to show the input box to. + * * message - The content of the input box, shown in the body of the TGUI window. + * * title - The title of the input box, shown on the top of the TGUI window. + * * items - The options that can be chosen by the user, each string is assigned a button on the UI. + * * default - If an option is already preselected on the UI. Current values, etc. + * * timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout. + */ +/proc/tgui_input_ranked_list(mob/user, message, title = "Select", list/items, default, timeout = 0, ui_state = GLOB.always_state) + if(!user) + user = usr + + if(!length(items)) + CRASH("[user] tried to open an empty TGUI Input List. Contents are: [items]") + + if(!istype(user)) + if(!isclient(user)) + CRASH("We passed something that wasn't a user/client in a TGUI Input List! The passed user was [user]!") + var/client/client = user + user = client.mob + + if(isnull(user.client)) + return + + // We don't support disabled TGUI input (PREFTOGGLE_2_DISABLE_TGUI_INPUT), get with the times old man + + var/datum/tgui_list_input/ranked/input = new(user, message, title, items, default, timeout, ui_state) + + if(input.invalid) + qdel(input) + return + + input.ui_interact(user) + input.wait() + if(input) + . = input.choice + qdel(input) + +/** + * # tgui_list_input/ranked + * + * Datum used for allowing a user to sort a TGUI-controlled list input that prompts the user with + * a message and shows a list of rankable options + */ +/datum/tgui_list_input/ranked + modal_type = "RankedListInputModal" + +/datum/tgui_list_input/ranked/handle_submit_action(params) + if(!lists_equal_unordered(params["entry"], items)) + return FALSE + set_choice(params["entry"]) + return TRUE diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 9a316f1a3492..db5fd2d0c0f5 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -133,26 +133,35 @@ Status of your pull request will be communicated via PR labels. This includes: All PRs which modify maps are expected to follow all of our [mapping requirements](./mapping/requirements.md). -## Modifying MILLA +## Modifying Rust Code -Our atmos engine, MILLA, is in the `milla/` directory. It's written in Rust for -performance reasons, which means it's not compiled the same way as the rest of -the code. If you're on Windows, you get a pre-built copy by default. If you're -on Linux, you built one already to run the server. +Some parts of Paradise are written in [Rust][] for performance or reliability +reasons: -If you make changes to MILLA, you'll want to rebuild. This will be very similar -to RUSTG: https://github.com/ParadiseSS13/rust-g The only difference is that you -run `cargo` from the `milla/` directory, and don't need to specify -`--all-features` (though it doesn't hurt). +- Our atmos engine, MILLA, is in the `rust/src/milla/` directory. +- The `mapmanip` library, an Aurora Station module used for automating DMM + modification, is in the `rust/src/mapmanip` library. + +The Rust parts of our codebase are compiled into a single library, +separate from the rest of the code. If you're on Windows, you get a pre-built +copy by default. If you're on Linux, you built one already to run the server. + +If you make changes to the Rust library, you'll want to rebuild. This will be +very similar to [rust-g][]. The only difference is that you run `cargo` from the +`rust/` directory, and don't need to specify `--all-features` (though it doesn't +hurt). The server will automatically detect that you have a local build, and use that over the default Windows one. -When you're ready to make a PR, please DO NOT modify `milla.dll` or -`tools/ci/libmilla_ci.so`. Leave "Allow edits and access to secrets by -maintainers" enabled, and post a comment on your PR saying `!build_milla`. A bot +When you're ready to make a PR, please DO NOT modify `rustlibs.dll` or +`tools/ci/librustlibs_ci.so`. Leave "Allow edits and access to secrets by +maintainers" enabled, and post a comment on your PR saying `!build_rust`. A bot will automatically build them for you and update your branch. +[Rust]: https://www.rust-lang.org/ +[rust-g]: https://github.com/ParadiseSS13/rust-g + ## Other Notes - Bloated code may be necessary to add a certain feature, which means there has diff --git a/docs/mapping/images/mapmanip_contents.png b/docs/mapping/images/mapmanip_contents.png new file mode 100644 index 000000000000..1db7e6b998a9 Binary files /dev/null and b/docs/mapping/images/mapmanip_contents.png differ diff --git a/docs/mapping/images/mapmanip_error.png b/docs/mapping/images/mapmanip_error.png new file mode 100644 index 000000000000..7b7a7608f4ca Binary files /dev/null and b/docs/mapping/images/mapmanip_error.png differ diff --git a/docs/mapping/images/mapmanip_inplace.png b/docs/mapping/images/mapmanip_inplace.png new file mode 100644 index 000000000000..bdc7eb4d5e5c Binary files /dev/null and b/docs/mapping/images/mapmanip_inplace.png differ diff --git a/docs/mapping/images/mapmanip_markers.png b/docs/mapping/images/mapmanip_markers.png new file mode 100644 index 000000000000..d1d732b219cc Binary files /dev/null and b/docs/mapping/images/mapmanip_markers.png differ diff --git a/docs/mapping/images/mapmanip_noops1.png b/docs/mapping/images/mapmanip_noops1.png new file mode 100644 index 000000000000..229c744fed93 Binary files /dev/null and b/docs/mapping/images/mapmanip_noops1.png differ diff --git a/docs/mapping/images/mapmanip_noops2.png b/docs/mapping/images/mapmanip_noops2.png new file mode 100644 index 000000000000..73dfe22290fd Binary files /dev/null and b/docs/mapping/images/mapmanip_noops2.png differ diff --git a/docs/mapping/images/mapmanip_noops3.png b/docs/mapping/images/mapmanip_noops3.png new file mode 100644 index 000000000000..f858899c8795 Binary files /dev/null and b/docs/mapping/images/mapmanip_noops3.png differ diff --git a/docs/mapping/images/mapmanip_noops4.png b/docs/mapping/images/mapmanip_noops4.png new file mode 100644 index 000000000000..7556a52eeb7a Binary files /dev/null and b/docs/mapping/images/mapmanip_noops4.png differ diff --git a/docs/mapping/images/mapmanip_results.png b/docs/mapping/images/mapmanip_results.png new file mode 100644 index 000000000000..8279a034da6e Binary files /dev/null and b/docs/mapping/images/mapmanip_results.png differ diff --git a/docs/mapping/submaps.md b/docs/mapping/submaps.md new file mode 100644 index 000000000000..97168a1b0d86 --- /dev/null +++ b/docs/mapping/submaps.md @@ -0,0 +1,181 @@ +# Guide to Submaps + +> [!NOTE] +> +> This guide was originally written by developer Dreamix for Aurora Station, the +> original codebase the `mapmanip` library was written in. Despite the difference +> in appearance of the screenshots, the guide is still applicable. + +Submaps are a mechanism to allow copy-pasting parts of maps (submaps) into other +maps, implemented with the `mapmanip` library. `mapmanip` is a library for map +manipulation, and happens before the map is actually loaded by the server. This +is implemented using Rust, instead of DM code. Map manipulations are configured +and defined by adding a `.jsonc` file corresponding to a `.dmm` map. Currently, +the only available map manipulation is submap extraction/insertion. + +## But Why + +This allows for adding variations to maps, beyond just using `/obj/random/...` +items. Variations of bigger parts of maps, like, for example, whole rooms. Or +even whole layouts, making it so a map looks different every time it is visited. + +## How To Do It + +1. Firstly, define two markers for each submap. The types need to be unique, and + the types are used later to define where to extract the submap from, and where + to insert it. Here, we want to add some variation to the small warehouse storage + room. + + ```dm + /obj/effect/map_effect/marker/mapmanip/submap/extract/station/boxstation/warehouse_small_storage + name = "Boxstation, Cargo Warehouse Small Storage" + + /obj/effect/map_effect/marker/mapmanip/submap/insert/station/boxstation/warehouse_small_storage + name = "Boxstation, Cargo Warehouse Small Storage" + ``` + +2. Figure out the area that the submap will be inserted into on the map, and add + the insert marker there. In this case the map is + `maps/stations/boxstation.dmm`, and the size of that area is 3x5 + tiles, being the little side warehouse. Here, we want the submaps to only be the + "cargo" or "contents" of the warehouse. So this room is already fully + functional, with lights, cameras, pipes, etc. Do note that the "submap edge" + helper markers are just visual helpers, and they have no function. + + ![](./images/mapmanip_inplace.png) + +3. Create a new map file that will contain the submap variants to extract from. + In this case it is `maps/stations/submaps/warehouse_small_storage.dmm`. + Add all the possible variants here, each having the same extract marker. They + must all be the chosen size, in this case being 3x5 tiles. We want the submaps + to only contain "cargo" or "contents" of the warehouse, so both the turf and + area are set to "noop". How are "noop" areas and turfs handled, see the next + part of this guide. + + ![](./images/mapmanip_contents.png) + +4. Create the mapmanip configuration file, that will actually define the map + manipulation, and make it happen. In this case it is + `maps/stations/boxstation.jsonc`. Do notice how the path and + name of this config file is exactly the same as of the map + `.../boxstation.dmm`, just with a different extension. Each + submap manipulation has these vars defined: + + - `type` - Map manipulation type. For submap manipulations it is "SubmapExtractInsert". + - `submap_size_...` - Size of the submap, width and height. + - `submaps_dmm` - This is the relative path to the DMM file containing the + submaps. Relative, meaning to the `.dmm` that is being loaded. In this + case, it is put in a separate folder for better organization, but it could + be in the same folder as the `.dmm` file that is being manipulated. + - `marker_...` - Typepaths to the insert and extract markers, as defined in + the first step of this guide, and as added into the maps in step two and + three. + - `submaps_can_repeat` - Decides whether submaps can repeat when inserting + them into different places on the map. If there are more extract markers + than insert markers, it is safe to set it to `true`. Otherwise it should + be `false`, or else there may not be enough submaps to insert, and map + manipulation will fail. + + ```json + [ + { + // Boxstation warehouse, intended for randomized items + "type": "SubmapExtractInsert", + "submap_size_x": 3, + "submap_size_y": 5, + "submaps_dmm": "stations/submaps/warehouse_small_storage.dmm", + "marker_extract": "/obj/effect/map_effect/marker/mapmanip/submap/extract/station/boxstation/warehouse_small_storage", + "marker_insert": "/obj/effect/map_effect/marker/mapmanip/submap/insert/station/boxstation/warehouse_small_storage", + "submaps_can_repeat": true // doesn't matter, as there's only one insert marker + } + ] + ``` + +5. Run the server locally and observe the results. + + ![](./images/mapmanip_results.png) + +## Areas and Turfs + +Areas and turfs, and specifically their "noop" types, have special meaning in +submap manipulation. They determine whether the submap manipulation is more like +"replacing" or "appending". The "noop" (short for "no-operation") types for +turfs is `/turf/template_noop`, and for areas it is `/area/template_noop`. + +If neither area nor turf are noop: submap tile atoms replace map tile atoms +entirely, including turf and area. This could be used for submaps that are fully +functional rooms, like a medbay submap and a brig submap, with their own areas +defined in their submaps. + +![](./images/mapmanip_noops1.png) + +If both area and turf are noop: All atoms on a submap tile are inserted/appended +into the map tile, with the exception for area and turf. This can be used for +places like a warehouse, where only the actual cargo is in submaps, and on the +map the warehouse is fully functional and implemented (just empty). + +![](./images/mapmanip_noops2.png) + +If only turf is noop, while area is non-noop: All atoms are inserted/appended +into the map tile, but the resulting area used is of the submap tile. +Admittedly, I cannot think of a good use case for this specific feature, but I +am including it here for completeness. + +![](./images/mapmanip_noops3.png) + +If only area is noop, while turf is non-noop: Submap tile atoms replace map tile +atoms entirely, with the exception of area - resulting area is of the map, not +the submap. This could be used to have different warehouses that use the same +submaps, in different parts of a station or outpost, and so using different +areas. + +![](./images/mapmanip_noops4.png) + +## Errors and Debugging + +If a map manipulation fails, it should do both these things: + +- Return `null`, and in that case the map is loaded without any map + manipulations, as a fallback. +- Generate a stack trace, that can be caught. To do so, must run with debugging, + and have breakpoints on runtime errors. It should show a stack trace like + below, with information about what happened. + + ![](./images/mapmanip_error.png) + +## Other Notes + +- The `.jsonc` config file is using the JSONC format, which is a bit strict to + how it should look, and especially cares about commas. JSONC is "JSON with + comments". Exactly the same as JSON, with the only difference being that it + allows `// comments`. + +- There may be multiple different submap insert/extract manipulations defined + for one map. Every submap manipulation is going to require its own set of + markers. In that case the `.jsonc` would look roughly like this. + + ![](./images/mapmanip_markers.png) + +- If a map has multiple submap operations defined, they can be all in the same + submap dmm file, or can be in different ones. They can also be in the same + folder as the main map, or in some subfolder. Use whatever is best for + organization. + +- Submaps can be "recursive", where a submap may contain a insert marker for + another submap. The contained submaps won't be automatically inserted, + however, and they still require their own manipulations in the config. + +## Possible Uses + +- Warehouse with different cargo every round. One round it could be empty, + another it could have a few crates with guns and armor, another time it could + be full of building materials. +- Armory with a few different possible loadouts. One with lots of weak SMGs and + strong armor, another variant with just a few strong rifles and weak armor. +- Big crew quarters with 20 rooms, but randomly filled with submaps with only 5 variants. +- Hallway on a planetary outpost with one variant where it is fine and "normal", + and another variant where it is blocked by some rocks, forcing people to find + another way through. +- Alternative possible layouts for the whole map, where rooms and departments + are in different places every round. +- The sky is the limit, literally. diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index 71eb30617c32..7bd1e5397130 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/beam_splash.dmi b/icons/effects/beam_splash.dmi new file mode 100644 index 000000000000..d7deb3e9275c Binary files /dev/null and b/icons/effects/beam_splash.dmi differ diff --git a/icons/effects/map_effects_96x96.dmi b/icons/effects/map_effects_96x96.dmi new file mode 100644 index 000000000000..fa0c418f3740 Binary files /dev/null and b/icons/effects/map_effects_96x96.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index d22a0eb914c3..4fcf4dbf0a8e 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/goonstation/objects/pda_overlay.dmi b/icons/goonstation/objects/pda_overlay.dmi index 7c4fa677eb5a..3b5068e1303a 100644 Binary files a/icons/goonstation/objects/pda_overlay.dmi and b/icons/goonstation/objects/pda_overlay.dmi differ diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi index faef21cd4c72..f4217c872874 100644 Binary files a/icons/mob/actions/actions_mod.dmi and b/icons/mob/actions/actions_mod.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 0d669c5831cd..e72a728175b8 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/species/drask/under/color.dmi b/icons/mob/clothing/species/drask/under/color.dmi index 50da6be897ff..c91b1131eae7 100644 Binary files a/icons/mob/clothing/species/drask/under/color.dmi and b/icons/mob/clothing/species/drask/under/color.dmi differ diff --git a/icons/mob/clothing/species/grey/under/color.dmi b/icons/mob/clothing/species/grey/under/color.dmi index 4e3ae9b67339..e286752d6599 100644 Binary files a/icons/mob/clothing/species/grey/under/color.dmi and b/icons/mob/clothing/species/grey/under/color.dmi differ diff --git a/icons/mob/clothing/species/kidan/gloves.dmi b/icons/mob/clothing/species/kidan/gloves.dmi index 61c77fe0e7f5..a6fe5c50b1b8 100644 Binary files a/icons/mob/clothing/species/kidan/gloves.dmi and b/icons/mob/clothing/species/kidan/gloves.dmi differ diff --git a/icons/mob/clothing/species/kidan/under/color.dmi b/icons/mob/clothing/species/kidan/under/color.dmi index babe2b8fcf1c..b9548a7d3d9f 100644 Binary files a/icons/mob/clothing/species/kidan/under/color.dmi and b/icons/mob/clothing/species/kidan/under/color.dmi differ diff --git a/icons/mob/clothing/species/vox/under/color.dmi b/icons/mob/clothing/species/vox/under/color.dmi index 99c31857f3ee..82303ac4d400 100644 Binary files a/icons/mob/clothing/species/vox/under/color.dmi and b/icons/mob/clothing/species/vox/under/color.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index b72165ac3c74..fcbd77823588 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/color.dmi b/icons/mob/clothing/under/color.dmi index 9ed1fc55cc59..633488f11cc1 100644 Binary files a/icons/mob/clothing/under/color.dmi and b/icons/mob/clothing/under/color.dmi differ diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index a85564d85965..989f62e68d05 100644 Binary files a/icons/mob/screen_ai.dmi and b/icons/mob/screen_ai.dmi differ diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index f1a82e36245d..ad82f1280802 100644 Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi index 3645c91aea5b..e0ace87e5d1a 100644 Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi index 3e22531ad769..da228456ee45 100644 Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi index a7ffcad04fa2..3fa0025ab7bc 100644 Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index 42f79c6dde7c..2e261c40cf3e 100644 Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ diff --git a/icons/mob/screen_white.dmi b/icons/mob/screen_white.dmi index 82854f531846..8b444e12e2a8 100644 Binary files a/icons/mob/screen_white.dmi and b/icons/mob/screen_white.dmi differ diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi index a9f0326fc752..e0c018cb6d63 100644 Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ diff --git a/icons/obj/clothing/under/color.dmi b/icons/obj/clothing/under/color.dmi index 2c51ac4a39f9..8b375da0e675 100644 Binary files a/icons/obj/clothing/under/color.dmi and b/icons/obj/clothing/under/color.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 882a166680f1..1a772a813e47 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/shell_boxes.dmi b/icons/obj/shell_boxes.dmi new file mode 100644 index 000000000000..615e189a9191 Binary files /dev/null and b/icons/obj/shell_boxes.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 67375dfa6abf..ada0ef227e20 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 3283b4f083bf..e024f21d33c4 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/ui_icons/inventory/pda.png b/icons/ui_icons/inventory/pda.png index fff1c7fcd8c2..c23438382972 100644 Binary files a/icons/ui_icons/inventory/pda.png and b/icons/ui_icons/inventory/pda.png differ diff --git a/milla.dll b/milla.dll deleted file mode 100755 index 7fe9470ef3dd..000000000000 Binary files a/milla.dll and /dev/null differ diff --git a/milla/Cargo.toml b/milla/Cargo.toml deleted file mode 100644 index 268df469456a..000000000000 --- a/milla/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "milla" -version = "1.0.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = ["cdylib"] - -[dependencies] -atomic_float = "1.0.0" -bitflags = "2.5.0" -byondapi = { git = "https://github.com/spacestation13/byondapi-rs.git", version = "0.4.7" } -eyre = "0.6.12" -rand = { version = "0.8.5", features = ["small_rng"] } -scc = "2.1.1" -thread-priority = "1.1.0" diff --git a/milla/src/logging.rs b/milla/src/logging.rs deleted file mode 100644 index 9a5d64291049..000000000000 --- a/milla/src/logging.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::backtrace::Backtrace; -use std::fs::File; -use std::io::Write; - -/// Simple logging function, appends to ./milla_log.txt -#[allow(dead_code)] -pub(crate) fn write_log>(x: T) { - let mut f = File::options() - .create(true) - .append(true) - .open("./milla_log.txt") - .unwrap(); - writeln!(&mut f, "{}", String::from_utf8_lossy(x.as_ref())).unwrap(); -} - -/// Panic handler that dumps info out to ./milla_panic.txt (overwriting) if we crash. -pub(crate) fn setup_panic_handler() { - std::panic::set_hook(Box::new(|info| { - let backtrace = Backtrace::force_capture(); - std::fs::write( - "./milla_panic.txt", - format!("Panic {:#?}\n{:#?}", info, backtrace), - ) - .unwrap(); - })) -} diff --git a/mkdocs.yml b/mkdocs.yml index 6545bbd06e0d..e3533b9ca27e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -86,6 +86,7 @@ nav: - 'Mapping Quickstart': './mapping/quickstart.md' - 'Mapping Requirements': './mapping/requirements.md' - 'Design Guidelines': './mapping/design.md' + - 'Guide to Submaps': './mapping/submaps.md' - 'References': - 'Glossary': './references/glossary.md' diff --git a/paradise.dme b/paradise.dme index 19d95b162190..bbea750fe4c4 100644 --- a/paradise.dme +++ b/paradise.dme @@ -89,7 +89,6 @@ #include "code\__DEFINES\mecha_defines.dm" #include "code\__DEFINES\mecha_hides.dm" #include "code\__DEFINES\medal.dm" -#include "code\__DEFINES\milla.dm" #include "code\__DEFINES\misc_defines.dm" #include "code\__DEFINES\mob_defines.dm" #include "code\__DEFINES\mod.dm" @@ -111,6 +110,7 @@ #include "code\__DEFINES\revolution_defines.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rolebans.dm" +#include "code\__DEFINES\rust.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\shuttle_defines.dm" #include "code\__DEFINES\sight.dm" @@ -1019,6 +1019,7 @@ #include "code\game\objects\effects\effect_system\effects_smoke.dm" #include "code\game\objects\effects\effect_system\effects_sparks.dm" #include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\map_effects\mapmanip.dm" #include "code\game\objects\effects\spawners\airlock_spawner.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\decorative_spawners.dm" @@ -2944,6 +2945,7 @@ #include "code\modules\tgui\tgui_input\keycombo_input.dm" #include "code\modules\tgui\tgui_input\list_input.dm" #include "code\modules\tgui\tgui_input\number_input.dm" +#include "code\modules\tgui\tgui_input\ranked_list_input.dm" #include "code\modules\tgui\tgui_input\text_input.dm" #include "code\modules\tgui\tgui_panel\audio.dm" #include "code\modules\tgui\tgui_panel\telemetry.dm" diff --git a/milla/Cargo.lock b/rust/Cargo.lock similarity index 57% rename from milla/Cargo.lock rename to rust/Cargo.lock index eee0b6908eb6..a3c486a8d949 100644 --- a/milla/Cargo.lock +++ b/rust/Cargo.lock @@ -2,6 +2,31 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -17,16 +42,50 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c4b08ed8a30ff7320117c190eb4d73d47f0ac0c930ab853b8224cef7cd9a5e7" +[[package]] +name = "attribute-derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c124f12ade4e670107b132722d0ad1a5c9790bcbc1b265336369ea05626b4498" +dependencies = [ + "attribute-derive-macro", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "attribute-derive-macro" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b217a07446e0fb086f83401a98297e2d81492122f5874db5391bd270a185f88" +dependencies = [ + "collection_literals", + "interpolator", + "proc-macro-error", + "proc-macro-utils", + "proc-macro2", + "quote", + "quote-use", + "syn 2.0.60", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + [[package]] name = "bindgen" version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags", + "bitflags 2.5.0", "cexpr", "clang-sys", - "itertools", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -36,16 +95,38 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 2.0.60", "which", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +[[package]] +name = "builtins-proc-macro" +version = "0.0.0" +source = "git+https://github.com/SpaceManiac/SpacemanDMM?rev=6c5a751516ae0e8add4b2aa4388a1e84e96e7082#6c5a751516ae0e8add4b2aa4388a1e84e96e7082" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + [[package]] name = "byondapi" version = "0.4.7" @@ -67,7 +148,7 @@ source = "git+https://github.com/spacestation13/byondapi-rs.git#aa4addd95c33b666 dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -82,6 +163,32 @@ dependencies = [ "walkdir", ] +[[package]] +name = "bytemuck" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cexpr" version = "0.6.0" @@ -108,6 +215,72 @@ dependencies = [ "libloading", ] +[[package]] +name = "collection_literals" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186dce98367766de751c42c4f03970fc60fc012296e706ccbb9d5df9b6c1e271" + +[[package]] +name = "color_space" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52fdfaf2bee6357023bf7f95b15a8ef0b82759d2bce705cc45efcae9ae10f0ff" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive-where" +version = "1.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "dmm-tools" +version = "0.1.0" +source = "git+https://github.com/SpaceManiac/SpacemanDMM?rev=6c5a751516ae0e8add4b2aa4388a1e84e96e7082#6c5a751516ae0e8add4b2aa4388a1e84e96e7082" +dependencies = [ + "ahash", + "bumpalo", + "bytemuck", + "dreammaker", + "either", + "indexmap 1.9.3", + "inflate", + "lodepng", + "ndarray", + "rand", +] + [[package]] name = "doxygen-rs" version = "0.4.2" @@ -117,6 +290,29 @@ dependencies = [ "phf", ] +[[package]] +name = "dreammaker" +version = "0.1.0" +source = "git+https://github.com/SpaceManiac/SpacemanDMM?rev=6c5a751516ae0e8add4b2aa4388a1e84e96e7082#6c5a751516ae0e8add4b2aa4388a1e84e96e7082" +dependencies = [ + "ahash", + "bitflags 1.3.2", + "builtins-proc-macro", + "color_space", + "derivative", + "get-size", + "get-size-derive", + "indexmap 1.9.3", + "interval-tree", + "lodepng", + "ordered-float", + "phf", + "serde", + "serde_derive", + "termcolor", + "toml", +] + [[package]] name = "either" version = "1.11.0" @@ -149,6 +345,42 @@ dependencies = [ "once_cell", ] +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "get-size" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b61e2dab7eedce93a83ab3468b919873ff16bac5a3e704011ff836d22b2120" + +[[package]] +name = "get-size-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a1bcfb855c1f340d5913ab542e36f25a1c56f57de79022928297632435dec2" +dependencies = [ + "attribute-derive", + "quote", + "syn 2.0.60", +] + [[package]] name = "getrandom" version = "0.2.14" @@ -166,6 +398,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" @@ -187,6 +425,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.2.6" @@ -194,15 +442,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.5", ] +[[package]] +name = "inflate" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" +dependencies = [ + "adler32", +] + +[[package]] +name = "interpolator" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71dd52191aae121e8611f1e8dc3e324dd0dd1dee1e6dd91d10ee07a3cfb4d9d8" + +[[package]] +name = "interval-tree" +version = "0.8.0" +source = "git+https://github.com/SpaceManiac/SpacemanDMM?rev=6c5a751516ae0e8add4b2aa4388a1e84e96e7082#6c5a751516ae0e8add4b2aa4388a1e84e96e7082" + [[package]] name = "inventory" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -212,6 +489,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + [[package]] name = "lazy_static" version = "1.4.0" @@ -246,12 +529,34 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +[[package]] +name = "lodepng" +version = "3.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2dea7cda68e381418c985fd8f32a9c279a21ae8c715f2376adb20c27a0fad3" +dependencies = [ + "crc32fast", + "flate2", + "libc", + "rgb", +] + [[package]] name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "matrixmultiply" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "memchr" version = "2.7.2" @@ -259,23 +564,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] -name = "milla" -version = "1.0.0" +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "atomic_float", - "bitflags", - "byondapi", - "eyre", - "rand", - "scc", - "thread-priority", + "adler2", ] [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "ndarray" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] [[package]] name = "nom" @@ -287,6 +601,33 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "num_enum" version = "0.7.2" @@ -305,7 +646,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -314,6 +655,15 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + [[package]] name = "phf" version = "0.11.2" @@ -344,7 +694,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -369,7 +719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.60", ] [[package]] @@ -381,6 +731,41 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f59e109e2f795a5070e69578c4dc101068139f74616778025ae1011d4cd41a8" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] + [[package]] name = "proc-macro2" version = "1.0.81" @@ -399,6 +784,29 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "quote-use" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7b5abe3fe82fdeeb93f44d66a7b444dedf2e4827defb0a8e69c437b2de2ef94" +dependencies = [ + "quote", + "quote-use-macros", + "syn 2.0.60", +] + +[[package]] +name = "quote-use-macros" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ea44c7e20f16017a76a245bb42188517e13d16dcb1aa18044bc406cdc3f4af" +dependencies = [ + "derive-where", + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "rand" version = "0.8.5" @@ -429,11 +837,17 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "regex" -version = "1.10.4" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -458,6 +872,15 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -479,19 +902,46 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", "windows-sys", ] +[[package]] +name = "rustlibs" +version = "1.0.0" +dependencies = [ + "atomic_float", + "bitflags 2.5.0", + "byondapi", + "diff", + "dmm-tools", + "eyre", + "fxhash", + "itertools 0.10.5", + "rand", + "regex", + "scc", + "serde", + "serde_json", + "thread-priority", + "walkdir", +] + [[package]] name = "rustversion" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + [[package]] name = "same-file" version = "1.0.6" @@ -522,6 +972,38 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -534,6 +1016,23 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.60" @@ -545,13 +1044,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thread-priority" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d3b04d33c9633b8662b167b847c7ab521f83d1ae20f2321b65b5b925e532e36" dependencies = [ - "bitflags", + "bitflags 2.5.0", "cfg-if", "libc", "log", @@ -559,6 +1067,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.6.5" @@ -571,7 +1088,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -582,6 +1099,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" version = "2.5.0" @@ -722,3 +1245,23 @@ checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 000000000000..06e948f3bec0 --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "rustlibs" +version = "1.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib"] + +[dependencies] +atomic_float = "1.0.0" +bitflags = "2.5.0" +byondapi = { git = "https://github.com/spacestation13/byondapi-rs.git", version = "0.4.7" } +eyre = "0.6.12" +rand = { version = "0.8.5", features = ["small_rng"] } +scc = "2.1.1" +thread-priority = "1.1.0" + +# spacemandmm, also used by strongmandmm +dmmtools = { git = "https://github.com/SpaceManiac/SpacemanDMM", rev = "6c5a751516ae0e8add4b2aa4388a1e84e96e7082", package = "dmm-tools" } +# diffs between two strings/texts/files, used in tests +diff = "0.1" +# general utility lib for iterator operations +itertools = "0.10.5" +# fast hashmap +fxhash = "0.2.1" +# interface for serialization +serde = { version = "1.0", features = ["derive"] } +# json implementation for serde +serde_json = { version = "1.0" } +# utility function for walking through a dir recursively +walkdir = "2.5.0" +# regex +regex = "1.10.5" diff --git a/rust/src/lib.rs b/rust/src/lib.rs new file mode 100644 index 000000000000..66ed4b0b1bbb --- /dev/null +++ b/rust/src/lib.rs @@ -0,0 +1,3 @@ +mod logging; +mod mapmanip; +mod milla; diff --git a/rust/src/logging/mod.rs b/rust/src/logging/mod.rs new file mode 100644 index 000000000000..fc5312ae5941 --- /dev/null +++ b/rust/src/logging/mod.rs @@ -0,0 +1,24 @@ +/// Call stack trace dm method with message. +pub(crate) fn dm_call_stack_trace(msg: String) { + let msg = byondapi::value::ByondValue::try_from(msg).unwrap(); + // this is really ugly, cause we want to get id/ref to a proc name string + // that is already allocated, and don't want to allocate a new string entirely + byondapi::global_call::call_global_id( + { + static STRING_ID: std::sync::OnceLock = std::sync::OnceLock::new(); + *STRING_ID.get_or_init(|| byondapi::byond_string::str_id_of("_stack_trace").unwrap()) + }, + &[msg], + ) + .unwrap(); +} + +/// Panic handler, called on unhandled errors. +/// Writes panic info to a text file, and calls dm stack trace proc as well. +pub(crate) fn setup_panic_handler() { + std::panic::set_hook(Box::new(|info| { + let msg = format!("Panic \n {:#?}", info); + let _ = std::fs::write("./rustlibs_panic.txt", msg.clone()); + dm_call_stack_trace(msg); + })) +} diff --git a/rust/src/mapmanip/.gitignore b/rust/src/mapmanip/.gitignore new file mode 100644 index 000000000000..99912a867148 --- /dev/null +++ b/rust/src/mapmanip/.gitignore @@ -0,0 +1 @@ +test-out/* diff --git a/rust/src/mapmanip/core/map_to_string.rs b/rust/src/mapmanip/core/map_to_string.rs new file mode 100644 index 000000000000..f931d97ac206 --- /dev/null +++ b/rust/src/mapmanip/core/map_to_string.rs @@ -0,0 +1,7 @@ +/// Turns spacemandmm map object to string. +pub fn map_to_string(map: &dmmtools::dmm::Map) -> eyre::Result { + let mut v = vec![]; + map.to_writer(&mut v)?; + let s = String::from_utf8(v)?; + Ok(s) +} diff --git a/rust/src/mapmanip/core/mod.rs b/rust/src/mapmanip/core/mod.rs new file mode 100644 index 000000000000..7aa0dd994c7b --- /dev/null +++ b/rust/src/mapmanip/core/mod.rs @@ -0,0 +1,147 @@ +pub mod to_dict_map; +pub use to_dict_map::to_dict_map; +pub mod to_grid_map; +pub use to_grid_map::to_grid_map; + +pub mod map_to_string; +pub use map_to_string::map_to_string; + +use dmmtools::dmm; +use dmmtools::dmm::Coord3; + +/// A representation of a single tile on a map that may or may not be mapped to an existing key. +#[derive(Clone, Debug, Default)] +pub struct Tile { + /// A key temporarily assigned to the tile until an appropriate new/existing + /// key can be assigned to it, or if it is already being used by a different + /// prefab list in the file. + pub key_suggestion: dmm::Key, + /// The prefabs on the tile. + pub prefabs: Vec, +} + +impl Tile { + /// Return the first /area that exists in the prefab. + pub fn get_area(&self) -> Option<&dmm::Prefab> { + self.prefabs + .iter() + .find(|prefab| prefab.path.starts_with("/area/")) + } + + /// Remove and return the first /area that exists in the prefab. + pub fn remove_area(&mut self) -> Option { + let area = self.get_area().cloned(); + if area.is_some() { + self.prefabs + .retain(|prefab| !prefab.path.starts_with("/area/")) + } + area + } + + /// Return the first /turf that exists in the prefab. + pub fn get_turf(&self) -> Option<&dmm::Prefab> { + self.prefabs + .iter() + .find(|prefab| prefab.path.starts_with("/turf/")) + } + + /// Remove and return the first /turf that exists in the prefab. + pub fn remove_turf(&mut self) -> Option { + let turf = self.get_turf().cloned(); + if turf.is_some() { + self.prefabs + .retain(|prefab| !prefab.path.starts_with("/turf/")) + } + turf + } +} + +/// Thin abstraction over a flat vec, to provide a simple hashmap-like interface, +/// and to translate between 3D dmm coords (start at 1), and 1D flat vec coords (start at 0). +/// The translation is so that it looks better in logs/errors/etc, +/// where shown coords would correspond to coords seen in game or in strongdmm. +#[derive(Clone, Debug)] +pub struct TileGrid { + pub size: Coord3, + pub grid: Vec, +} + +impl TileGrid { + pub fn new(size_x: i32, size_y: i32, size_z: i32) -> TileGrid { + Self { + size: Coord3::new(size_x, size_y, size_z), + grid: vec![Tile::default(); (size_x * size_y * size_z) as usize], + } + } + + pub fn len(&self) -> usize { + self.grid.len() + } + + fn coord_to_index(&self, coord: &Coord3) -> usize { + let coord = Coord3::new(coord.x - 1, coord.y - 1, coord.z - 1); + ((coord.x) + (coord.y * self.size.x) + (coord.z * self.size.x * self.size.y)) as usize + } + + fn index_to_coord(&self, index: usize) -> Coord3 { + let index = index as i32; + Coord3::new( + (index % self.size.x) + 1, + ((index / self.size.x) % self.size.y) + 1, + (index / (self.size.x * self.size.y)) + 1, + ) + } + + pub fn get_mut(&mut self, coord: &Coord3) -> Option<&mut Tile> { + let index = self.coord_to_index(coord); + self.grid.get_mut(index) + } + + pub fn get(&self, coord: &Coord3) -> Option<&Tile> { + self.grid.get(self.coord_to_index(coord)) + } + + pub fn insert(&mut self, coord: &Coord3, tile: Tile) { + *self.get_mut(coord).unwrap() = tile; + } + + pub fn iter(&self) -> impl Iterator { + self.grid + .iter() + .enumerate() + .map(|(i, t)| (self.index_to_coord(i), t)) + } + + pub fn keys(&self) -> impl Iterator + '_ { + self.grid + .iter() + .enumerate() + .map(|(i, _t)| self.index_to_coord(i)) + } + + pub fn values(&self) -> impl Iterator { + self.grid.iter() + } + + pub fn values_mut(&mut self) -> impl Iterator { + self.grid.iter_mut() + } +} + +/// This is analogous to `dmmtools::dmm::Map`, but instead of being structured like dmm maps are, +/// where they have a dictionary of keys-to-prefabs and a separate grid of keys, +/// this is only a direct coord-to-prefab grid. +/// It is not memory efficient, but it allows for much greater flexibility of manipulation. +#[derive(Clone, Debug)] +pub struct GridMap { + /// + pub size: dmm::Coord3, + /// + pub grid: crate::mapmanip::core::TileGrid, +} + +impl GridMap { + pub fn from_file(path: &std::path::Path) -> Option { + Some(to_grid_map(&dmm::Map::from_file(&path).ok()?)) + } +} diff --git a/rust/src/mapmanip/core/to_dict_map.rs b/rust/src/mapmanip/core/to_dict_map.rs new file mode 100644 index 000000000000..6920e6ab6db6 --- /dev/null +++ b/rust/src/mapmanip/core/to_dict_map.rs @@ -0,0 +1,71 @@ +use crate::mapmanip::GridMap; +use dmmtools::dmm::{self, Coord3}; +use eyre::ContextCompat; +use fxhash::FxHashMap; +use std::collections::BTreeSet; + +fn coord3_to_index(coord: dmm::Coord3, size: dmm::Coord3) -> (usize, usize, usize) { + ( + coord.z as usize - 1, + (size.y - coord.y) as usize, + coord.x as usize - 1, + ) +} + +fn int_to_key(i: u16) -> dmm::Key { + // Unsafe is used here to convert basic int to key type, as `dmm::Key` interior var is private. + // This is "safe", as key will always be `u16` to maintain compability with the `dmm` format. + // Could be at some point be made safe when the key type is made public in the `dmm_tools` crate. + unsafe { std::mem::transmute::(i) } +} + +pub fn to_dict_map(grid_map: &GridMap) -> eyre::Result { + let mut dict_map = dmm::Map::new( + grid_map.size.x as usize, + grid_map.size.y as usize, + grid_map.size.z as usize, + "".to_string(), + "".to_string(), + ); + dict_map.dictionary.clear(); + + let mut used_dict_keys = BTreeSet::::new(); + + let mut dictionary_reverse = FxHashMap::, dmm::Key>::default(); + + for tile in grid_map.grid.values() { + if !dictionary_reverse.contains_key(&tile.prefabs) { + if used_dict_keys.contains(&tile.key_suggestion) { + let next_free_key = (0..65534) + .map(int_to_key) + .filter(|k| !used_dict_keys.contains(k)) + .next() + .wrap_err(format!("ran out of free keys"))?; + dictionary_reverse.insert(tile.prefabs.clone(), next_free_key); + used_dict_keys.insert(next_free_key); + } else { + dictionary_reverse.insert(tile.prefabs.clone(), tile.key_suggestion.clone()); + used_dict_keys.insert(tile.key_suggestion.clone()); + } + } + } + + for x in 1..(grid_map.size.x + 1) { + for y in 1..(grid_map.size.y + 1) { + for z in 1..(grid_map.size.z + 1) { + let coord = Coord3::new(x, y, z); + if let Some(tile) = grid_map.grid.get(&coord) { + let key = dictionary_reverse.get(&tile.prefabs).unwrap().clone(); + dict_map.dictionary.insert(key, tile.prefabs.clone()); + dict_map.grid[coord3_to_index(coord, grid_map.size)] = key; + } else { + eyre::bail!("to_dict_map fail; grid map has no coord: {coord:?}"); + } + } + } + } + + dict_map.adjust_key_length(); + + Ok(dict_map) +} diff --git a/rust/src/mapmanip/core/to_grid_map.rs b/rust/src/mapmanip/core/to_grid_map.rs new file mode 100644 index 000000000000..ec8c703f8d82 --- /dev/null +++ b/rust/src/mapmanip/core/to_grid_map.rs @@ -0,0 +1,37 @@ +use super::Tile; +use crate::mapmanip::core::GridMap; +use dmmtools::dmm::{self, Coord3}; +use std::ops::Index; + +fn tuple_to_size(xyz: (usize, usize, usize)) -> Coord3 { + Coord3::new(xyz.0 as i32, xyz.1 as i32, xyz.2 as i32) +} + +pub fn to_grid_map(dict_map: &dmm::Map) -> GridMap { + let mut grid_map = GridMap { + size: tuple_to_size(dict_map.dim_xyz()), + grid: crate::mapmanip::core::TileGrid::new( + dict_map.dim_xyz().0 as i32, + dict_map.dim_xyz().1 as i32, + dict_map.dim_xyz().2 as i32, + ), + }; + + for x in 1..grid_map.size.x + 1 { + for y in 1..grid_map.size.y + 1 { + for z in 1..grid_map.size.z + 1 { + let coord = dmm::Coord3::new(x, y, z); + let key = dict_map.index(coord); + let prefabs = dict_map.dictionary[key].clone(); + let tile = Tile { + key_suggestion: *key, + prefabs, + }; + let coord = dmm::Coord3::new(coord.x, coord.y, coord.z); + grid_map.grid.insert(&coord, tile); + } + } + } + + grid_map +} diff --git a/rust/src/mapmanip/mod.rs b/rust/src/mapmanip/mod.rs new file mode 100644 index 000000000000..70bc79b8cf34 --- /dev/null +++ b/rust/src/mapmanip/mod.rs @@ -0,0 +1,282 @@ +use core::map_to_string; +use core::to_grid_map; +use core::GridMap; + +use byondapi::byond_string; +use byondapi::value::ByondValue; +use eyre::Context; +use eyre::ContextCompat; +use itertools::Itertools; +use rand::prelude::IteratorRandom; +use serde::{Deserialize, Serialize}; +use tools::extract_submap; +use tools::insert_submap; + +use crate::logging::dm_call_stack_trace; +use crate::logging::setup_panic_handler; + +mod core; +mod tools; + +#[cfg(test)] +mod test; + +/// +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum MapManipulation { + SubmapExtractInsert { + submap_size_x: i64, + submap_size_y: i64, + submap_size_z: i64, + submaps_dmm: String, + marker_extract: String, + marker_insert: String, + submaps_can_repeat: bool, + }, +} + +pub fn mapmanip_config_parse(config_path: &std::path::Path) -> eyre::Result> { + // read + let config = std::fs::read_to_string(config_path) + .wrap_err(format!("mapmanip config read err: {config_path:?}"))?; + + // strip comments + // as the jsonc format is "json with comments" + // but serde_json lib can only handle actual json + let re = regex::Regex::new(r"\/\/.*")?; + let config = re.replace_all(&config, ""); + + // parse + let config = serde_json::from_str::>(&config) + .wrap_err(format!("mapmanip config json parse err: {config_path:?}"))?; + + Ok(config) +} + +pub fn mapmanip( + map_dir_path: &std::path::Path, + map: dmmtools::dmm::Map, + config: &Vec, +) -> eyre::Result { + // convert to gridmap + let mut map = to_grid_map(&map); + + // go through all the manipulations in `.jsonc` config for this `.dmm` + for (n, manipulation) in config.iter().enumerate() { + // readable index for errors + let n = n + 1; + let config_len = config.len(); + + match manipulation { + MapManipulation::SubmapExtractInsert { + submap_size_x, + submap_size_y, + submap_size_z, + submaps_dmm, + marker_extract, + marker_insert, + submaps_can_repeat, + } => mapmanip_submap_extract_insert( + map_dir_path, + &mut map, + *submap_size_x, + *submap_size_y, + *submap_size_z, + submaps_dmm, + marker_extract, + marker_insert, + *submaps_can_repeat, + ) + .wrap_err(format!( + "submap extract insert fail; + submaps path: {submaps_dmm:?}; + markers: {marker_extract}, {marker_insert};" + )), + } + .wrap_err(format!("mapmanip fail; manip n is: {n}/{config_len}"))?; + } + + Ok(core::to_dict_map(&map).wrap_err("failed on `to_dict_map`")?) +} + +fn mapmanip_submap_extract_insert( + map_dir_path: &std::path::Path, + map: &mut GridMap, + submap_size_x: i64, + submap_size_y: i64, + submap_size_z: i64, + submaps_dmm: &String, + marker_extract: &String, + marker_insert: &String, + submaps_can_repeat: bool, +) -> eyre::Result<()> { + let submap_size = dmmtools::dmm::Coord3::new( + submap_size_x.try_into().wrap_err("invalid submap_size_x")?, + submap_size_y.try_into().wrap_err("invalid submap_size_y")?, + submap_size_z.try_into().wrap_err("invalid submap_size_z")?, + ); + + // get the submaps map + let submaps_dmm: std::path::PathBuf = submaps_dmm.try_into().wrap_err("invalid path")?; + let submaps_dmm = map_dir_path.join(submaps_dmm); + let submaps_map = GridMap::from_file(&submaps_dmm) + .wrap_err(format!("can't read and parse submap dmm: {submaps_dmm:?}"))?; + + // find all the submap extract markers + let mut marker_extract_coords = vec![]; + for (coord, tile) in submaps_map.grid.iter() { + if tile.prefabs.iter().any(|p| p.path == *marker_extract) { + marker_extract_coords.push(coord); + } + } + + // find all the insert markers + let mut marker_insert_coords = vec![]; + for (coord, tile) in map.grid.iter() { + if tile.prefabs.iter().any(|p| p.path == *marker_insert) { + marker_insert_coords.push(coord); + } + } + + // do all the extracts-inserts + for insert_coord in marker_insert_coords { + // pick a submap + let (extract_coord_index, extract_coord) = marker_extract_coords + .iter() + .cloned() + .enumerate() + .choose(&mut rand::thread_rng()) + .wrap_err(format!( + "can't pick a submap to extract; no more extract markers in the submaps dmm; marker type: {marker_extract}" + ))?; + + // if submaps should not be repeating, remove this one from the list + if !submaps_can_repeat { + marker_extract_coords.remove(extract_coord_index); + } + + // extract that submap from the submap dmm + let extracted = extract_submap(&submaps_map, extract_coord, submap_size) + .wrap_err(format!("submap extraction failed; from {extract_coord}"))?; + + // and insert the submap into the manipulated map + insert_submap(&extracted, insert_coord, map) + .wrap_err(format!("submap insertion failed; at {insert_coord}"))?; + } + + Ok(()) +} + +/// +#[byondapi::bind] +fn mapmanip_read_dmm_file(path: ByondValue) { + internal_mapmanip_read_dmm_file(path) +} + +pub(crate) fn internal_mapmanip_read_dmm_file(path: ByondValue) -> eyre::Result { + setup_panic_handler(); + + let path: String = path + .get_string() + .wrap_err(format!("path arg is not a string: {:?}", path))?; + let path: std::path::PathBuf = path + .clone() + .try_into() + .wrap_err(format!("path arg is not a valid file path: {}", path))?; + + // just return null if path is bad for whatever reason + if !path.is_file() || !path.exists() { + return Ok(ByondValue::null()); + } + + // read file and parse with spacemandmm + let mut dmm = dmmtools::dmm::Map::from_file(&path).wrap_err(format!( + "spacemandmm parsing error; dmm file path: {path:?}; see error from spacemandmm below for more information" + ))?; + + // do mapmanip if defined for this dmm + let path_mapmanip_config = { + let mut p = path.clone(); + p.set_extension("jsonc"); + p + }; + if path_mapmanip_config.exists() { + // get path for dir of this dmm + let path_dir = path.parent().wrap_err("no parent")?; + // parse config + let config = crate::mapmanip::mapmanip_config_parse(&path_mapmanip_config).wrap_err( + format!("config parse fail; path: {:?}", path_mapmanip_config), + )?; + // do actual map manipulation + dmm = crate::mapmanip::mapmanip(path_dir, dmm, &config) + .wrap_err(format!("mapmanip fail; dmm file path: {path:?}"))?; + } + + // convert the map back to a string + let dmm = crate::mapmanip::core::map_to_string(&dmm).wrap_err(format!( + "error in converting map back to string; dmm file path: {path:?}" + ))?; + + // and return it + Ok(ByondValue::new_str(dmm)?) +} + +/// +#[no_mangle] +pub unsafe extern "C" fn read_dmm_file_ffi( + argc: byondapi::sys::u4c, + argv: *mut byondapi::value::ByondValue, +) -> byondapi::value::ByondValue { + setup_panic_handler(); + let args = unsafe { ::byondapi::parse_args(argc, argv) }; + match crate::mapmanip::internal_mapmanip_read_dmm_file( + args.get(0).map(ByondValue::clone).unwrap_or_default(), + ) { + Ok(val) => val, + Err(info) => { + dm_call_stack_trace(format!("Rustlibs ERROR read_dmm_file_ffi() \n {info:#?}")); + ByondValue::null() + } + } +} + +/// To be used by the `tools/rustlib_tools/mapmanip.ps1` script. +/// Not to be called from the game server, so bad error-handling is fine. +/// This should run map manipulations on every `.dmm` map that has a `.jsonc` config file, +/// and write it to a `.mapmanipout.dmm` file in the same location. +#[no_mangle] +pub unsafe extern "C" fn all_mapmanip_configs_execute_ffi() { + let mapmanip_configs = walkdir::WalkDir::new("./_maps") + .into_iter() + .map(|d| d.unwrap().path().to_owned()) + .filter(|p| p.extension().is_some()) + .filter(|p| p.extension().unwrap() == "jsonc") + .collect_vec(); + assert_ne!(mapmanip_configs.len(), 0); + + for config_path in mapmanip_configs { + let dmm_path = { + let mut p = config_path.clone(); + p.set_extension("dmm"); + p + }; + + let path_dir: &std::path::Path = dmm_path.parent().unwrap(); + + let mut dmm = dmmtools::dmm::Map::from_file(&dmm_path).unwrap(); + + let config = crate::mapmanip::mapmanip_config_parse(&config_path).unwrap(); + + dmm = crate::mapmanip::mapmanip(path_dir, dmm, &config).unwrap(); + + let dmm = map_to_string(&dmm).unwrap(); + + let dmm_out_path = { + let mut p = dmm_path.clone(); + p.set_extension("mapmanipout.dmm"); + p + }; + std::fs::write(dmm_out_path, dmm).unwrap(); + } +} diff --git a/rust/src/mapmanip/test-in/_tiny_test_map.dmm b/rust/src/mapmanip/test-in/_tiny_test_map.dmm new file mode 100644 index 000000000000..48ad3798f2d9 --- /dev/null +++ b/rust/src/mapmanip/test-in/_tiny_test_map.dmm @@ -0,0 +1,359 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/marble, +/area/space) +"b" = ( +/obj/random/mre, +/turf/simulated/floor/shuttle, +/area/space) +"f" = ( +/obj/random/energy, +/turf/simulated/wall, +/area/space) +"j" = ( +/obj/random/energy_antag, +/turf/simulated/wall, +/area/space) +"k" = ( +/obj/random/action_figure, +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"n" = ( +/obj/random/mre, +/turf/simulated/floor/marble, +/area/space) +"o" = ( +/obj/random/mre, +/turf/simulated/wall, +/area/space) +"p" = ( +/obj/random/handgun, +/turf/simulated/floor/marble, +/area/space) +"q" = ( +/obj/random/action_figure, +/turf/simulated/floor/shuttle, +/area/space) +"r" = ( +/obj/random/action_figure, +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) +"s" = ( +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"u" = ( +/obj/random/handgun, +/turf/simulated/wall, +/area/space) +"y" = ( +/obj/random/glowstick, +/turf/simulated/floor/marble, +/area/space) +"z" = ( +/obj/random/firstaid, +/turf/simulated/floor/marble, +/area/space) +"B" = ( +/turf/simulated/floor/lino/diamond, +/area/space) +"E" = ( +/turf/simulated/wall, +/area/space) +"F" = ( +/turf/simulated/floor/shuttle, +/area/space) +"G" = ( +/obj/random/finances, +/turf/simulated/wall, +/area/space) +"H" = ( +/obj/random/gift, +/turf/simulated/floor/marble, +/area/space) +"J" = ( +/obj/random/chameleon, +/turf/simulated/floor/shuttle, +/area/space) +"Q" = ( +/obj/aiming_overlay, +/turf/simulated/floor/marble, +/area/space) +"S" = ( +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) +"U" = ( +/obj/random/mre, +/turf/simulated/floor/lino/diamond, +/area/space) +"W" = ( +/obj/random/chameleon, +/turf/simulated/floor/lino/diamond, +/area/space) +"Y" = ( +/obj/random/action_figure, +/turf/simulated/floor/marble, +/area/space) +"Z" = ( +/obj/random/chameleon, +/turf/simulated/floor/marble, +/area/space) + +(1,1,1) = {" +E +j +j +E +E +E +E +E +E +E +E +E +G +G +a +"} +(2,1,1) = {" +f +B +B +B +B +B +B +B +B +B +B +B +B +B +z +"} +(3,1,1) = {" +f +B +B +B +B +Q +a +a +a +a +a +a +a +B +z +"} +(4,1,1) = {" +E +B +B +a +a +Q +B +B +B +B +B +B +B +B +a +"} +(5,1,1) = {" +E +B +s +Y +B +S +B +B +B +B +B +s +B +F +a +"} +(6,1,1) = {" +E +s +s +Y +s +S +s +B +B +B +B +s +B +F +a +"} +(7,1,1) = {" +E +B +B +a +B +r +s +k +k +B +B +s +B +F +a +"} +(8,1,1) = {" +E +W +a +a +B +S +B +B +k +k +B +s +F +F +a +"} +(9,1,1) = {" +o +W +n +U +U +S +U +U +U +s +k +U +b +U +n +"} +(10,1,1) = {" +E +W +Z +B +B +B +B +B +B +B +k +B +F +B +a +"} +(11,1,1) = {" +E +B +Z +W +B +B +B +B +B +B +q +F +F +B +a +"} +(12,1,1) = {" +E +B +B +W +W +B +B +F +F +F +F +s +B +B +a +"} +(13,1,1) = {" +u +B +B +B +B +J +J +J +B +B +B +s +B +B +H +"} +(14,1,1) = {" +u +B +B +B +F +F +B +W +W +B +B +B +s +B +H +"} +(15,1,1) = {" +a +p +p +a +a +a +a +a +a +a +a +a +y +y +a +"} diff --git a/rust/src/mapmanip/test-in/extracted.dmm b/rust/src/mapmanip/test-in/extracted.dmm new file mode 100644 index 000000000000..4df41ac838ea --- /dev/null +++ b/rust/src/mapmanip/test-in/extracted.dmm @@ -0,0 +1,115 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/lino/diamond, +/area/space) +"b" = ( +/obj/random/action_figure, +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) +"k" = ( +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"p" = ( +/turf/simulated/floor/marble, +/area/space) +"u" = ( +/obj/aiming_overlay, +/turf/simulated/floor/marble, +/area/space) +"G" = ( +/obj/random/mre, +/turf/simulated/floor/lino/diamond, +/area/space) +"H" = ( +/obj/random/chameleon, +/turf/simulated/floor/shuttle, +/area/space) +"L" = ( +/obj/random/action_figure, +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"N" = ( +/turf/simulated/floor/shuttle, +/area/space) +"R" = ( +/obj/random/chameleon, +/turf/simulated/floor/lino/diamond, +/area/space) +"T" = ( +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) + +(1,1,1) = {" +p +u +a +a +a +"} +(2,1,1) = {" +a +T +a +a +a +"} +(3,1,1) = {" +k +T +k +a +a +"} +(4,1,1) = {" +a +b +k +L +L +"} +(5,1,1) = {" +a +T +a +a +L +"} +(6,1,1) = {" +G +T +G +G +G +"} +(7,1,1) = {" +a +a +a +a +a +"} +(8,1,1) = {" +a +a +a +a +a +"} +(9,1,1) = {" +R +a +a +N +N +"} +(10,1,1) = {" +a +H +H +H +a +"} diff --git a/rust/src/mapmanip/test-in/inserted.dmm b/rust/src/mapmanip/test-in/inserted.dmm new file mode 100644 index 000000000000..dad09b97a864 --- /dev/null +++ b/rust/src/mapmanip/test-in/inserted.dmm @@ -0,0 +1,355 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/simulated/floor/marble, +/area/space) +"b" = ( +/obj/random/mre, +/turf/simulated/floor/shuttle, +/area/space) +"f" = ( +/obj/random/energy, +/turf/simulated/wall, +/area/space) +"j" = ( +/obj/random/energy_antag, +/turf/simulated/wall, +/area/space) +"k" = ( +/obj/random/action_figure, +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"n" = ( +/obj/random/mre, +/turf/simulated/floor/marble, +/area/space) +"o" = ( +/obj/random/mre, +/turf/simulated/wall, +/area/space) +"p" = ( +/obj/random/handgun, +/turf/simulated/floor/marble, +/area/space) +"r" = ( +/obj/random/action_figure, +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) +"s" = ( +/obj/random/action_figure, +/turf/simulated/floor/lino/diamond, +/area/space) +"u" = ( +/obj/random/handgun, +/turf/simulated/wall, +/area/space) +"y" = ( +/obj/random/glowstick, +/turf/simulated/floor/marble, +/area/space) +"z" = ( +/obj/random/firstaid, +/turf/simulated/floor/marble, +/area/space) +"B" = ( +/turf/simulated/floor/lino/diamond, +/area/space) +"E" = ( +/turf/simulated/wall, +/area/space) +"F" = ( +/turf/simulated/floor/shuttle, +/area/space) +"G" = ( +/obj/random/finances, +/turf/simulated/wall, +/area/space) +"H" = ( +/obj/random/gift, +/turf/simulated/floor/marble, +/area/space) +"J" = ( +/obj/random/chameleon, +/turf/simulated/floor/shuttle, +/area/space) +"Q" = ( +/obj/aiming_overlay, +/turf/simulated/floor/marble, +/area/space) +"S" = ( +/obj/aiming_overlay, +/turf/simulated/floor/lino/diamond, +/area/space) +"U" = ( +/obj/random/mre, +/turf/simulated/floor/lino/diamond, +/area/space) +"W" = ( +/obj/random/chameleon, +/turf/simulated/floor/lino/diamond, +/area/space) +"Y" = ( +/obj/random/action_figure, +/turf/simulated/floor/marble, +/area/space) +"Z" = ( +/obj/random/chameleon, +/turf/simulated/floor/marble, +/area/space) + +(1,1,1) = {" +E +j +j +E +E +E +E +E +E +E +E +E +G +G +a +"} +(2,1,1) = {" +f +B +B +B +B +B +B +B +B +B +B +B +B +B +z +"} +(3,1,1) = {" +f +B +B +B +B +Q +a +a +a +a +a +a +a +B +z +"} +(4,1,1) = {" +E +B +B +a +a +Q +B +B +B +B +B +B +B +B +a +"} +(5,1,1) = {" +E +B +s +Y +B +S +B +B +B +B +B +s +B +F +a +"} +(6,1,1) = {" +E +s +s +Y +s +S +s +a +Q +B +B +B +B +F +a +"} +(7,1,1) = {" +E +B +B +a +B +r +s +B +S +B +B +B +B +F +a +"} +(8,1,1) = {" +E +W +a +a +B +S +B +s +S +s +B +B +F +F +a +"} +(9,1,1) = {" +o +W +n +U +U +S +U +B +r +s +k +k +b +U +n +"} +(10,1,1) = {" +E +W +Z +B +B +B +B +B +S +B +B +k +F +B +a +"} +(11,1,1) = {" +E +B +Z +W +B +B +B +U +S +U +U +U +F +B +a +"} +(12,1,1) = {" +E +B +B +W +W +B +B +B +B +B +B +B +B +B +a +"} +(13,1,1) = {" +u +B +B +B +B +J +J +B +B +B +B +B +B +B +H +"} +(14,1,1) = {" +u +B +B +B +F +F +B +W +B +B +F +F +s +B +H +"} +(15,1,1) = {" +a +p +p +a +a +a +a +B +J +J +J +B +y +y +a +"} diff --git a/rust/src/mapmanip/test.rs b/rust/src/mapmanip/test.rs new file mode 100644 index 000000000000..5f1076d913ab --- /dev/null +++ b/rust/src/mapmanip/test.rs @@ -0,0 +1,163 @@ +use dmmtools::dmm::{self, Coord3}; +use itertools::Itertools; + +use super::all_mapmanip_configs_execute_ffi; + +fn print_diff(left: &str, right: &str) { + for (i, diff) in diff::lines(&left, &right).iter().enumerate() { + match diff { + diff::Result::Left(l) => println!("{} diff - : {}", i, l), + diff::Result::Both(l, r) => { + assert_eq!(l, r); + } + diff::Result::Right(r) => println!("{} diff + : {}", i, r), + } + } +} + +fn all_test_dmm() -> Vec { + std::fs::read_dir("src/mapmanip/test-in") + .unwrap() + .map(|r| r.unwrap().path()) + .filter(|p| p.extension().unwrap() == "dmm") + .sorted() + .collect_vec() +} + +#[test] +fn to_grid_and_back() { + for path in all_test_dmm() { + println!("path: {}", path.display()); + + let dict_map_original = dmmtools::dmm::Map::from_file(&path).unwrap(); + let grid_map = crate::mapmanip::core::to_grid_map(&dict_map_original); + let dict_map_again = crate::mapmanip::core::to_dict_map(&grid_map).unwrap(); + let map_str_original = crate::mapmanip::core::map_to_string(&dict_map_original).unwrap(); + let map_str_from_grid = crate::mapmanip::core::map_to_string(&dict_map_again).unwrap(); + + dict_map_again + .to_file(&std::path::Path::new("src/mapmanip/test-out").join(path.file_name().unwrap())) + .unwrap(); + + print_diff(&map_str_original, &map_str_from_grid); + + if map_str_original != map_str_from_grid { + assert!(false); + } + } +} + +#[test] +fn extract() { + let path_src = std::path::Path::new("src/mapmanip/test-in/_tiny_test_map.dmm"); + let path_xtr = std::path::Path::new("src/mapmanip/test-in/extracted.dmm"); + let path_xtr_out = std::path::Path::new("src/mapmanip/test-out/extracted_out.dmm"); + + let dict_map_src = dmmtools::dmm::Map::from_file(&path_src).unwrap(); + let dict_map_xtr_expected = dmmtools::dmm::Map::from_file(&path_xtr).unwrap(); + + let grid_map_src = crate::mapmanip::core::to_grid_map(&dict_map_src); + let grid_map_xtr = crate::mapmanip::tools::extract_submap( + &grid_map_src, + Coord3::new(4, 7, 1), + Coord3::new(10, 5, 1), + ) + .unwrap(); + let grid_map_xtr_expected = crate::mapmanip::core::to_grid_map(&dict_map_xtr_expected); + + let dict_map_xtr = crate::mapmanip::core::to_dict_map(&grid_map_xtr).unwrap(); + dict_map_xtr.to_file(path_xtr_out).unwrap(); + + assert_eq!( + grid_map_xtr_expected.grid.keys().collect::>(), + grid_map_xtr.grid.keys().collect::>(), + ); + + for key in grid_map_xtr_expected.grid.keys() { + let tile_xtr_expected = grid_map_xtr_expected.grid.get(&key).unwrap(); + let tile_xtr = grid_map_xtr.grid.get(&key).unwrap(); + assert_eq!(tile_xtr_expected.prefabs, tile_xtr.prefabs); + } +} + +#[test] +fn insert() { + let path_xtr = std::path::Path::new("src/mapmanip/test-in/extracted.dmm"); + let path_dst = std::path::Path::new("src/mapmanip/test-in/_tiny_test_map.dmm"); + let path_dst_expected = std::path::Path::new("src/mapmanip/test-in/inserted.dmm"); + + let grid_map_dst_expected = + crate::mapmanip::core::GridMap::from_file(&path_dst_expected).unwrap(); + let grid_map_xtr = crate::mapmanip::core::GridMap::from_file(&path_xtr).unwrap(); + let mut grid_map_dst = crate::mapmanip::core::GridMap::from_file(&path_dst).unwrap(); + crate::mapmanip::tools::insert_submap(&grid_map_xtr, Coord3::new(6, 4, 1), &mut grid_map_dst) + .unwrap(); + + assert_eq!( + grid_map_dst_expected.grid.keys().collect::>(), + grid_map_dst.grid.keys().collect::>(), + ); + + for key in grid_map_dst_expected.grid.keys() { + let tile_dst_expected = grid_map_dst_expected.grid.get(&key).unwrap(); + let tile_dst = grid_map_dst.grid.get(&key).unwrap(); + assert_eq!(tile_dst_expected.prefabs, tile_dst.prefabs); + } +} + +#[test] +fn keys_deduplicated() { + // make sure that if multiple tiles have the same key_suggestion + // they get assigned different keys + + let path_src = std::path::Path::new("src/mapmanip/test-in/_tiny_test_map.dmm"); + let dict_map_src = dmmtools::dmm::Map::from_file(&path_src).unwrap(); + let grid_map_src = crate::mapmanip::core::to_grid_map(&dict_map_src); + + let mut grid_map_out = crate::mapmanip::core::to_grid_map(&dict_map_src); + for tile in grid_map_out.grid.values_mut() { + tile.key_suggestion = dmm::Key::default(); + } + let dict_map_out = crate::mapmanip::core::to_dict_map(&grid_map_out).unwrap(); + let grid_map_out = crate::mapmanip::core::to_grid_map(&dict_map_out); + + for key in grid_map_src.grid.keys() { + let tile_src = grid_map_src.grid.get(&key).unwrap(); + let tile_out = grid_map_out.grid.get(&key).unwrap(); + assert_eq!(tile_src.prefabs, tile_out.prefabs); + } + + assert_eq!(dict_map_src.dictionary.len(), dict_map_out.dictionary.len()) +} + +#[test] +fn mapmanip_configs_parse() { + let foo = vec![crate::mapmanip::MapManipulation::SubmapExtractInsert { + submap_size_x: 1, + submap_size_y: 2, + submap_size_z: 3, + submaps_dmm: "a".to_owned(), + marker_extract: "b".to_owned(), + marker_insert: "c".to_owned(), + submaps_can_repeat: true, + }]; + dbg!(serde_json::to_string(&foo).unwrap()); + + let mapmanip_configs = walkdir::WalkDir::new("../../maps") + .into_iter() + .map(|d| d.unwrap().path().to_owned()) + .filter(|p| p.extension().is_some()) + .filter(|p| p.extension().unwrap() == "jsonc") + .collect_vec(); + assert_ne!(mapmanip_configs.len(), 0); + for config in mapmanip_configs { + let _ = crate::mapmanip::mapmanip_config_parse(&config); + } +} + +#[test] +fn mapmanip_configs_execute() { + // this is only "unsafe" cause that function is `extern "C"` + // it does not do anything actually unsafe + unsafe { all_mapmanip_configs_execute_ffi() } +} diff --git a/rust/src/mapmanip/tools/extract_submap.rs b/rust/src/mapmanip/tools/extract_submap.rs new file mode 100644 index 000000000000..30e7e9806384 --- /dev/null +++ b/rust/src/mapmanip/tools/extract_submap.rs @@ -0,0 +1,37 @@ +use crate::mapmanip::core::GridMap; +use dmmtools::dmm; +use dmmtools::dmm::Coord3; +use eyre::ContextCompat; + +/// Returns part of map of `xtr_size` and at `xtr_coord` from `src_map`. +pub fn extract_submap( + src_map: &GridMap, + xtr_coord: dmm::Coord3, + xtr_size: dmm::Coord3, +) -> eyre::Result { + let mut dst_map = GridMap { + size: xtr_size, + grid: crate::mapmanip::core::TileGrid::new(xtr_size.x, xtr_size.y, xtr_size.z), + }; + + for x in 1..(xtr_size.x + 1) { + for y in 1..(xtr_size.y + 1) { + for z in 1..(xtr_size.z + 1) { + let src_x = xtr_coord.x + x - 1; + let src_y = xtr_coord.y + y - 1; + let src_z = xtr_coord.z + z - 1; + + let tile = src_map + .grid + .get(&Coord3::new(src_x, src_y, src_z)) + .wrap_err(format!( + "cannot extract submap; coords out of bounds; x: {src_x}; y: {src_y}; z: {src_z}" + ))?; + + dst_map.grid.insert(&Coord3::new(x, y, z), tile.clone()); + } + } + } + + Ok(dst_map) +} diff --git a/rust/src/mapmanip/tools/insert_submap.rs b/rust/src/mapmanip/tools/insert_submap.rs new file mode 100644 index 000000000000..e840f9920f33 --- /dev/null +++ b/rust/src/mapmanip/tools/insert_submap.rs @@ -0,0 +1,75 @@ +use crate::mapmanip::GridMap; +use dmmtools::dmm; +use dmmtools::dmm::Coord3; +use eyre::ContextCompat; + +/// Takes `src_map` and puts it at `coord` in `dst_map`. +/// Noop area and turf have special handling: `/area/template_noop` and `/turf/template_noop`. +/// If a `src` tile has noop area, then it uses the mapped in `dst` area instead of replacing it. +/// If a `src` tile has noop turf, then it uses the mapped in `dst` turf instead of replacing it, +/// and additionally also merges `src` objects and mobs with the `dst` mapped in ones. +pub fn insert_submap( + src_map: &GridMap, + coord: dmm::Coord3, + dst_map: &mut GridMap, +) -> eyre::Result<()> { + for x in 1..(src_map.size.x + 1) { + for y in 1..(src_map.size.y + 1) { + for z in 1..(src_map.size.z + 1) { + let coord_src = Coord3::new(x, y, z); + let coord_dst = Coord3::new(coord.x + x - 1, coord.y + y - 1, coord.z + z - 1); + + // get src tile + let mut tile_src = src_map + .grid + .get(&coord_src) + .wrap_err(format!( + "src submap coord out of bounds: {coord_src}; {}; {};", + src_map.size, + src_map.grid.len(), + ))? + .clone(); + + // remove area and turf from src tile + let tile_src_area = tile_src.remove_area().wrap_err("submap tile has no area")?; + let tile_src_turf = tile_src.remove_turf().wrap_err("submap tile has no turf")?; + + let tile_src_area_is_noop = { tile_src_area.path == "/area/template_noop" }; + let tile_src_turf_is_noop = { tile_src_turf.path == "/turf/template_noop" }; + + // get dst tile + let tile_dst = dst_map.grid.get_mut(&coord_dst).wrap_err(format!( + "cannot insert submap tile; coord out of bounds; x: {x}; y: {y};" + ))?; + + // remove area and turf from dst tile + let tile_dst_area = tile_dst.remove_area().wrap_err("map tile has no area")?; + let tile_dst_turf = tile_dst.remove_turf().wrap_err("map tile has no turf")?; + + // get new area + let new_area = if tile_src_area_is_noop { + tile_dst_area + } else { + tile_src_area + }; + + // get new turf, AND, append/replace other atoms into dst tile + let new_turf = if tile_src_turf_is_noop { + tile_dst.prefabs.append(&mut tile_src.prefabs); + tile_dst_turf + } else { + tile_dst.prefabs = tile_src.prefabs; + tile_src_turf + }; + + // push selected new turf and area to dst tile + // do note that in dmm file format + // turf and area have to be the two last elements in a prefab + tile_dst.prefabs.push(new_turf); + tile_dst.prefabs.push(new_area); + } + } + } + + Ok(()) +} diff --git a/rust/src/mapmanip/tools/mod.rs b/rust/src/mapmanip/tools/mod.rs new file mode 100644 index 000000000000..c3688d31986b --- /dev/null +++ b/rust/src/mapmanip/tools/mod.rs @@ -0,0 +1,5 @@ +mod extract_submap; +pub use extract_submap::extract_submap; + +mod insert_submap; +pub use insert_submap::insert_submap; diff --git a/milla/src/api.rs b/rust/src/milla/api.rs similarity index 96% rename from milla/src/api.rs rename to rust/src/milla/api.rs index 53e63d4a17a9..b5393a58859a 100644 --- a/milla/src/api.rs +++ b/rust/src/milla/api.rs @@ -1,9 +1,9 @@ -use crate::constants::*; -use crate::conversion; use crate::logging; -use crate::model::*; -use crate::statics::*; -use crate::tick; +use crate::milla::constants::*; +use crate::milla::conversion; +use crate::milla::model::*; +use crate::milla::statics::*; +use crate::milla::tick; use byondapi::global_call::call_global; use byondapi::map::byond_xyz; use byondapi::prelude::*; @@ -14,7 +14,7 @@ use std::time::Instant; /// BYOND API for ensuring the buffers are usable. #[byondapi::bind] -fn initialize(byond_z: ByondValue) { +fn milla_initialize(byond_z: ByondValue) { logging::setup_panic_handler(); let z = f32::try_from(byond_z)? as i32 - 1; internal_initialize(z)?; @@ -36,7 +36,7 @@ pub(crate) fn internal_initialize(z: i32) -> Result<(), eyre::Error> { /// BYOND API for defining an environment that a tile can be exposed to. #[byondapi::bind] -fn create_environment( +fn milla_create_environment( oxygen: ByondValue, carbon_dioxide: ByondValue, nitrogen: ByondValue, @@ -96,7 +96,7 @@ pub(crate) fn internal_create_environment( /// BYOND API for setting the atmos details of a tile. #[byondapi::bind] -fn set_tile( +fn milla_set_tile( turf: ByondValue, airtight_north: ByondValue, airtight_east: ByondValue, @@ -143,7 +143,7 @@ fn set_tile( /// BYOND API for setting the directions a tile is airtight in. /// Like set_tile, just with a smaller set of fields. #[byondapi::bind] -fn set_tile_airtight( +fn milla_set_tile_airtight( turf: ByondValue, airtight_north: ByondValue, airtight_east: ByondValue, @@ -239,7 +239,7 @@ pub(crate) fn internal_set_tile( }; } } - 3 => tile.mode = AtmosMode::NoDecay, + 3 => tile.mode = AtmosMode::NoDecay, _ => return Err(eyre!("Invalid atmos_mode: {}", value)), } } @@ -278,7 +278,7 @@ pub(crate) fn internal_set_tile( /// BYOND API for fetching the atmos details of a tile. #[byondapi::bind] -fn get_tile(turf: ByondValue, list: ByondValue) { +fn milla_get_tile(turf: ByondValue, list: ByondValue) { logging::setup_panic_handler(); let (x, y, z) = byond_xyz(&turf)?.coordinates(); let tile = internal_get_tile(x as i32 - 1, y as i32 - 1, z as i32 - 1)?; @@ -308,7 +308,7 @@ pub(crate) fn internal_get_tile(x: i32, y: i32, z: i32) -> Result { /// * Turfs that just passed the threshold for showing plasma or sleeping gas. /// * Turfs with strong airflow out. #[byondapi::bind] -fn get_interesting_tiles() { +fn milla_get_interesting_tiles() { logging::setup_panic_handler(); let interesting_tiles = INTERESTING_TILES.lock().unwrap(); let byond_interesting_tiles = interesting_tiles @@ -320,7 +320,7 @@ fn get_interesting_tiles() { /// BYOND API for getting a single random interesting tile. #[byondapi::bind] -fn get_random_interesting_tile() { +fn milla_get_random_interesting_tile() { logging::setup_panic_handler(); let interesting_tiles = INTERESTING_TILES.lock().unwrap(); let length = interesting_tiles.len() as f32; @@ -336,7 +336,7 @@ fn get_random_interesting_tile() { /// BYOND API for capping the superconductivity of a tile. #[byondapi::bind] -fn reduce_superconductivity( +fn milla_reduce_superconductivity( turf: ByondValue, north: ByondValue, east: ByondValue, @@ -404,7 +404,7 @@ pub(crate) fn internal_reduce_superconductivity( /// BYOND API for resetting the superconductivity of a tile. #[byondapi::bind] -fn reset_superconductivity(turf: ByondValue) { +fn milla_reset_superconductivity(turf: ByondValue) { let (x, y, z) = byond_xyz(&turf)?.coordinates(); internal_reset_superconductivity(x as i32 - 1, y as i32 - 1, z as i32 - 1)?; Ok(Default::default()) @@ -436,7 +436,7 @@ pub(crate) fn internal_reset_superconductivity(x: i32, y: i32, z: i32) -> Result /// BYOND API for starting an atmos tick. #[byondapi::bind] -fn spawn_tick_thread() { +fn milla_spawn_tick_thread() { logging::setup_panic_handler(); thread::spawn(|| -> Result<(), eyre::Error> { let now = Instant::now(); @@ -454,7 +454,7 @@ fn spawn_tick_thread() { /// BYOND API for asking how long the prior tick took. #[byondapi::bind] -fn get_tick_time() { +fn milla_get_tick_time() { logging::setup_panic_handler(); Ok(ByondValue::from( TICK_TIME.load(std::sync::atomic::Ordering::Relaxed) as f32, diff --git a/milla/src/constants.rs b/rust/src/milla/constants.rs similarity index 100% rename from milla/src/constants.rs rename to rust/src/milla/constants.rs diff --git a/milla/src/conversion.rs b/rust/src/milla/conversion.rs similarity index 100% rename from milla/src/conversion.rs rename to rust/src/milla/conversion.rs diff --git a/milla/src/lib.rs b/rust/src/milla/mod.rs similarity index 97% rename from milla/src/lib.rs rename to rust/src/milla/mod.rs index 7c2e81ff85d9..d0b90b51541f 100644 --- a/milla/src/lib.rs +++ b/rust/src/milla/mod.rs @@ -6,11 +6,9 @@ //! MILLA takes the majority of atmos out of BYOND and puts it here, in Rust code. //! It stores its own model of the air distribution, and BYOND will call in to view and make //! adjustments, as well as to trigger atmos ticks. - mod api; mod constants; mod conversion; -mod logging; mod model; mod simulate; mod statics; diff --git a/milla/src/model.rs b/rust/src/milla/model.rs similarity index 99% rename from milla/src/model.rs rename to rust/src/milla/model.rs index 8f559783e27f..13044a6d879c 100644 --- a/milla/src/model.rs +++ b/rust/src/milla/model.rs @@ -1,4 +1,4 @@ -use crate::constants::*; +use crate::milla::constants::*; use atomic_float::AtomicF32; use bitflags::bitflags; use byondapi::map::{byond_locatexyz, ByondXYZ}; diff --git a/milla/src/simulate.rs b/rust/src/milla/simulate.rs similarity index 99% rename from milla/src/simulate.rs rename to rust/src/milla/simulate.rs index b8c88dc80aa6..b663b77f7081 100644 --- a/milla/src/simulate.rs +++ b/rust/src/milla/simulate.rs @@ -1,5 +1,5 @@ -use crate::constants::*; -use crate::model::*; +use crate::milla::constants::*; +use crate::milla::model::*; use byondapi::map::ByondXYZ; use eyre::eyre; use scc::Bag; @@ -437,7 +437,7 @@ pub(crate) fn apply_tile_mode( my_inactive_tile.thermal_energy *= 1.0 - SPACE_COOLING_FACTOR; } } - AtmosMode::NoDecay => {} // No special interactions + AtmosMode::NoDecay => {} // No special interactions } Ok(()) } diff --git a/milla/src/statics.rs b/rust/src/milla/statics.rs similarity index 95% rename from milla/src/statics.rs rename to rust/src/milla/statics.rs index 76a0305abfec..4ecdd702c1b8 100644 --- a/milla/src/statics.rs +++ b/rust/src/milla/statics.rs @@ -1,4 +1,4 @@ -use crate::model::*; +use crate::milla::model::*; use std::sync::{atomic::AtomicUsize, Mutex, OnceLock}; /// The buffers that contain the atmos model. diff --git a/milla/src/tick.rs b/rust/src/milla/tick.rs similarity index 99% rename from milla/src/tick.rs rename to rust/src/milla/tick.rs index b8a6991102f7..bc9afafff1f8 100644 --- a/milla/src/tick.rs +++ b/rust/src/milla/tick.rs @@ -1,7 +1,7 @@ -use crate::constants::*; -use crate::model::*; -use crate::simulate; -use crate::statics::*; +use crate::milla::constants::*; +use crate::milla::model::*; +use crate::milla::simulate; +use crate::milla::statics::*; use scc::Bag; use std::sync::RwLock; use std::thread; diff --git a/rustlibs.dll b/rustlibs.dll new file mode 100644 index 000000000000..2390f2853c5a Binary files /dev/null and b/rustlibs.dll differ diff --git a/tgui/package.json b/tgui/package.json index 798232a65ad4..6c4db999354a 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -47,7 +47,7 @@ "style-loader": "^4.0.0", "terser-webpack-plugin": "^5.3.10", "typescript": "^5.5.3", - "webpack": "^5.93.0", + "webpack": "^5.94.0", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4" } diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index 5dc920a2b430..ad35f7c6a035 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -4,7 +4,7 @@ "version": "4.5.1-paradise", "dependencies": { "common": "workspace:*", - "dompurify": "2.5.0", + "dompurify": "2.5.4", "inferno": "^8.2.3", "tgui": "workspace:*", "tgui-dev-server": "workspace:*", diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index bd6f319006bc..9fe1abdec63a 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -201,6 +201,10 @@ h2.alert { color: #000; } +.announcement.sec h1 { + color: #f00; +} + .boldannounceic { color: #ff0000; } diff --git a/tgui/packages/tgui/interfaces/MiningVendor.js b/tgui/packages/tgui/interfaces/MiningVendor.js index 2f9916b3357a..a48cfeea1a28 100644 --- a/tgui/packages/tgui/interfaces/MiningVendor.js +++ b/tgui/packages/tgui/interfaces/MiningVendor.js @@ -1,6 +1,6 @@ import { createSearch } from 'common/string'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, Collapsible, Dropdown, Stack, Input, NoticeBox, Section } from '../components'; +import { Box, Button, Collapsible, Dropdown, Stack, Input, ImageButton, NoticeBox, Section } from '../components'; import { Window } from '../layouts'; const sortTypes = { @@ -10,13 +10,14 @@ const sortTypes = { }; export const MiningVendor = (_properties, _context) => { + const [gridLayout, setGridLayout] = useLocalState(_context, 'gridLayout', false); return ( - + - - + + @@ -64,6 +65,7 @@ const MiningVendorUser = (_properties, context) => { const MiningVendorItems = (_properties, context) => { const { act, data } = useBackend(context); const { has_id, id, items } = data; + const { gridLayout } = _properties; // Search thingies const [searchText, _setSearchText] = useLocalState(context, 'search', ''); const [sortOrder, _setSortOrder] = useLocalState(context, 'sort', 'Alphabetical'); @@ -89,7 +91,7 @@ const MiningVendorItems = (_properties, context) => { } has_contents = true; - return ; + return ; }); return ( @@ -101,6 +103,7 @@ const MiningVendorItems = (_properties, context) => { }; const MiningVendorSearch = (_properties, context) => { + const { gridLayout, setGridLayout } = _properties; const [_searchText, setSearchText] = useLocalState(context, 'search', ''); const [_sortOrder, setSortOrder] = useLocalState(context, 'sort', ''); const [descending, setDescending] = useLocalState(context, 'descending', false); @@ -115,6 +118,15 @@ const MiningVendorSearch = (_properties, context) => { onInput={(_e, value) => setSearchText(value)} /> + + + } + > + {item.name} + + ) + )} ); }; diff --git a/tgui/packages/tgui/interfaces/Pacman.js b/tgui/packages/tgui/interfaces/Pacman.js index 0cba4b7a40f1..e1c464c18fae 100644 --- a/tgui/packages/tgui/interfaces/Pacman.js +++ b/tgui/packages/tgui/interfaces/Pacman.js @@ -26,7 +26,7 @@ export const Pacman = (props, context) => { let fuelRatio = fuel_stored / fuel_cap; let tmpRatio = tmp_current / tmp_max; // temperature ratio let output_watts = output_set * power_gen; - let fuel_sec = Math.round(fuel_stored / fuel_usage); + let fuel_sec = Math.round((fuel_stored / fuel_usage) * 2); // Multiply by two, because one cycle is two seconds. let fuel_min = Math.round(fuel_sec / 60); let usage = fuel_sec > 120 ? `${fuel_min} minutes` : `${fuel_sec} seconds`; return ( diff --git a/tgui/packages/tgui/interfaces/RankedListInputModal.tsx b/tgui/packages/tgui/interfaces/RankedListInputModal.tsx new file mode 100644 index 000000000000..2418fd476d10 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RankedListInputModal.tsx @@ -0,0 +1,116 @@ +import { Loader } from './common/Loader'; +import { InputButtons } from './common/InputButtons'; +import { Button, Section, Stack, Table } from '../components'; +import { useBackend, useLocalState } from '../backend'; +import { Window } from '../layouts'; +import { TableRow } from '../components/Table'; + +type ListInputData = { + items: string[]; + message: string; + timeout: number; + title: string; +}; + +export const RankedListInputModal = (props, context) => { + const { act, data } = useBackend(context); + const { items = [], message = '', timeout, title } = data; + const [edittedItems, setEdittedItems] = useLocalState(context, 'edittedItems', items); + + // Dynamically changes the window height based on the message. + const windowHeight = 330 + Math.ceil(message.length / 3); + + return ( + + {timeout && } + +
+ + + + + + + + +
+
+
+ ); +}; + +/** + * Displays the list of selectable items. + * If a search query is provided, filters the items. + */ +const ListDisplay = (props, context) => { + const { filteredItems, setEdittedItems } = props; + const [draggedItemIndex, setDraggedItemIndex] = useLocalState(context, 'draggedItemIndex', null); + + // Handle the drag start event + const handleDragStart = (index: number) => { + setDraggedItemIndex(index); + }; + + // Handle the drag over event + const handleDragOver = (event: DragEvent) => { + event.preventDefault(); // Required to allow dropping + }; + + // Handle the drop event for items + const handleDrop = (index: number | null = null) => { + if (draggedItemIndex === null) return; + + const updatedItems = [...filteredItems]; + const draggedItem = updatedItems.splice(draggedItemIndex, 1)[0]; // Remove dragged item + + // If no index is provided, add the item to the end of the list (used for drop on section) + if (index === null) { + updatedItems.push(draggedItem); + } else { + updatedItems.splice(index, 0, draggedItem); // Insert dragged item at new position + } + + setEdittedItems(updatedItems); + setDraggedItemIndex(null); // Reset the dragged item index + }; + + return ( +
handleDrop(null)} // Handle drop on Section + onDragOver={handleDragOver} // Allow dropping on Section + > + + {filteredItems.map((item, index) => ( + handleDragStart(index)} + onDragOver={handleDragOver} + onDrop={() => handleDrop(index)} + style={{ + padding: '8px', + }} + > + + + ))} +
+
+ ); +}; diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json index 203b22705c4b..b491d41ca5c8 100644 --- a/tgui/packages/tgui/package.json +++ b/tgui/packages/tgui/package.json @@ -7,7 +7,7 @@ "@types/marked": "^6.0.0", "common": "workspace:*", "csstype": "^3.1.3", - "dompurify": "2.5.0", + "dompurify": "2.5.4", "highlight.js": "^11.10.0", "inferno": "^8.2.3", "inferno-vnode-flags": "^8.2.3", diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index f83675568cda..2d7922fdaa74 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1 +1 @@ -html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-gold{color:#f3b22f!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.color-bg-gold{background-color:#d6920c!important}.color-border-black{border-color:#1a1a1a!important}.color-border-white{border-color:#fff!important}.color-border-red{border-color:#df3e3e!important}.color-border-orange{border-color:#f37f33!important}.color-border-yellow{border-color:#fbda21!important}.color-border-olive{border-color:#cbe41c!important}.color-border-green{border-color:#25ca4c!important}.color-border-teal{border-color:#00d6cc!important}.color-border-blue{border-color:#2e93de!important}.color-border-violet{border-color:#7349cf!important}.color-border-purple{border-color:#ad45d0!important}.color-border-pink{border-color:#e34da1!important}.color-border-brown{border-color:#b97447!important}.color-border-grey{border-color:#848484!important}.color-border-good{border-color:#68c22d!important}.color-border-average{border-color:#f29a29!important}.color-border-bad{border-color:#df3e3e!important}.color-border-label{border-color:#8b9bb0!important}.color-border-gold{border-color:#f3b22f!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.outline-color-gold{outline:.167rem solid #f3b22f!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconRight .fa,.Button--hasContent.Button--iconRight .fas,.Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--multiLine{white-space:normal;word-wrap:break-word}.Button--modal{float:right;z-index:1;margin-top:-.5rem}.Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.Button--color--black:hover{background-color:#101010;color:#fff}.Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.Button--color--white:hover{background-color:#f8f8f8;color:#000}.Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--red:hover{background-color:#d93f3f;color:#fff}.Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.Button--color--orange:hover{background-color:#ef7e33;color:#fff}.Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.Button--color--yellow:hover{background-color:#f5d523;color:#000}.Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.Button--color--olive:hover{background-color:#bdd327;color:#fff}.Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.Button--color--green:hover{background-color:#2fb94f;color:#fff}.Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.Button--color--teal:hover{background-color:#10bdb6;color:#fff}.Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.Button--color--blue:hover{background-color:#308fd6;color:#fff}.Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.Button--color--violet:hover{background-color:#7249ca;color:#fff}.Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.Button--color--purple:hover{background-color:#aa46ca;color:#fff}.Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.Button--color--pink:hover{background-color:#e04ca0;color:#fff}.Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.Button--color--brown:hover{background-color:#ae724c;color:#fff}.Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.Button--color--grey:hover{background-color:#818181;color:#fff}.Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.Button--color--good:hover{background-color:#67b335;color:#fff}.Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.Button--color--average:hover{background-color:#eb972b;color:#fff}.Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--bad:hover{background-color:#d93f3f;color:#fff}.Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--color--label{background-color:#657a94;color:#fff;transition:color .2s,background-color .2s}.Button--color--label:hover{background-color:#8a9aae;color:#fff}.Button--color--label--translucent{background-color:rgba(101,122,148,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--label--translucent:hover{background-color:rgba(138,154,174,.5);color:#fff}.Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.Button--color--gold:hover{background-color:#eeaf30;color:#fff}.Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.Button--color--transparent{background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--transparent:hover{background-color:rgba(50,50,50,.81);color:#fff}.Button--color--default{background-color:#3e6189;color:#fff;transition:color .2s,background-color .2s}.Button--color--default:hover{background-color:#567daa;color:#fff}.Button--color--default--translucent{background-color:rgba(40,40,40,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--default--translucent:hover{background-color:rgba(61,61,61,.5);color:#fff}.Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.Button--color--caution:hover{background-color:#f5d523;color:#000}.Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.Button--color--danger{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--danger:hover{background-color:#d93f3f;color:#fff}.Button--color--danger--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--danger--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.Button--selected,.Button--selected--translucent{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.Button--selected:hover,.Button--selected--translucent:hover{background-color:#2fb94f;color:#fff}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{position:relative;align-items:center}.Dropdown__control{display:inline-block;align-items:center;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.3333333333em;-ms-user-select:none;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;align-items:center;z-index:5;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-scroll{overflow-y:scroll}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry.selected{background-color:rgba(255,255,255,.5)!important;transition:background-color 0ms}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em);text-align:left;padding-top:2.5px}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue,.Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__popupValue--right{top:.25rem;right:-50%}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left;vertical-align:baseline}.LabeledList__label{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem;scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--gold{color:#fff;background-color:#825d13}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .5s,width .5s}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--disabled{border:1px solid #999}.ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.ProgressBar--color--black{border:.0833333333em solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:.0833333333em solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:.0833333333em solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider:not(.Slider__disabled){cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(2n){background-color:#131313}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em .25em .25em 0}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-right-radius:.25em;border-bottom-right-radius:.25em}.Tabs--vertical .Tab--selected{border-left:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-left-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-left-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-left-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-left-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-left-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-left-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-left-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-left-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-left-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-left-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-left-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-left-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-left-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-left-color:#848484}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-left-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-left-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-left-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-left-color:#8b9bb0}.Tab--selected.Tab--color--gold{color:#f6c563}.Tabs--horizontal .Tab--selected.Tab--color--gold{border-bottom-color:#f3b22f}.Tabs--vertical .Tab--selected.Tab--color--gold{border-left-color:#f3b22f}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.Input--disabled{color:#777;border-color:#848484;border-color:rgba(132,132,132,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;top:1em;left:.75em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}html,body{scrollbar-color:#363636 #181818}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.Layout__content--noMargin{margin:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020,#202020)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}em{font-style:normal;font-weight:700}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.emoji{max-height:16px;max-width:16px}.emoji16x16{vertical-align:middle}.italic,.italics,.emote{font-style:italic}.bold{font-weight:700}.bolditalics{font-style:italic;font-weight:700}.center{text-align:center}.big{font-size:150%}.reallybig{font-size:175%}.sans{font-family:Comic Sans MS,cursive,sans-serif}.wingdings{font-family:Wingdings,Webdings}.robot{font-family:OCR-A,monospace;font-size:1.15em;font-weight:700}.hidden{display:none;visibility:hidden}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:active,.motd a:hover{color:#a4bad6}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:75%}.ooc{font-weight:700}.looc{color:#69c;font-weight:700}.discordpm{color:#6685f5}.debug{color:#6d2f83}.deadsay{color:#e2c1ff}.darkmblue{color:#6685f5}.prefix,.name,.yell{font-weight:700}.mentorhelp{color:#07b;font-weight:700}.mentor_channel{color:#775bff;font-weight:700}.mentor_channel_admin{color:#a35cff;font-weight:700}.admin{color:#386aff;font-weight:700}.adminhelp{color:#a00;font-weight:700}.adminticket{color:#3daf21;font-weight:700}.adminticketalt{color:#ccb847;font-weight:700}.admin_channel{color:#03fc9d;font-weight:700}.all_admin_ping{color:#12a5f4;font-weight:700;font-size:120%;text-align:center}.dev_channel{color:#61b413;font-weight:700}.dev_channel_admin{color:#9ef14f;font-weight:700}.radio{color:#20b142}.deptradio{color:#939}.comradio{color:#5f5cff}.syndradio{color:#8f4a4b}.dsquadradio{color:#998599}.airadio{color:#ff5ed7}.centradio{color:#2681a5}.secradio{color:#dd3535}.engradio{color:#feac20}.medradio{color:#00b5ad}.sciradio{color:#c68cfa}.supradio{color:#b88646}.srvradio{color:#bbd164}.proradio{color:#b84f92}.alert{color:#d82020}h1.alert,h2.alert{color:#a4bad6}.ghostalert{color:#cc00c6;font-style:italic;font-weight:700}.warning{color:#c51e1e;font-style:italic}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.danger{color:#c51e1e;font-weight:700}.biggerdanger{color:red;font-weight:700;font-size:150%}.userdanger{color:#c51e1e;font-weight:700;font-size:120%}.attack{color:red}.disarm{color:#900}.moderate{color:#c00}.notice{color:#6685f5}.boldnotice{color:#6685f5;font-weight:700}.suicide{color:#ff5050;font-style:italic}.announcement h1,.announcement h2{color:#a4bad6;margin:8pt 0;line-height:1.2}.announcement p{color:#d82020;line-height:1.3}.announcement.minor h1{font-size:180%}.announcement.minor h2{font-size:170%}.announcement.sec h1{color:red;font-size:180%;font-family:Verdana,sans-serif}.boldannounceic,.boldannounceooc,.pr_announce{color:#c51e1e;font-weight:700}.greenannounce{color:#059223;font-weight:700}.alien{color:#c433c4}.noticealien{color:#00c000}.alertalien{color:#00c000;font-weight:700}.terrorspider{color:#cf52fa}.dantalion{color:#8b2c5e}.chaosverygood{color:#19e0c0;font-weight:700;font-size:120%}.chaosgood{color:#19e0c0;font-weight:700}.chaosneutral{color:#479ac0;font-weight:700}.chaosbad{color:#9047c0;font-weight:700}.chaosverybad{color:#9047c0;font-weight:700;font-size:120%}.sinister{color:purple;font-weight:700;font-style:italic}.blob{color:#ee4000;font-style:italic}.revennotice{color:#6685f5}.revenbignotice{color:#6685f5;font-weight:700;font-size:120%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:120%}.changeling{color:#00b4de}.abductor{color:purple;font-style:italic}.mind_control{color:#a00d6f;font-size:3;font-weight:700;font-style:italic}.cult{color:purple;font-weight:700;font-style:italic}.cultspeech{color:#af0000;font-style:italic}.cultitalic{color:#a60000;font-style:italic}.cultlarge{color:#a60000;font-weight:700;font-size:120%}.narsie{color:#a60000;font-weight:700;font-size:300%}.narsiesmall{color:#a60000;font-weight:700;font-size:200%}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.zombie{color:#7c4848}.zombielarge{color:#7c4848;font-weight:700;font-size:120%}.colossus{color:#7f282a;font-size:175%}.hierophant{color:#609;font-weight:700;font-style:italic}.hierophant_warning{color:#609;font-style:italic}.tajaran{color:#803b56}.skrell{color:#00ced1}.solcom{color:#8282fb}.com_srus{color:#7c4848}.zombie{color:red}.soghun{color:#228b22}.vox{color:#a0a}.diona{color:#804000;font-weight:700}.trinary{color:#727272}.kidan{color:#c64c05}.slime{color:#07a}.drask{color:#a3d4eb;font-family:Arial Black}.moth{color:#869b29;font-family:Copperplate}.clown{color:red}.vulpkanin{color:#b97a57}.gutter{color:#7092be;font-family:Trebuchet MS,cursive,sans-serif}.tradeband{font-family:Georgia,Verdana,sans-serif}.rose{color:#ff5050}.interface{color:#9031c4}.greentext{color:#0f0;font-size:150%}.redtext{color:red;font-size:150%}.red{color:red}.green{color:#03bb39}.purple{color:#9031c4}.orange{color:orange}.resonate{color:#298f85}.healthscan_oxy{color:#5cc9ff}.specialnotice{color:#4a6f82;font-weight:700;font-size:120%}.whisper{font-style:italic;color:#ccc}span.body .codephrases{color:#55f}span.body .coderesponses{color:#f33}.oxygen{color:#449dff}.nitrogen{color:#f94541}.carbon_dioxide{color:#ccc}.plasma{color:#eb6b00}.sleeping_agent{color:#f28b89}.agent_b{color:teal}.boxed_message{background:#17191c;border:1px solid rgba(166,183,217,.25);border-width:.0833333333em .4166666667em;margin:.5em .25em;padding:.5em .75em;border-radius:.5em;text-align:center}.boxed_message.red_border{background:#1f1414;border-color:rgba(255,0,0,.5)}.boxed_message.green_border{background:#141f18;border-color:rgba(0,255,0,.5)}.boxed_message.purple_border{background:#1d1828;border-color:rgba(170,128,255,.5)}.boxed_message.notice_border{background:#14181f;border-color:rgba(85,126,246,.5)}.boxed_message.thick_border{border-width:.5em}.boxed_message.left_align_text{text-align:left}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-gold{color:#e39b0d!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .color-bg-gold{background-color:#bd810b!important}.theme-light .color-border-black{border-color:#000!important}.theme-light .color-border-white{border-color:#e6e6e6!important}.theme-light .color-border-red{border-color:#c82121!important}.theme-light .color-border-orange{border-color:#e6630d!important}.theme-light .color-border-yellow{border-color:#e5c304!important}.theme-light .color-border-olive{border-color:#a3b816!important}.theme-light .color-border-green{border-color:#1d9f3b!important}.theme-light .color-border-teal{border-color:#00a39c!important}.theme-light .color-border-blue{border-color:#1e78bb!important}.theme-light .color-border-violet{border-color:#5a30b5!important}.theme-light .color-border-purple{border-color:#932eb4!important}.theme-light .color-border-pink{border-color:#db228a!important}.theme-light .color-border-brown{border-color:#955d39!important}.theme-light .color-border-grey{border-color:#e6e6e6!important}.theme-light .color-border-good{border-color:#529923!important}.theme-light .color-border-average{border-color:#da810e!important}.theme-light .color-border-bad{border-color:#c82121!important}.theme-light .color-border-label{border-color:#353535!important}.theme-light .color-border-gold{border-color:#e39b0d!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em .25em .25em 0}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(0,0,0,.075);transition:background-color 0}.theme-light .Tab--selected{background-color:rgba(0,0,0,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-right-radius:.25em;border-bottom-right-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-left:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-left-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-left-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-left-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-left-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-left-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-left-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-left-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-left-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-left-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-left-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-left-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-left-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-left-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-left-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-left-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-left-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-left-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-left-color:#353535}.theme-light .Tab--selected.Tab--color--gold{color:#f4b73f}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--gold{border-bottom-color:#e39b0d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--gold{border-left-color:#e39b0d}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconRight .fa,.theme-light .Button--hasContent.Button--iconRight .fas,.theme-light .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-light .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-light .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--black:hover{background-color:#101010;color:#fff}.theme-light .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-light .Button--color--white{background-color:#bfbfbf;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--white:hover{background-color:#e7e7e7;color:#000}.theme-light .Button--color--white--translucent{background-color:rgba(191,191,191,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--white--translucent:hover{background-color:rgba(231,231,231,.5);color:#fff}.theme-light .Button--color--red{background-color:#a61c1c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--red:hover{background-color:#cb3030;color:#fff}.theme-light .Button--color--red--translucent{background-color:rgba(166,28,28,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--red--translucent:hover{background-color:rgba(203,48,48,.5);color:#fff}.theme-light .Button--color--orange{background-color:#c0530b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--orange:hover{background-color:#e76d1d;color:#fff}.theme-light .Button--color--orange--translucent{background-color:rgba(192,83,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--orange--translucent:hover{background-color:rgba(231,109,29,.5);color:#fff}.theme-light .Button--color--yellow{background-color:#bfa303;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--yellow:hover{background-color:#e7c714;color:#fff}.theme-light .Button--color--yellow--translucent{background-color:rgba(191,163,3,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--yellow--translucent:hover{background-color:rgba(231,199,20,.5);color:#fff}.theme-light .Button--color--olive{background-color:#889912;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--olive:hover{background-color:#a9bc25;color:#fff}.theme-light .Button--color--olive--translucent{background-color:rgba(136,153,18,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--olive--translucent:hover{background-color:rgba(169,188,37,.5);color:#fff}.theme-light .Button--color--green{background-color:#188532;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--green:hover{background-color:#2ba648;color:#fff}.theme-light .Button--color--green--translucent{background-color:rgba(24,133,50,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--green--translucent:hover{background-color:rgba(43,166,72,.5);color:#fff}.theme-light .Button--color--teal{background-color:#008882;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--teal:hover{background-color:#10a9a2;color:#fff}.theme-light .Button--color--teal--translucent{background-color:rgba(0,136,130,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--teal--translucent:hover{background-color:rgba(16,169,162,.5);color:#fff}.theme-light .Button--color--blue{background-color:#19649c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--blue:hover{background-color:#2c81c0;color:#fff}.theme-light .Button--color--blue--translucent{background-color:rgba(25,100,156,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--blue--translucent:hover{background-color:rgba(44,129,192,.5);color:#fff}.theme-light .Button--color--violet{background-color:#4b2897;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--violet:hover{background-color:#653db9;color:#fff}.theme-light .Button--color--violet--translucent{background-color:rgba(75,40,151,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--violet--translucent:hover{background-color:rgba(101,61,185,.5);color:#fff}.theme-light .Button--color--purple{background-color:#7a2696;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--purple:hover{background-color:#9a3bb9;color:#fff}.theme-light .Button--color--purple--translucent{background-color:rgba(122,38,150,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--purple--translucent:hover{background-color:rgba(154,59,185,.5);color:#fff}.theme-light .Button--color--pink{background-color:#b61d73;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--pink:hover{background-color:#d93591;color:#fff}.theme-light .Button--color--pink--translucent{background-color:rgba(182,29,115,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--pink--translucent:hover{background-color:rgba(217,53,145,.5);color:#fff}.theme-light .Button--color--brown{background-color:#7c4d2f;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--brown:hover{background-color:#9c6745;color:#fff}.theme-light .Button--color--brown--translucent{background-color:rgba(124,77,47,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--brown--translucent:hover{background-color:rgba(156,103,69,.5);color:#fff}.theme-light .Button--color--grey{background-color:#bfbfbf;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--grey:hover{background-color:#e7e7e7;color:#000}.theme-light .Button--color--grey--translucent{background-color:rgba(191,191,191,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--grey--translucent:hover{background-color:rgba(231,231,231,.5);color:#fff}.theme-light .Button--color--good{background-color:#44801d;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--good:hover{background-color:#5d9f31;color:#fff}.theme-light .Button--color--good--translucent{background-color:rgba(68,128,29,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--good--translucent:hover{background-color:rgba(93,159,49,.5);color:#fff}.theme-light .Button--color--average{background-color:#b56b0b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--average:hover{background-color:#dc891d;color:#fff}.theme-light .Button--color--average--translucent{background-color:rgba(181,107,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--average--translucent:hover{background-color:rgba(220,137,29,.5);color:#fff}.theme-light .Button--color--bad{background-color:#a61c1c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--bad:hover{background-color:#cb3030;color:#fff}.theme-light .Button--color--bad--translucent{background-color:rgba(166,28,28,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--bad--translucent:hover{background-color:rgba(203,48,48,.5);color:#fff}.theme-light .Button--color--label{background-color:#2c2c2c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--label:hover{background-color:#424242;color:#fff}.theme-light .Button--color--label--translucent{background-color:rgba(44,44,44,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--label--translucent:hover{background-color:rgba(66,66,66,.5);color:#fff}.theme-light .Button--color--gold{background-color:#bd810b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--gold:hover{background-color:#e5a11c;color:#fff}.theme-light .Button--color--gold--translucent{background-color:rgba(189,129,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--gold--translucent:hover{background-color:rgba(229,161,28,.5);color:#fff}.theme-light .Button--color--transparent{background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--transparent:hover{background-color:rgba(255,255,255,.81);color:#000}.theme-light .Button--color--default{background-color:#bbb;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--default:hover{background-color:#e3e3e3;color:#000}.theme-light .Button--color--default--translucent{background-color:rgba(251,251,251,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--default--translucent:hover{background-color:rgba(254,254,254,.5);color:#fff}.theme-light .Button--color--caution{background-color:#be6209;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--caution:hover{background-color:#e67f1a;color:#fff}.theme-light .Button--color--caution--translucent{background-color:rgba(190,98,9,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--caution--translucent:hover{background-color:rgba(230,127,26,.5);color:#fff}.theme-light .Button--color--danger{background-color:#9a9d00;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--danger:hover{background-color:#bec110;color:#fff}.theme-light .Button--color--danger--translucent{background-color:rgba(154,157,0,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--danger--translucent:hover{background-color:rgba(190,193,16,.5);color:#fff}.theme-light .Button--disabled{background-color:#363636!important;color:rgba(0,0,0,.75)!important}.theme-light .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(0,0,0,.5)!important}.theme-light .Button--selected,.theme-light .Button--selected--translucent{background-color:#0668b8;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--selected:hover,.theme-light .Button--selected--translucent:hover{background-color:#1785df;color:#fff}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#e6e6e6;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#e6e6e6;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-light .Input--disabled{color:#777;border-color:#000;border-color:rgba(0,0,0,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-light .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#e6e6e6;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue,.theme-light .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__popupValue--right{top:.25rem;right:-50%}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--gold .Knob__ringFill{stroke:#e39b0d}.theme-light .Slider:not(.Slider__disabled){cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--disabled{border:1px solid #999}.theme-light .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-light .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border:.0833333333em solid #c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border:.0833333333em solid #bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border:.0833333333em solid #889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border:.0833333333em solid #188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border:.0833333333em solid #008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border:.0833333333em solid #19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border:.0833333333em solid #4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border:.0833333333em solid #7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border:.0833333333em solid #b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border:.0833333333em solid #7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--good{border:.0833333333em solid #44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border:.0833333333em solid #b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border:.0833333333em solid #2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--gold{border:.0833333333em solid #bd810b!important}.theme-light .ProgressBar--color--gold .ProgressBar__fill{background-color:#bd810b}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light html,.theme-light body{scrollbar-color:#a7a7a7 #f2f2f2}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-light .Layout__content--noMargin{margin:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s,background-color .25s}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light a,.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f}.theme-light .motd,.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6,.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .looc{color:#69c}.theme-light .discordpm{color:#00f}.theme-light .debug{color:#6d2f83}.theme-light .deadsay{color:#5c00e6}.theme-light .darkmblue{color:#00f}.theme-light .mentorhelp{color:#07b}.theme-light .mentor_channel{color:#775bff}.theme-light .mentor_channel_admin{color:#a35cff}.theme-light .adminhelp{color:#a00}.theme-light .adminticket{color:#3e7336}.theme-light .adminticketalt{color:#014c8a}.theme-light .admin_channel{color:#9a04d1}.theme-light .all_admin_ping{color:#12a5f4}.theme-light .dev_channel{color:#126719}.theme-light .dev_channel_admin{color:#26a419}.theme-light .radio{color:#408010}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#204090}.theme-light .syndradio{color:#6d3f40}.theme-light .dsquadradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .centradio{color:#5c5c7c}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .medradio{color:#009190}.theme-light .sciradio{color:#939}.theme-light .supradio{color:#7f6539}.theme-light .srvradio{color:#80a000}.theme-light .proradio{color:#e3027a}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .ghostalert{color:#5c00e6}.theme-light .warning,.theme-light .boldwarning,.theme-light .danger,.theme-light .userdanger{color:red}.theme-light .notice,.theme-light .boldnotice{color:#009}.theme-light .announcement h1,.theme-light .announcement h2{color:#000}.theme-light .boldannounceic,.theme-light .boldannounceooc{color:red}.theme-light .pr_announce{color:#228b22}.theme-light .greenannounce{color:#0f0}.theme-light .alien{color:#543354}.theme-light .terrorspider{color:#320e32}.theme-light .dantalion{color:#6a2148}.theme-light .revennotice,.theme-light .revenbignotice{color:#1d2953}.theme-light .changeling{color:purple}.theme-light .cultspeech{color:#7f0000}.theme-light .cultitalic,.theme-light .cultlarge,.theme-light .narsie,.theme-light .narsiesmall{color:#960000}.theme-light .rose{color:#ff5050}.theme-light .interface{color:#303}.theme-light .purple{color:#5e2d79}.theme-light .orange{color:orange}.theme-light .healthscan_oxy{color:#0074bd}.theme-light .specialnotice{color:#36525e}.theme-light .whisper{color:#333}.theme-light span.body .codephrases{color:#00f}.theme-light span.body .coderesponses{color:red}.theme-light .oxygen{color:#006adb}.theme-light .nitrogen{color:#d00a06}.theme-light .carbon_dioxide{color:#1f1f1f}.theme-light .plasma{color:#853c00}.theme-light .sleeping_agent{color:#e82f2c}.theme-light .agent_b{color:#004d4d}.theme-light .boxed_message{background:#f2f7ff;border-color:rgba(16,48,112,.5)}.theme-light .boxed_message.red_border{background:#fff2f2;border-color:rgba(255,0,0,.5)}.theme-light .boxed_message.green_border{background:#f2fff7;border-color:rgba(0,168,0,.5)}.theme-light .boxed_message.purple_border{background:#f7f2ff;border-color:rgba(85,0,255,.5)}.theme-light .boxed_message.notice_border{background:#f2f7ff;border-color:rgba(0,64,255,.5)}.theme-ntos .color-black{color:#1a1a1a!important}.theme-ntos .color-white{color:#fff!important}.theme-ntos .color-red{color:#df3e3e!important}.theme-ntos .color-orange{color:#f37f33!important}.theme-ntos .color-yellow{color:#fbda21!important}.theme-ntos .color-olive{color:#cbe41c!important}.theme-ntos .color-green{color:#25ca4c!important}.theme-ntos .color-teal{color:#00d6cc!important}.theme-ntos .color-blue{color:#2e93de!important}.theme-ntos .color-violet{color:#7349cf!important}.theme-ntos .color-purple{color:#ad45d0!important}.theme-ntos .color-pink{color:#e34da1!important}.theme-ntos .color-brown{color:#b97447!important}.theme-ntos .color-grey{color:#848484!important}.theme-ntos .color-good{color:#68c22d!important}.theme-ntos .color-average{color:#f29a29!important}.theme-ntos .color-bad{color:#df3e3e!important}.theme-ntos .color-label{color:#8b9bb0!important}.theme-ntos .color-gold{color:#f3b22f!important}.theme-ntos .color-bg-black{background-color:#000!important}.theme-ntos .color-bg-white{background-color:#d9d9d9!important}.theme-ntos .color-bg-red{background-color:#bd2020!important}.theme-ntos .color-bg-orange{background-color:#d95e0c!important}.theme-ntos .color-bg-yellow{background-color:#d9b804!important}.theme-ntos .color-bg-olive{background-color:#9aad14!important}.theme-ntos .color-bg-green{background-color:#1b9638!important}.theme-ntos .color-bg-teal{background-color:#009a93!important}.theme-ntos .color-bg-blue{background-color:#1c71b1!important}.theme-ntos .color-bg-violet{background-color:#552dab!important}.theme-ntos .color-bg-purple{background-color:#8b2baa!important}.theme-ntos .color-bg-pink{background-color:#cf2082!important}.theme-ntos .color-bg-brown{background-color:#8c5836!important}.theme-ntos .color-bg-grey{background-color:#646464!important}.theme-ntos .color-bg-good{background-color:#4d9121!important}.theme-ntos .color-bg-average{background-color:#cd7a0d!important}.theme-ntos .color-bg-bad{background-color:#bd2020!important}.theme-ntos .color-bg-label{background-color:#657a94!important}.theme-ntos .color-bg-gold{background-color:#d6920c!important}.theme-ntos .color-border-black{border-color:#1a1a1a!important}.theme-ntos .color-border-white{border-color:#fff!important}.theme-ntos .color-border-red{border-color:#df3e3e!important}.theme-ntos .color-border-orange{border-color:#f37f33!important}.theme-ntos .color-border-yellow{border-color:#fbda21!important}.theme-ntos .color-border-olive{border-color:#cbe41c!important}.theme-ntos .color-border-green{border-color:#25ca4c!important}.theme-ntos .color-border-teal{border-color:#00d6cc!important}.theme-ntos .color-border-blue{border-color:#2e93de!important}.theme-ntos .color-border-violet{border-color:#7349cf!important}.theme-ntos .color-border-purple{border-color:#ad45d0!important}.theme-ntos .color-border-pink{border-color:#e34da1!important}.theme-ntos .color-border-brown{border-color:#b97447!important}.theme-ntos .color-border-grey{border-color:#848484!important}.theme-ntos .color-border-good{border-color:#68c22d!important}.theme-ntos .color-border-average{border-color:#f29a29!important}.theme-ntos .color-border-bad{border-color:#df3e3e!important}.theme-ntos .color-border-label{border-color:#8b9bb0!important}.theme-ntos .color-border-gold{border-color:#f3b22f!important}.theme-ntos .Section{position:relative;margin-bottom:.5em;background-color:#121922;box-sizing:border-box}.theme-ntos .Section:last-child{margin-bottom:0}.theme-ntos .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-ntos .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-ntos .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-ntos .Section__rest{position:relative}.theme-ntos .Section__content{padding:.66em .5em}.theme-ntos .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-ntos .Section--fill{display:flex;flex-direction:column;height:100%}.theme-ntos .Section--fill>.Section__rest{flex-grow:1}.theme-ntos .Section--fill>.Section__rest>.Section__content{height:100%}.theme-ntos .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-ntos .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-ntos .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-ntos .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-ntos .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-ntos .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-ntos .Section .Section:first-child{margin-top:-.5em}.theme-ntos .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-ntos .Section .Section .Section .Section__titleText{font-size:1em}.theme-ntos .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-ntos .Button:last-child{margin-right:0;margin-bottom:0}.theme-ntos .Button .fa,.theme-ntos .Button .fas,.theme-ntos .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-ntos .Button--hasContent .fa,.theme-ntos .Button--hasContent .fas,.theme-ntos .Button--hasContent .far{margin-right:.25em}.theme-ntos .Button--hasContent.Button--iconRight .fa,.theme-ntos .Button--hasContent.Button--iconRight .fas,.theme-ntos .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-ntos .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos .Button--circular{border-radius:50%}.theme-ntos .Button--compact{padding:0 .25em;line-height:1.333em}.theme-ntos .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-ntos .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-ntos .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--black:hover{background-color:#101010;color:#fff}.theme-ntos .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-ntos .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-ntos .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-ntos .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-ntos .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-ntos .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-ntos .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-ntos .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-ntos .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-ntos .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-ntos .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-ntos .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-ntos .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-ntos .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-ntos .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-ntos .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-ntos .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-ntos .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-ntos .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-ntos .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-ntos .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-ntos .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-ntos .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-ntos .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-ntos .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-ntos .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-ntos .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-ntos .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-ntos .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-ntos .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--color--label{background-color:#657a94;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--label:hover{background-color:#8a9aae;color:#fff}.theme-ntos .Button--color--label--translucent{background-color:rgba(101,122,148,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--label--translucent:hover{background-color:rgba(138,154,174,.5);color:#fff}.theme-ntos .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-ntos .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-ntos .Button--color--transparent{background-color:rgba(27,38,51,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--transparent:hover{background-color:rgba(44,57,73,.81);color:#fff}.theme-ntos .Button--color--default{background-color:#384e68;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--default:hover{background-color:#4f6885;color:#fff}.theme-ntos .Button--color--default--translucent{background-color:rgba(35,47,60,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--default--translucent:hover{background-color:rgba(56,69,84,.5);color:#fff}.theme-ntos .Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--caution:hover{background-color:#f5d523;color:#000}.theme-ntos .Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-ntos .Button--color--danger{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--danger:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--danger--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--danger--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.theme-ntos .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-ntos .Button--selected,.theme-ntos .Button--selected--translucent{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--selected:hover,.theme-ntos .Button--selected--translucent:hover{background-color:#2fb94f;color:#fff}.theme-ntos .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-ntos .NumberInput--fluid{display:block}.theme-ntos .NumberInput__content{margin-left:.5em}.theme-ntos .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-ntos .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-ntos .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-ntos .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-ntos .Input--disabled{color:#777;border-color:#848484;border-color:rgba(132,132,132,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-ntos .Input--fluid{display:block;width:auto}.theme-ntos .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-ntos .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-ntos .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-ntos .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-ntos .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-ntos .TextArea--fluid{display:block;width:auto;height:auto}.theme-ntos .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-ntos .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-ntos .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-ntos .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-ntos .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-ntos .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-ntos .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-ntos .Knob__popupValue,.theme-ntos .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-ntos .Knob__popupValue--right{top:.25rem;right:-50%}.theme-ntos .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-ntos .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-ntos .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-ntos .Knob__ringFillPivot{transform:rotate(135deg)}.theme-ntos .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-ntos .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-ntos .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-ntos .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-ntos .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-ntos .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-ntos .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-ntos .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-ntos .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-ntos .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-ntos .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-ntos .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-ntos .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-ntos .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-ntos .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-ntos .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-ntos .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-ntos .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-ntos .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-ntos .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-ntos .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-ntos .Slider:not(.Slider__disabled){cursor:e-resize}.theme-ntos .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-ntos .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-ntos .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-ntos .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-ntos .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-ntos .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-ntos .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-ntos .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-ntos .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-ntos .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-ntos .ProgressBar--color--disabled{border:1px solid #999}.theme-ntos .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-ntos .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-ntos .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-ntos .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-ntos .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-ntos .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-ntos .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-ntos .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-ntos .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-ntos .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-ntos .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-ntos .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-ntos .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-ntos .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-ntos .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-ntos .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-ntos .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-ntos .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-ntos .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-ntos .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-ntos .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-ntos .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-ntos .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-ntos .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-ntos .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-ntos .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-ntos .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-ntos .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-ntos .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-ntos .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-ntos .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-ntos .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-ntos .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-ntos .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-ntos .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-ntos .ProgressBar--color--label{border:.0833333333em solid #657a94!important}.theme-ntos .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-ntos .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-ntos .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-ntos .Chat{color:#abc6ec}.theme-ntos .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-ntos .Chat__badge:before{content:"x"}.theme-ntos .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-ntos .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-ntos .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-ntos .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#121922}.theme-ntos .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-ntos .Chat__highlight{color:#000}.theme-ntos .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-ntos .ChatMessage{word-wrap:break-word}.theme-ntos .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-ntos .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-ntos html,.theme-ntos body{scrollbar-color:#2a3b4f #141d26}.theme-ntos .Layout,.theme-ntos .Layout *{scrollbar-base-color:#141d26;scrollbar-face-color:#2a3b4f;scrollbar-3dlight-color:#1b2633;scrollbar-highlight-color:#1b2633;scrollbar-track-color:#141d26;scrollbar-arrow-color:#7290b4;scrollbar-shadow-color:#2a3b4f}.theme-ntos .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-ntos .Layout__content--flexRow{display:flex;flex-flow:row}.theme-ntos .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-ntos .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-ntos .Layout__content--noMargin{margin:0}.theme-ntos .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1b2633;background-image:linear-gradient(to bottom,#1b2633,#1b2633)}.theme-ntos .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-ntos .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-ntos .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-ntos .Window__contentPadding:after{height:0}.theme-ntos .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-ntos .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(50,63,78,.25);pointer-events:none}.theme-ntos .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-ntos .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-ntos .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-ntos .TitleBar{background-color:#1b2633;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos .TitleBar__clickable{color:rgba(255,0,0,.5);background-color:#1b2633;transition:color .25s,background-color .25s}.theme-ntos .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-ntos .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-ntos .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-ntos .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-ntos .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-ntos .boxed_message{background:#1d2330}.theme-ntos .boxed_message.red_border{background:#301d1d}.theme-ntos .boxed_message.green_border{background:#1d3023}.theme-ntos .boxed_message.purple_border{background:#231d30}.theme-ntos .boxed_message.notice_border{background:#192234}.theme-syndicate .color-black{color:#1a1a1a!important}.theme-syndicate .color-white{color:#fff!important}.theme-syndicate .color-red{color:#df3e3e!important}.theme-syndicate .color-orange{color:#f37f33!important}.theme-syndicate .color-yellow{color:#fbda21!important}.theme-syndicate .color-olive{color:#cbe41c!important}.theme-syndicate .color-green{color:#25ca4c!important}.theme-syndicate .color-teal{color:#00d6cc!important}.theme-syndicate .color-blue{color:#2e93de!important}.theme-syndicate .color-violet{color:#7349cf!important}.theme-syndicate .color-purple{color:#ad45d0!important}.theme-syndicate .color-pink{color:#e34da1!important}.theme-syndicate .color-brown{color:#b97447!important}.theme-syndicate .color-grey{color:#848484!important}.theme-syndicate .color-good{color:#68c22d!important}.theme-syndicate .color-average{color:#f29a29!important}.theme-syndicate .color-bad{color:#df3e3e!important}.theme-syndicate .color-label{color:#b89797!important}.theme-syndicate .color-gold{color:#f3b22f!important}.theme-syndicate .color-bg-black{background-color:#000!important}.theme-syndicate .color-bg-white{background-color:#d9d9d9!important}.theme-syndicate .color-bg-red{background-color:#bd2020!important}.theme-syndicate .color-bg-orange{background-color:#d95e0c!important}.theme-syndicate .color-bg-yellow{background-color:#d9b804!important}.theme-syndicate .color-bg-olive{background-color:#9aad14!important}.theme-syndicate .color-bg-green{background-color:#1b9638!important}.theme-syndicate .color-bg-teal{background-color:#009a93!important}.theme-syndicate .color-bg-blue{background-color:#1c71b1!important}.theme-syndicate .color-bg-violet{background-color:#552dab!important}.theme-syndicate .color-bg-purple{background-color:#8b2baa!important}.theme-syndicate .color-bg-pink{background-color:#cf2082!important}.theme-syndicate .color-bg-brown{background-color:#8c5836!important}.theme-syndicate .color-bg-grey{background-color:#646464!important}.theme-syndicate .color-bg-good{background-color:#4d9121!important}.theme-syndicate .color-bg-average{background-color:#cd7a0d!important}.theme-syndicate .color-bg-bad{background-color:#bd2020!important}.theme-syndicate .color-bg-label{background-color:#9d6f6f!important}.theme-syndicate .color-bg-gold{background-color:#d6920c!important}.theme-syndicate .color-border-black{border-color:#1a1a1a!important}.theme-syndicate .color-border-white{border-color:#fff!important}.theme-syndicate .color-border-red{border-color:#df3e3e!important}.theme-syndicate .color-border-orange{border-color:#f37f33!important}.theme-syndicate .color-border-yellow{border-color:#fbda21!important}.theme-syndicate .color-border-olive{border-color:#cbe41c!important}.theme-syndicate .color-border-green{border-color:#25ca4c!important}.theme-syndicate .color-border-teal{border-color:#00d6cc!important}.theme-syndicate .color-border-blue{border-color:#2e93de!important}.theme-syndicate .color-border-violet{border-color:#7349cf!important}.theme-syndicate .color-border-purple{border-color:#ad45d0!important}.theme-syndicate .color-border-pink{border-color:#e34da1!important}.theme-syndicate .color-border-brown{border-color:#b97447!important}.theme-syndicate .color-border-grey{border-color:#848484!important}.theme-syndicate .color-border-good{border-color:#68c22d!important}.theme-syndicate .color-border-average{border-color:#f29a29!important}.theme-syndicate .color-border-bad{border-color:#df3e3e!important}.theme-syndicate .color-border-label{border-color:#b89797!important}.theme-syndicate .color-border-gold{border-color:#f3b22f!important}.theme-syndicate .Section{position:relative;margin-bottom:.5em;background-color:#2b0101;box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #397439}.theme-syndicate .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-syndicate .Section__rest{position:relative}.theme-syndicate .Section__content{padding:.66em .5em}.theme-syndicate .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-syndicate .Section--fill{display:flex;flex-direction:column;height:100%}.theme-syndicate .Section--fill>.Section__rest{flex-grow:1}.theme-syndicate .Section--fill>.Section__rest>.Section__content{height:100%}.theme-syndicate .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-syndicate .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-syndicate .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-syndicate .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-syndicate .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-syndicate .Section .Section:first-child{margin-top:-.5em}.theme-syndicate .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-syndicate .Section .Section .Section .Section__titleText{font-size:1em}.theme-syndicate .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0;margin-bottom:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .fas,.theme-syndicate .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .fas,.theme-syndicate .Button--hasContent .far{margin-right:.25em}.theme-syndicate .Button--hasContent.Button--iconRight .fa,.theme-syndicate .Button--hasContent.Button--iconRight .fas,.theme-syndicate .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--circular{border-radius:50%}.theme-syndicate .Button--compact{padding:0 .25em;line-height:1.333em}.theme-syndicate .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-syndicate .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-syndicate .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--black:hover{background-color:#101010;color:#fff}.theme-syndicate .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-syndicate .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-syndicate .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-syndicate .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-syndicate .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-syndicate .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-syndicate .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-syndicate .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-syndicate .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-syndicate .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-syndicate .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-syndicate .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-syndicate .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-syndicate .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-syndicate .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-syndicate .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-syndicate .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-syndicate .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-syndicate .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-syndicate .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-syndicate .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-syndicate .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-syndicate .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-syndicate .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-syndicate .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-syndicate .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-syndicate .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-syndicate .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-syndicate .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-syndicate .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-syndicate .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-syndicate .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-syndicate .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-syndicate .Button--color--label{background-color:#9d6f6f;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--label:hover{background-color:#b89696;color:#fff}.theme-syndicate .Button--color--label--translucent{background-color:rgba(157,111,111,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--label--translucent:hover{background-color:rgba(184,150,150,.5);color:#fff}.theme-syndicate .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-syndicate .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-syndicate .Button--color--transparent{background-color:rgba(77,2,2,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--transparent:hover{background-color:rgba(103,14,14,.81);color:#fff}.theme-syndicate .Button--color--default{background-color:#397439;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--default:hover{background-color:#509350;color:#fff}.theme-syndicate .Button--color--default--translucent{background-color:rgba(88,8,8,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--default--translucent:hover{background-color:rgba(115,25,25,.5);color:#fff}.theme-syndicate .Button--color--caution{background-color:#be6209;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--caution:hover{background-color:#e67f1a;color:#fff}.theme-syndicate .Button--color--caution--translucent{background-color:rgba(190,98,9,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--caution--translucent:hover{background-color:rgba(230,127,26,.5);color:#fff}.theme-syndicate .Button--color--danger{background-color:#9a9d00;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--danger:hover{background-color:#bec110;color:#fff}.theme-syndicate .Button--color--danger--translucent{background-color:rgba(154,157,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--danger--translucent:hover{background-color:rgba(190,193,16,.5);color:#fff}.theme-syndicate .Button--disabled{background-color:#363636!important;color:rgba(255,255,255,.75)!important}.theme-syndicate .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-syndicate .Button--selected,.theme-syndicate .Button--selected--translucent{background-color:#9d0808;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--selected:hover,.theme-syndicate .Button--selected--translucent:hover{background-color:#c11919;color:#fff}.theme-syndicate .NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.theme-syndicate .NoticeBox--color--black{color:#fff;background-color:#000}.theme-syndicate .NoticeBox--color--white{color:#000;background-color:#b3b3b3}.theme-syndicate .NoticeBox--color--red{color:#fff;background-color:#701f1f}.theme-syndicate .NoticeBox--color--orange{color:#fff;background-color:#854114}.theme-syndicate .NoticeBox--color--yellow{color:#000;background-color:#83710d}.theme-syndicate .NoticeBox--color--olive{color:#000;background-color:#576015}.theme-syndicate .NoticeBox--color--green{color:#fff;background-color:#174e24}.theme-syndicate .NoticeBox--color--teal{color:#fff;background-color:#064845}.theme-syndicate .NoticeBox--color--blue{color:#fff;background-color:#1b4565}.theme-syndicate .NoticeBox--color--violet{color:#fff;background-color:#3b2864}.theme-syndicate .NoticeBox--color--purple{color:#fff;background-color:#542663}.theme-syndicate .NoticeBox--color--pink{color:#fff;background-color:#802257}.theme-syndicate .NoticeBox--color--brown{color:#fff;background-color:#4c3729}.theme-syndicate .NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.theme-syndicate .NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.theme-syndicate .NoticeBox--color--average{color:#fff;background-color:#7b4e13}.theme-syndicate .NoticeBox--color--bad{color:#fff;background-color:#701f1f}.theme-syndicate .NoticeBox--color--label{color:#fff;background-color:#635c5c}.theme-syndicate .NoticeBox--color--gold{color:#fff;background-color:#825d13}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#87ce87;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:.5em}.theme-syndicate .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-syndicate .Input--disabled{color:#777;border-color:#6b6b6b;border-color:rgba(107,107,107,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-syndicate .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-syndicate .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-syndicate .TextArea{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-syndicate .TextArea--fluid{display:block;width:auto;height:auto}.theme-syndicate .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-syndicate .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-syndicate .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-syndicate .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-syndicate .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-syndicate .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-syndicate .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-syndicate .Knob__popupValue,.theme-syndicate .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-syndicate .Knob__popupValue--right{top:.25rem;right:-50%}.theme-syndicate .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-syndicate .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-syndicate .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-syndicate .Knob__ringFillPivot{transform:rotate(135deg)}.theme-syndicate .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-syndicate .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-syndicate .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-syndicate .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-syndicate .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-syndicate .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-syndicate .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-syndicate .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-syndicate .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-syndicate .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-syndicate .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-syndicate .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-syndicate .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-syndicate .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-syndicate .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-syndicate .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-syndicate .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-syndicate .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-syndicate .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-syndicate .Knob--color--label .Knob__ringFill{stroke:#b89797}.theme-syndicate .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-syndicate .Slider:not(.Slider__disabled){cursor:e-resize}.theme-syndicate .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-syndicate .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-syndicate .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-syndicate .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-syndicate .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-syndicate .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-syndicate .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-syndicate .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:.0833333333em solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .ProgressBar--color--disabled{border:1px solid #999}.theme-syndicate .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-syndicate .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-syndicate .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-syndicate .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-syndicate .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-syndicate .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-syndicate .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-syndicate .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-syndicate .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-syndicate .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-syndicate .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-syndicate .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-syndicate .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-syndicate .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-syndicate .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-syndicate .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-syndicate .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-syndicate .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-syndicate .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-syndicate .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-syndicate .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-syndicate .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-syndicate .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-syndicate .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-syndicate .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-syndicate .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-syndicate .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-syndicate .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-syndicate .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-syndicate .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-syndicate .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-syndicate .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-syndicate .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-syndicate .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-syndicate .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-syndicate .ProgressBar--color--label{border:.0833333333em solid #9d6f6f!important}.theme-syndicate .ProgressBar--color--label .ProgressBar__fill{background-color:#9d6f6f}.theme-syndicate .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-syndicate .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-syndicate .Chat{color:#abc6ec}.theme-syndicate .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-syndicate .Chat__badge:before{content:"x"}.theme-syndicate .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-syndicate .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-syndicate .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-syndicate .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#2b0101}.theme-syndicate .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-syndicate .Chat__highlight{color:#000}.theme-syndicate .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-syndicate .ChatMessage{word-wrap:break-word}.theme-syndicate .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-syndicate .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-syndicate html,.theme-syndicate body{scrollbar-color:#770303 #3a0202}.theme-syndicate .Layout,.theme-syndicate .Layout *{scrollbar-base-color:#3a0202;scrollbar-face-color:#770303;scrollbar-3dlight-color:#4d0202;scrollbar-highlight-color:#4d0202;scrollbar-track-color:#3a0202;scrollbar-arrow-color:#fa2d2d;scrollbar-shadow-color:#770303}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-syndicate .Layout__content--flexRow{display:flex;flex-flow:row}.theme-syndicate .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-syndicate .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-syndicate .Layout__content--noMargin{margin:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#4d0202;background-image:linear-gradient(to bottom,#4d0202,#4d0202)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-syndicate .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-syndicate .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-syndicate .Window__contentPadding:after{height:0}.theme-syndicate .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(108,22,22,.25);pointer-events:none}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#910101;transition:color .25s,background-color .25s}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-syndicate .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-syndicate .adminooc{color:#29ccbe}.theme-syndicate .debug{color:#8f39e6}.theme-syndicate .boxed_message{background:#360a0a}.theme-syndicate .boxed_message.red_border{background:#400000}.theme-syndicate .boxed_message.green_border{background:#261a00}.theme-syndicate .boxed_message.purple_border{background:#260026}.theme-syndicate .boxed_message.notice_border{background:#260016}.theme-paradise .color-black{color:#1a1a1a!important}.theme-paradise .color-white{color:#fff!important}.theme-paradise .color-red{color:#df3e3e!important}.theme-paradise .color-orange{color:#f37f33!important}.theme-paradise .color-yellow{color:#fbda21!important}.theme-paradise .color-olive{color:#cbe41c!important}.theme-paradise .color-green{color:#25ca4c!important}.theme-paradise .color-teal{color:#00d6cc!important}.theme-paradise .color-blue{color:#2e93de!important}.theme-paradise .color-violet{color:#7349cf!important}.theme-paradise .color-purple{color:#ad45d0!important}.theme-paradise .color-pink{color:#e34da1!important}.theme-paradise .color-brown{color:#b97447!important}.theme-paradise .color-grey{color:#848484!important}.theme-paradise .color-good{color:#68c22d!important}.theme-paradise .color-average{color:#f29a29!important}.theme-paradise .color-bad{color:#df3e3e!important}.theme-paradise .color-label{color:#b8a497!important}.theme-paradise .color-gold{color:#f3b22f!important}.theme-paradise .color-bg-black{background-color:#000!important}.theme-paradise .color-bg-white{background-color:#d9d9d9!important}.theme-paradise .color-bg-red{background-color:#bd2020!important}.theme-paradise .color-bg-orange{background-color:#d95e0c!important}.theme-paradise .color-bg-yellow{background-color:#d9b804!important}.theme-paradise .color-bg-olive{background-color:#9aad14!important}.theme-paradise .color-bg-green{background-color:#1b9638!important}.theme-paradise .color-bg-teal{background-color:#009a93!important}.theme-paradise .color-bg-blue{background-color:#1c71b1!important}.theme-paradise .color-bg-violet{background-color:#552dab!important}.theme-paradise .color-bg-purple{background-color:#8b2baa!important}.theme-paradise .color-bg-pink{background-color:#cf2082!important}.theme-paradise .color-bg-brown{background-color:#8c5836!important}.theme-paradise .color-bg-grey{background-color:#646464!important}.theme-paradise .color-bg-good{background-color:#4d9121!important}.theme-paradise .color-bg-average{background-color:#cd7a0d!important}.theme-paradise .color-bg-bad{background-color:#bd2020!important}.theme-paradise .color-bg-label{background-color:#9d826f!important}.theme-paradise .color-bg-gold{background-color:#d6920c!important}.theme-paradise .color-border-black{border-color:#1a1a1a!important}.theme-paradise .color-border-white{border-color:#fff!important}.theme-paradise .color-border-red{border-color:#df3e3e!important}.theme-paradise .color-border-orange{border-color:#f37f33!important}.theme-paradise .color-border-yellow{border-color:#fbda21!important}.theme-paradise .color-border-olive{border-color:#cbe41c!important}.theme-paradise .color-border-green{border-color:#25ca4c!important}.theme-paradise .color-border-teal{border-color:#00d6cc!important}.theme-paradise .color-border-blue{border-color:#2e93de!important}.theme-paradise .color-border-violet{border-color:#7349cf!important}.theme-paradise .color-border-purple{border-color:#ad45d0!important}.theme-paradise .color-border-pink{border-color:#e34da1!important}.theme-paradise .color-border-brown{border-color:#b97447!important}.theme-paradise .color-border-grey{border-color:#848484!important}.theme-paradise .color-border-good{border-color:#68c22d!important}.theme-paradise .color-border-average{border-color:#f29a29!important}.theme-paradise .color-border-bad{border-color:#df3e3e!important}.theme-paradise .color-border-label{border-color:#b8a497!important}.theme-paradise .color-border-gold{border-color:#f3b22f!important}.theme-paradise .Section{position:relative;margin-bottom:.5em;background-color:#40071a;background-color:rgba(0,0,0,.5);box-sizing:border-box}.theme-paradise .Section:last-child{margin-bottom:0}.theme-paradise .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #208080}.theme-paradise .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-paradise .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-paradise .Section__rest{position:relative}.theme-paradise .Section__content{padding:.66em .5em}.theme-paradise .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-paradise .Section--fill{display:flex;flex-direction:column;height:100%}.theme-paradise .Section--fill>.Section__rest{flex-grow:1}.theme-paradise .Section--fill>.Section__rest>.Section__content{height:100%}.theme-paradise .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-paradise .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-paradise .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-paradise .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-paradise .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-paradise .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-paradise .Section .Section:first-child{margin-top:-.5em}.theme-paradise .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-paradise .Section .Section .Section .Section__titleText{font-size:1em}.theme-paradise .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-paradise .Button:last-child{margin-right:0;margin-bottom:0}.theme-paradise .Button .fa,.theme-paradise .Button .fas,.theme-paradise .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-paradise .Button--hasContent .fa,.theme-paradise .Button--hasContent .fas,.theme-paradise .Button--hasContent .far{margin-right:.25em}.theme-paradise .Button--hasContent.Button--iconRight .fa,.theme-paradise .Button--hasContent.Button--iconRight .fas,.theme-paradise .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-paradise .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-paradise .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-paradise .Button--circular{border-radius:50%}.theme-paradise .Button--compact{padding:0 .25em;line-height:1.333em}.theme-paradise .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-paradise .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-paradise .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--black:hover{background-color:#101010;color:#fff}.theme-paradise .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-paradise .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-paradise .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-paradise .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-paradise .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-paradise .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-paradise .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-paradise .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-paradise .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-paradise .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-paradise .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-paradise .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-paradise .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-paradise .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-paradise .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-paradise .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-paradise .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-paradise .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-paradise .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-paradise .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-paradise .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-paradise .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-paradise .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-paradise .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-paradise .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-paradise .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-paradise .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-paradise .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-paradise .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-paradise .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-paradise .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-paradise .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-paradise .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-paradise .Button--color--label{background-color:#9d826f;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--label:hover{background-color:#b8a396;color:#fff}.theme-paradise .Button--color--label--translucent{background-color:rgba(157,130,111,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--label--translucent:hover{background-color:rgba(184,163,150,.5);color:#fff}.theme-paradise .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-paradise .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-paradise .Button--color--transparent{background-color:rgba(128,13,51,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--transparent:hover{background-color:rgba(164,27,73,.81);color:#fff}.theme-paradise .Button--color--default{background-color:#208080;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--default:hover{background-color:#34a0a0;color:#fff}.theme-paradise .Button--color--default--translucent{background-color:rgba(141,20,60,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--default--translucent:hover{background-color:rgba(175,39,84,.5);color:#fff}.theme-paradise .Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--caution:hover{background-color:#f5d523;color:#000}.theme-paradise .Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-paradise .Button--color--danger{background-color:#8c1eff;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--danger:hover{background-color:#ae61ff;color:#fff}.theme-paradise .Button--color--danger--translucent{background-color:rgba(140,30,255,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--danger--translucent:hover{background-color:rgba(174,97,255,.5);color:#fff}.theme-paradise .Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.theme-paradise .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-paradise .Button--selected,.theme-paradise .Button--selected--translucent{background-color:#bf6030;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--selected:hover,.theme-paradise .Button--selected--translucent:hover{background-color:#d4835a;color:#fff}.theme-paradise .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;color:#e65c2e;background-color:rgba(0,0,0,.25);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-paradise .NumberInput--fluid{display:block}.theme-paradise .NumberInput__content{margin-left:.5em}.theme-paradise .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-paradise .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #e65c2e;background-color:#e65c2e}.theme-paradise .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,.25);color:#fff;text-align:right}.theme-paradise .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;background-color:rgba(0,0,0,.25);color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-paradise .Input--disabled{color:#777;border-color:#4a4a4a;border-color:rgba(74,74,74,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-paradise .Input--fluid{display:block;width:auto}.theme-paradise .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-paradise .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-paradise .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-paradise .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-paradise .TextArea{position:relative;display:inline-block;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;background-color:rgba(0,0,0,.25);margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-paradise .TextArea--fluid{display:block;width:auto;height:auto}.theme-paradise .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-paradise .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-paradise .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-paradise .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-paradise .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-paradise .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-paradise .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-paradise .Knob__popupValue,.theme-paradise .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-paradise .Knob__popupValue--right{top:.25rem;right:-50%}.theme-paradise .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-paradise .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-paradise .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-paradise .Knob__ringFillPivot{transform:rotate(135deg)}.theme-paradise .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-paradise .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-paradise .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-paradise .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-paradise .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-paradise .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-paradise .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-paradise .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-paradise .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-paradise .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-paradise .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-paradise .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-paradise .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-paradise .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-paradise .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-paradise .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-paradise .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-paradise .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-paradise .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-paradise .Knob--color--label .Knob__ringFill{stroke:#b8a497}.theme-paradise .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-paradise .Slider:not(.Slider__disabled){cursor:e-resize}.theme-paradise .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-paradise .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-paradise .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-paradise .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-paradise .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-paradise .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-paradise .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-paradise .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-paradise .ProgressBar--color--default{border:.0833333333em solid #1b6d6d}.theme-paradise .ProgressBar--color--default .ProgressBar__fill{background-color:#1b6d6d}.theme-paradise .ProgressBar--color--disabled{border:1px solid #999}.theme-paradise .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-paradise .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-paradise .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-paradise .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-paradise .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-paradise .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-paradise .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-paradise .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-paradise .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-paradise .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-paradise .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-paradise .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-paradise .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-paradise .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-paradise .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-paradise .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-paradise .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-paradise .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-paradise .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-paradise .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-paradise .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-paradise .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-paradise .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-paradise .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-paradise .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-paradise .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-paradise .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-paradise .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-paradise .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-paradise .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-paradise .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-paradise .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-paradise .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-paradise .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-paradise .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-paradise .ProgressBar--color--label{border:.0833333333em solid #9d826f!important}.theme-paradise .ProgressBar--color--label .ProgressBar__fill{background-color:#9d826f}.theme-paradise .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-paradise .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-paradise .Chat{color:#abc6ec}.theme-paradise .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-paradise .Chat__badge:before{content:"x"}.theme-paradise .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-paradise .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-paradise .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-paradise .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#fff;background-color:#db2828}.theme-paradise .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-paradise .Chat__highlight{color:#000}.theme-paradise .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-paradise .ChatMessage{word-wrap:break-word}.theme-paradise .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-paradise .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-paradise html,.theme-paradise body{scrollbar-color:#cb1551 #680b29}.theme-paradise .Layout,.theme-paradise .Layout *{scrollbar-base-color:#680b29;scrollbar-face-color:#99103d;scrollbar-3dlight-color:#800d33;scrollbar-highlight-color:#800d33;scrollbar-track-color:#680b29;scrollbar-arrow-color:#ea2e6c;scrollbar-shadow-color:#99103d}.theme-paradise .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-paradise .Layout__content--flexRow{display:flex;flex-flow:row}.theme-paradise .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-paradise .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-paradise .Layout__content--noMargin{margin:0}.theme-paradise .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#800d33;background-image:linear-gradient(to bottom,#80014b,#80460d)}.theme-paradise .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-paradise .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-paradise .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-paradise .Window__contentPadding:after{height:0}.theme-paradise .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-paradise .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(166,34,78,.25);pointer-events:none}.theme-paradise .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-paradise .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-paradise .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-paradise .TitleBar{background-color:#800d33;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-paradise .TitleBar__clickable{color:rgba(255,0,0,.5);background-color:#800d33;transition:color .25s,background-color .25s}.theme-paradise .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-paradise .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-paradise .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-paradise .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-paradise .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-paradise .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-paradise .adminooc{color:#29ccbe}.theme-paradise .debug{color:#8f39e6}.theme-paradise .boxed_message{background:rgba(0,0,0,.25);border-color:rgba(223,181,159,.25)}.theme-paradise .boxed_message.red_border{background:rgba(22,3,3,.25);border-color:rgba(255,0,0,.5)}.theme-paradise .boxed_message.green_border{background:rgba(3,22,10,.25);border-color:rgba(0,255,0,.5)}.theme-paradise .boxed_message.purple_border{background:rgba(10,3,22,.25);border-color:rgba(136,77,255,.5)}.theme-paradise .boxed_message.notice_border{background:rgba(3,10,22,.25);border-color:rgba(85,126,246,.5)} +html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-gold{color:#f3b22f!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.color-bg-gold{background-color:#d6920c!important}.color-border-black{border-color:#1a1a1a!important}.color-border-white{border-color:#fff!important}.color-border-red{border-color:#df3e3e!important}.color-border-orange{border-color:#f37f33!important}.color-border-yellow{border-color:#fbda21!important}.color-border-olive{border-color:#cbe41c!important}.color-border-green{border-color:#25ca4c!important}.color-border-teal{border-color:#00d6cc!important}.color-border-blue{border-color:#2e93de!important}.color-border-violet{border-color:#7349cf!important}.color-border-purple{border-color:#ad45d0!important}.color-border-pink{border-color:#e34da1!important}.color-border-brown{border-color:#b97447!important}.color-border-grey{border-color:#848484!important}.color-border-good{border-color:#68c22d!important}.color-border-average{border-color:#f29a29!important}.color-border-bad{border-color:#df3e3e!important}.color-border-label{border-color:#8b9bb0!important}.color-border-gold{border-color:#f3b22f!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.outline-color-gold{outline:.167rem solid #f3b22f!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconRight .fa,.Button--hasContent.Button--iconRight .fas,.Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--multiLine{white-space:normal;word-wrap:break-word}.Button--modal{float:right;z-index:1;margin-top:-.5rem}.Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.Button--color--black:hover{background-color:#101010;color:#fff}.Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.Button--color--white:hover{background-color:#f8f8f8;color:#000}.Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--red:hover{background-color:#d93f3f;color:#fff}.Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.Button--color--orange:hover{background-color:#ef7e33;color:#fff}.Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.Button--color--yellow:hover{background-color:#f5d523;color:#000}.Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.Button--color--olive:hover{background-color:#bdd327;color:#fff}.Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.Button--color--green:hover{background-color:#2fb94f;color:#fff}.Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.Button--color--teal:hover{background-color:#10bdb6;color:#fff}.Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.Button--color--blue:hover{background-color:#308fd6;color:#fff}.Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.Button--color--violet:hover{background-color:#7249ca;color:#fff}.Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.Button--color--purple:hover{background-color:#aa46ca;color:#fff}.Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.Button--color--pink:hover{background-color:#e04ca0;color:#fff}.Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.Button--color--brown:hover{background-color:#ae724c;color:#fff}.Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.Button--color--grey:hover{background-color:#818181;color:#fff}.Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.Button--color--good:hover{background-color:#67b335;color:#fff}.Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.Button--color--average:hover{background-color:#eb972b;color:#fff}.Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--bad:hover{background-color:#d93f3f;color:#fff}.Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--color--label{background-color:#657a94;color:#fff;transition:color .2s,background-color .2s}.Button--color--label:hover{background-color:#8a9aae;color:#fff}.Button--color--label--translucent{background-color:rgba(101,122,148,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--label--translucent:hover{background-color:rgba(138,154,174,.5);color:#fff}.Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.Button--color--gold:hover{background-color:#eeaf30;color:#fff}.Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.Button--color--transparent{background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--transparent:hover{background-color:rgba(50,50,50,.81);color:#fff}.Button--color--default{background-color:#3e6189;color:#fff;transition:color .2s,background-color .2s}.Button--color--default:hover{background-color:#567daa;color:#fff}.Button--color--default--translucent{background-color:rgba(40,40,40,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--default--translucent:hover{background-color:rgba(61,61,61,.5);color:#fff}.Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.Button--color--caution:hover{background-color:#f5d523;color:#000}.Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.Button--color--danger{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.Button--color--danger:hover{background-color:#d93f3f;color:#fff}.Button--color--danger--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.Button--color--danger--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.Button--selected,.Button--selected--translucent{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.Button--selected:hover,.Button--selected--translucent:hover{background-color:#2fb94f;color:#fff}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{position:relative;align-items:center}.Dropdown__control{display:inline-block;align-items:center;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.3333333333em;-ms-user-select:none;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;align-items:center;z-index:5;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-scroll{overflow-y:scroll}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry.selected{background-color:rgba(255,255,255,.5)!important;transition:background-color 0ms}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em);text-align:left;padding-top:2.5px}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue,.Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__popupValue--right{top:.25rem;right:-50%}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left;vertical-align:baseline}.LabeledList__label{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem;scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--gold{color:#fff;background-color:#825d13}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .5s,width .5s}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--disabled{border:1px solid #999}.ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.ProgressBar--color--black{border:.0833333333em solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:.0833333333em solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:.0833333333em solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider:not(.Slider__disabled){cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(2n){background-color:#131313}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em .25em .25em 0}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-right-radius:.25em;border-bottom-right-radius:.25em}.Tabs--vertical .Tab--selected{border-left:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-left-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-left-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-left-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-left-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-left-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-left-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-left-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-left-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-left-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-left-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-left-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-left-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-left-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-left-color:#848484}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-left-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-left-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-left-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-left-color:#8b9bb0}.Tab--selected.Tab--color--gold{color:#f6c563}.Tabs--horizontal .Tab--selected.Tab--color--gold{border-bottom-color:#f3b22f}.Tabs--vertical .Tab--selected.Tab--color--gold{border-left-color:#f3b22f}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.Input--disabled{color:#777;border-color:#848484;border-color:rgba(132,132,132,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;top:1em;left:.75em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}html,body{scrollbar-color:#363636 #181818}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.Layout__content--noMargin{margin:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020,#202020)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}em{font-style:normal;font-weight:700}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.emoji{max-height:16px;max-width:16px}.emoji16x16{vertical-align:middle}.italic,.italics,.emote{font-style:italic}.bold{font-weight:700}.bolditalics{font-style:italic;font-weight:700}.center{text-align:center}.big{font-size:150%}.reallybig{font-size:175%}.sans{font-family:Comic Sans MS,cursive,sans-serif}.wingdings{font-family:Wingdings,Webdings}.robot{font-family:OCR-A,monospace;font-size:1.15em;font-weight:700}.hidden{display:none;visibility:hidden}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:active,.motd a:hover{color:#a4bad6}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:75%}.ooc{font-weight:700}.looc{color:#69c;font-weight:700}.discordpm{color:#6685f5}.debug{color:#6d2f83}.deadsay{color:#e2c1ff}.darkmblue{color:#6685f5}.prefix,.name,.yell{font-weight:700}.mentorhelp{color:#07b;font-weight:700}.mentor_channel{color:#775bff;font-weight:700}.mentor_channel_admin{color:#a35cff;font-weight:700}.admin{color:#386aff;font-weight:700}.adminhelp{color:#a00;font-weight:700}.adminticket{color:#3daf21;font-weight:700}.adminticketalt{color:#ccb847;font-weight:700}.admin_channel{color:#03fc9d;font-weight:700}.all_admin_ping{color:#12a5f4;font-weight:700;font-size:120%;text-align:center}.dev_channel{color:#61b413;font-weight:700}.dev_channel_admin{color:#9ef14f;font-weight:700}.radio{color:#20b142}.deptradio{color:#939}.comradio{color:#5f5cff}.syndradio{color:#8f4a4b}.dsquadradio{color:#998599}.airadio{color:#ff5ed7}.centradio{color:#2681a5}.secradio{color:#dd3535}.engradio{color:#feac20}.medradio{color:#00b5ad}.sciradio{color:#c68cfa}.supradio{color:#b88646}.srvradio{color:#bbd164}.proradio{color:#b84f92}.alert{color:#d82020}h1.alert,h2.alert{color:#a4bad6}.ghostalert{color:#cc00c6;font-style:italic;font-weight:700}.warning{color:#c51e1e;font-style:italic}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.danger{color:#c51e1e;font-weight:700}.biggerdanger{color:red;font-weight:700;font-size:150%}.userdanger{color:#c51e1e;font-weight:700;font-size:120%}.attack{color:red}.disarm{color:#900}.moderate{color:#c00}.notice{color:#6685f5}.boldnotice{color:#6685f5;font-weight:700}.suicide{color:#ff5050;font-style:italic}.announcement h1,.announcement h2{color:#a4bad6;margin:8pt 0;line-height:1.2}.announcement p{color:#d82020;line-height:1.3}.announcement.minor h1{font-size:180%}.announcement.minor h2{font-size:170%}.announcement.sec h1{color:red;font-size:180%;font-family:Verdana,sans-serif}.boldannounceic,.boldannounceooc,.pr_announce{color:#c51e1e;font-weight:700}.greenannounce{color:#059223;font-weight:700}.alien{color:#c433c4}.noticealien{color:#00c000}.alertalien{color:#00c000;font-weight:700}.terrorspider{color:#cf52fa}.dantalion{color:#8b2c5e}.chaosverygood{color:#19e0c0;font-weight:700;font-size:120%}.chaosgood{color:#19e0c0;font-weight:700}.chaosneutral{color:#479ac0;font-weight:700}.chaosbad{color:#9047c0;font-weight:700}.chaosverybad{color:#9047c0;font-weight:700;font-size:120%}.sinister{color:purple;font-weight:700;font-style:italic}.blob{color:#ee4000;font-style:italic}.revennotice{color:#6685f5}.revenbignotice{color:#6685f5;font-weight:700;font-size:120%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:120%}.changeling{color:#00b4de}.abductor{color:purple;font-style:italic}.mind_control{color:#a00d6f;font-size:3;font-weight:700;font-style:italic}.cult{color:purple;font-weight:700;font-style:italic}.cultspeech{color:#af0000;font-style:italic}.cultitalic{color:#a60000;font-style:italic}.cultlarge{color:#a60000;font-weight:700;font-size:120%}.narsie{color:#a60000;font-weight:700;font-size:300%}.narsiesmall{color:#a60000;font-weight:700;font-size:200%}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.zombie{color:#7c4848}.zombielarge{color:#7c4848;font-weight:700;font-size:120%}.colossus{color:#7f282a;font-size:175%}.hierophant{color:#609;font-weight:700;font-style:italic}.hierophant_warning{color:#609;font-style:italic}.tajaran{color:#803b56}.skrell{color:#00ced1}.solcom{color:#8282fb}.com_srus{color:#7c4848}.zombie{color:red}.soghun{color:#228b22}.vox{color:#a0a}.diona{color:#804000;font-weight:700}.trinary{color:#727272}.kidan{color:#c64c05}.slime{color:#07a}.drask{color:#a3d4eb;font-family:Arial Black}.moth{color:#869b29;font-family:Copperplate}.clown{color:red}.vulpkanin{color:#b97a57}.gutter{color:#7092be;font-family:Trebuchet MS,cursive,sans-serif}.tradeband{font-family:Georgia,Verdana,sans-serif}.rose{color:#ff5050}.interface{color:#9031c4}.greentext{color:#0f0;font-size:150%}.redtext{color:red;font-size:150%}.red{color:red}.green{color:#03bb39}.purple{color:#9031c4}.orange{color:orange}.resonate{color:#298f85}.healthscan_oxy{color:#5cc9ff}.specialnotice{color:#4a6f82;font-weight:700;font-size:120%}.whisper{font-style:italic;color:#ccc}span.body .codephrases{color:#55f}span.body .coderesponses{color:#f33}.oxygen{color:#449dff}.nitrogen{color:#f94541}.carbon_dioxide{color:#ccc}.plasma{color:#eb6b00}.sleeping_agent{color:#f28b89}.agent_b{color:teal}.boxed_message{background:#17191c;border:1px solid rgba(166,183,217,.25);border-width:.0833333333em .4166666667em;margin:.5em .25em;padding:.5em .75em;border-radius:.5em;text-align:center}.boxed_message.red_border{background:#1f1414;border-color:rgba(255,0,0,.5)}.boxed_message.green_border{background:#141f18;border-color:rgba(0,255,0,.5)}.boxed_message.purple_border{background:#1d1828;border-color:rgba(170,128,255,.5)}.boxed_message.notice_border{background:#14181f;border-color:rgba(85,126,246,.5)}.boxed_message.thick_border{border-width:.5em}.boxed_message.left_align_text{text-align:left}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-gold{color:#e39b0d!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .color-bg-gold{background-color:#bd810b!important}.theme-light .color-border-black{border-color:#000!important}.theme-light .color-border-white{border-color:#e6e6e6!important}.theme-light .color-border-red{border-color:#c82121!important}.theme-light .color-border-orange{border-color:#e6630d!important}.theme-light .color-border-yellow{border-color:#e5c304!important}.theme-light .color-border-olive{border-color:#a3b816!important}.theme-light .color-border-green{border-color:#1d9f3b!important}.theme-light .color-border-teal{border-color:#00a39c!important}.theme-light .color-border-blue{border-color:#1e78bb!important}.theme-light .color-border-violet{border-color:#5a30b5!important}.theme-light .color-border-purple{border-color:#932eb4!important}.theme-light .color-border-pink{border-color:#db228a!important}.theme-light .color-border-brown{border-color:#955d39!important}.theme-light .color-border-grey{border-color:#e6e6e6!important}.theme-light .color-border-good{border-color:#529923!important}.theme-light .color-border-average{border-color:#da810e!important}.theme-light .color-border-bad{border-color:#c82121!important}.theme-light .color-border-label{border-color:#353535!important}.theme-light .color-border-gold{border-color:#e39b0d!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em .25em .25em 0}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(0,0,0,.075);transition:background-color 0}.theme-light .Tab--selected{background-color:rgba(0,0,0,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-right-radius:.25em;border-bottom-right-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-left:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-left-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-left-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-left-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-left-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-left-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-left-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-left-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-left-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-left-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-left-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-left-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-left-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-left-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-left-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-left-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-left-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-left-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-left-color:#353535}.theme-light .Tab--selected.Tab--color--gold{color:#f4b73f}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--gold{border-bottom-color:#e39b0d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--gold{border-left-color:#e39b0d}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconRight .fa,.theme-light .Button--hasContent.Button--iconRight .fas,.theme-light .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-light .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-light .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--black:hover{background-color:#101010;color:#fff}.theme-light .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-light .Button--color--white{background-color:#bfbfbf;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--white:hover{background-color:#e7e7e7;color:#000}.theme-light .Button--color--white--translucent{background-color:rgba(191,191,191,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--white--translucent:hover{background-color:rgba(231,231,231,.5);color:#fff}.theme-light .Button--color--red{background-color:#a61c1c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--red:hover{background-color:#cb3030;color:#fff}.theme-light .Button--color--red--translucent{background-color:rgba(166,28,28,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--red--translucent:hover{background-color:rgba(203,48,48,.5);color:#fff}.theme-light .Button--color--orange{background-color:#c0530b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--orange:hover{background-color:#e76d1d;color:#fff}.theme-light .Button--color--orange--translucent{background-color:rgba(192,83,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--orange--translucent:hover{background-color:rgba(231,109,29,.5);color:#fff}.theme-light .Button--color--yellow{background-color:#bfa303;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--yellow:hover{background-color:#e7c714;color:#fff}.theme-light .Button--color--yellow--translucent{background-color:rgba(191,163,3,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--yellow--translucent:hover{background-color:rgba(231,199,20,.5);color:#fff}.theme-light .Button--color--olive{background-color:#889912;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--olive:hover{background-color:#a9bc25;color:#fff}.theme-light .Button--color--olive--translucent{background-color:rgba(136,153,18,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--olive--translucent:hover{background-color:rgba(169,188,37,.5);color:#fff}.theme-light .Button--color--green{background-color:#188532;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--green:hover{background-color:#2ba648;color:#fff}.theme-light .Button--color--green--translucent{background-color:rgba(24,133,50,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--green--translucent:hover{background-color:rgba(43,166,72,.5);color:#fff}.theme-light .Button--color--teal{background-color:#008882;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--teal:hover{background-color:#10a9a2;color:#fff}.theme-light .Button--color--teal--translucent{background-color:rgba(0,136,130,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--teal--translucent:hover{background-color:rgba(16,169,162,.5);color:#fff}.theme-light .Button--color--blue{background-color:#19649c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--blue:hover{background-color:#2c81c0;color:#fff}.theme-light .Button--color--blue--translucent{background-color:rgba(25,100,156,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--blue--translucent:hover{background-color:rgba(44,129,192,.5);color:#fff}.theme-light .Button--color--violet{background-color:#4b2897;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--violet:hover{background-color:#653db9;color:#fff}.theme-light .Button--color--violet--translucent{background-color:rgba(75,40,151,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--violet--translucent:hover{background-color:rgba(101,61,185,.5);color:#fff}.theme-light .Button--color--purple{background-color:#7a2696;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--purple:hover{background-color:#9a3bb9;color:#fff}.theme-light .Button--color--purple--translucent{background-color:rgba(122,38,150,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--purple--translucent:hover{background-color:rgba(154,59,185,.5);color:#fff}.theme-light .Button--color--pink{background-color:#b61d73;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--pink:hover{background-color:#d93591;color:#fff}.theme-light .Button--color--pink--translucent{background-color:rgba(182,29,115,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--pink--translucent:hover{background-color:rgba(217,53,145,.5);color:#fff}.theme-light .Button--color--brown{background-color:#7c4d2f;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--brown:hover{background-color:#9c6745;color:#fff}.theme-light .Button--color--brown--translucent{background-color:rgba(124,77,47,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--brown--translucent:hover{background-color:rgba(156,103,69,.5);color:#fff}.theme-light .Button--color--grey{background-color:#bfbfbf;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--grey:hover{background-color:#e7e7e7;color:#000}.theme-light .Button--color--grey--translucent{background-color:rgba(191,191,191,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--grey--translucent:hover{background-color:rgba(231,231,231,.5);color:#fff}.theme-light .Button--color--good{background-color:#44801d;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--good:hover{background-color:#5d9f31;color:#fff}.theme-light .Button--color--good--translucent{background-color:rgba(68,128,29,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--good--translucent:hover{background-color:rgba(93,159,49,.5);color:#fff}.theme-light .Button--color--average{background-color:#b56b0b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--average:hover{background-color:#dc891d;color:#fff}.theme-light .Button--color--average--translucent{background-color:rgba(181,107,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--average--translucent:hover{background-color:rgba(220,137,29,.5);color:#fff}.theme-light .Button--color--bad{background-color:#a61c1c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--bad:hover{background-color:#cb3030;color:#fff}.theme-light .Button--color--bad--translucent{background-color:rgba(166,28,28,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--bad--translucent:hover{background-color:rgba(203,48,48,.5);color:#fff}.theme-light .Button--color--label{background-color:#2c2c2c;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--label:hover{background-color:#424242;color:#fff}.theme-light .Button--color--label--translucent{background-color:rgba(44,44,44,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--label--translucent:hover{background-color:rgba(66,66,66,.5);color:#fff}.theme-light .Button--color--gold{background-color:#bd810b;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--gold:hover{background-color:#e5a11c;color:#fff}.theme-light .Button--color--gold--translucent{background-color:rgba(189,129,11,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--gold--translucent:hover{background-color:rgba(229,161,28,.5);color:#fff}.theme-light .Button--color--transparent{background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--transparent:hover{background-color:rgba(255,255,255,.81);color:#000}.theme-light .Button--color--default{background-color:#bbb;color:#000;transition:color .2s,background-color .2s}.theme-light .Button--color--default:hover{background-color:#e3e3e3;color:#000}.theme-light .Button--color--default--translucent{background-color:rgba(251,251,251,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--default--translucent:hover{background-color:rgba(254,254,254,.5);color:#fff}.theme-light .Button--color--caution{background-color:#be6209;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--caution:hover{background-color:#e67f1a;color:#fff}.theme-light .Button--color--caution--translucent{background-color:rgba(190,98,9,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--caution--translucent:hover{background-color:rgba(230,127,26,.5);color:#fff}.theme-light .Button--color--danger{background-color:#9a9d00;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--color--danger:hover{background-color:#bec110;color:#fff}.theme-light .Button--color--danger--translucent{background-color:rgba(154,157,0,.33);color:rgba(0,0,0,.5);transition:color .2s,background-color .2s}.theme-light .Button--color--danger--translucent:hover{background-color:rgba(190,193,16,.5);color:#fff}.theme-light .Button--disabled{background-color:#363636!important;color:rgba(0,0,0,.75)!important}.theme-light .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(0,0,0,.5)!important}.theme-light .Button--selected,.theme-light .Button--selected--translucent{background-color:#0668b8;color:#fff;transition:color .2s,background-color .2s}.theme-light .Button--selected:hover,.theme-light .Button--selected--translucent:hover{background-color:#1785df;color:#fff}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#e6e6e6;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#e6e6e6;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#e6e6e6;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-light .Input--disabled{color:#777;border-color:#000;border-color:rgba(0,0,0,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-light .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#e6e6e6;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue,.theme-light .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__popupValue--right{top:.25rem;right:-50%}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--gold .Knob__ringFill{stroke:#e39b0d}.theme-light .Slider:not(.Slider__disabled){cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--disabled{border:1px solid #999}.theme-light .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-light .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border:.0833333333em solid #c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border:.0833333333em solid #bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border:.0833333333em solid #889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border:.0833333333em solid #188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border:.0833333333em solid #008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border:.0833333333em solid #19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border:.0833333333em solid #4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border:.0833333333em solid #7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border:.0833333333em solid #b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border:.0833333333em solid #7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--good{border:.0833333333em solid #44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border:.0833333333em solid #b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border:.0833333333em solid #2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--gold{border:.0833333333em solid #bd810b!important}.theme-light .ProgressBar--color--gold .ProgressBar__fill{background-color:#bd810b}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light html,.theme-light body{scrollbar-color:#a7a7a7 #f2f2f2}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-light .Layout__content--noMargin{margin:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s,background-color .25s}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light a,.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f}.theme-light .motd,.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6,.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .looc{color:#69c}.theme-light .discordpm{color:#00f}.theme-light .debug{color:#6d2f83}.theme-light .deadsay{color:#5c00e6}.theme-light .darkmblue{color:#00f}.theme-light .mentorhelp{color:#07b}.theme-light .mentor_channel{color:#775bff}.theme-light .mentor_channel_admin{color:#a35cff}.theme-light .adminhelp{color:#a00}.theme-light .adminticket{color:#3e7336}.theme-light .adminticketalt{color:#014c8a}.theme-light .admin_channel{color:#9a04d1}.theme-light .all_admin_ping{color:#12a5f4}.theme-light .dev_channel{color:#126719}.theme-light .dev_channel_admin{color:#26a419}.theme-light .radio{color:#408010}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#204090}.theme-light .syndradio{color:#6d3f40}.theme-light .dsquadradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .centradio{color:#5c5c7c}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .medradio{color:#009190}.theme-light .sciradio{color:#939}.theme-light .supradio{color:#7f6539}.theme-light .srvradio{color:#80a000}.theme-light .proradio{color:#e3027a}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .ghostalert{color:#5c00e6}.theme-light .warning,.theme-light .boldwarning,.theme-light .danger,.theme-light .userdanger{color:red}.theme-light .notice,.theme-light .boldnotice{color:#009}.theme-light .announcement h1,.theme-light .announcement h2{color:#000}.theme-light .announcement.sec h1,.theme-light .boldannounceic,.theme-light .boldannounceooc{color:red}.theme-light .pr_announce{color:#228b22}.theme-light .greenannounce{color:#0f0}.theme-light .alien{color:#543354}.theme-light .terrorspider{color:#320e32}.theme-light .dantalion{color:#6a2148}.theme-light .revennotice,.theme-light .revenbignotice{color:#1d2953}.theme-light .changeling{color:purple}.theme-light .cultspeech{color:#7f0000}.theme-light .cultitalic,.theme-light .cultlarge,.theme-light .narsie,.theme-light .narsiesmall{color:#960000}.theme-light .rose{color:#ff5050}.theme-light .interface{color:#303}.theme-light .purple{color:#5e2d79}.theme-light .orange{color:orange}.theme-light .healthscan_oxy{color:#0074bd}.theme-light .specialnotice{color:#36525e}.theme-light .whisper{color:#333}.theme-light span.body .codephrases{color:#00f}.theme-light span.body .coderesponses{color:red}.theme-light .oxygen{color:#006adb}.theme-light .nitrogen{color:#d00a06}.theme-light .carbon_dioxide{color:#1f1f1f}.theme-light .plasma{color:#853c00}.theme-light .sleeping_agent{color:#e82f2c}.theme-light .agent_b{color:#004d4d}.theme-light .boxed_message{background:#f2f7ff;border-color:rgba(16,48,112,.5)}.theme-light .boxed_message.red_border{background:#fff2f2;border-color:rgba(255,0,0,.5)}.theme-light .boxed_message.green_border{background:#f2fff7;border-color:rgba(0,168,0,.5)}.theme-light .boxed_message.purple_border{background:#f7f2ff;border-color:rgba(85,0,255,.5)}.theme-light .boxed_message.notice_border{background:#f2f7ff;border-color:rgba(0,64,255,.5)}.theme-ntos .color-black{color:#1a1a1a!important}.theme-ntos .color-white{color:#fff!important}.theme-ntos .color-red{color:#df3e3e!important}.theme-ntos .color-orange{color:#f37f33!important}.theme-ntos .color-yellow{color:#fbda21!important}.theme-ntos .color-olive{color:#cbe41c!important}.theme-ntos .color-green{color:#25ca4c!important}.theme-ntos .color-teal{color:#00d6cc!important}.theme-ntos .color-blue{color:#2e93de!important}.theme-ntos .color-violet{color:#7349cf!important}.theme-ntos .color-purple{color:#ad45d0!important}.theme-ntos .color-pink{color:#e34da1!important}.theme-ntos .color-brown{color:#b97447!important}.theme-ntos .color-grey{color:#848484!important}.theme-ntos .color-good{color:#68c22d!important}.theme-ntos .color-average{color:#f29a29!important}.theme-ntos .color-bad{color:#df3e3e!important}.theme-ntos .color-label{color:#8b9bb0!important}.theme-ntos .color-gold{color:#f3b22f!important}.theme-ntos .color-bg-black{background-color:#000!important}.theme-ntos .color-bg-white{background-color:#d9d9d9!important}.theme-ntos .color-bg-red{background-color:#bd2020!important}.theme-ntos .color-bg-orange{background-color:#d95e0c!important}.theme-ntos .color-bg-yellow{background-color:#d9b804!important}.theme-ntos .color-bg-olive{background-color:#9aad14!important}.theme-ntos .color-bg-green{background-color:#1b9638!important}.theme-ntos .color-bg-teal{background-color:#009a93!important}.theme-ntos .color-bg-blue{background-color:#1c71b1!important}.theme-ntos .color-bg-violet{background-color:#552dab!important}.theme-ntos .color-bg-purple{background-color:#8b2baa!important}.theme-ntos .color-bg-pink{background-color:#cf2082!important}.theme-ntos .color-bg-brown{background-color:#8c5836!important}.theme-ntos .color-bg-grey{background-color:#646464!important}.theme-ntos .color-bg-good{background-color:#4d9121!important}.theme-ntos .color-bg-average{background-color:#cd7a0d!important}.theme-ntos .color-bg-bad{background-color:#bd2020!important}.theme-ntos .color-bg-label{background-color:#657a94!important}.theme-ntos .color-bg-gold{background-color:#d6920c!important}.theme-ntos .color-border-black{border-color:#1a1a1a!important}.theme-ntos .color-border-white{border-color:#fff!important}.theme-ntos .color-border-red{border-color:#df3e3e!important}.theme-ntos .color-border-orange{border-color:#f37f33!important}.theme-ntos .color-border-yellow{border-color:#fbda21!important}.theme-ntos .color-border-olive{border-color:#cbe41c!important}.theme-ntos .color-border-green{border-color:#25ca4c!important}.theme-ntos .color-border-teal{border-color:#00d6cc!important}.theme-ntos .color-border-blue{border-color:#2e93de!important}.theme-ntos .color-border-violet{border-color:#7349cf!important}.theme-ntos .color-border-purple{border-color:#ad45d0!important}.theme-ntos .color-border-pink{border-color:#e34da1!important}.theme-ntos .color-border-brown{border-color:#b97447!important}.theme-ntos .color-border-grey{border-color:#848484!important}.theme-ntos .color-border-good{border-color:#68c22d!important}.theme-ntos .color-border-average{border-color:#f29a29!important}.theme-ntos .color-border-bad{border-color:#df3e3e!important}.theme-ntos .color-border-label{border-color:#8b9bb0!important}.theme-ntos .color-border-gold{border-color:#f3b22f!important}.theme-ntos .Section{position:relative;margin-bottom:.5em;background-color:#121922;box-sizing:border-box}.theme-ntos .Section:last-child{margin-bottom:0}.theme-ntos .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-ntos .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-ntos .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-ntos .Section__rest{position:relative}.theme-ntos .Section__content{padding:.66em .5em}.theme-ntos .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-ntos .Section--fill{display:flex;flex-direction:column;height:100%}.theme-ntos .Section--fill>.Section__rest{flex-grow:1}.theme-ntos .Section--fill>.Section__rest>.Section__content{height:100%}.theme-ntos .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-ntos .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-ntos .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-ntos .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-ntos .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-ntos .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-ntos .Section .Section:first-child{margin-top:-.5em}.theme-ntos .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-ntos .Section .Section .Section .Section__titleText{font-size:1em}.theme-ntos .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-ntos .Button:last-child{margin-right:0;margin-bottom:0}.theme-ntos .Button .fa,.theme-ntos .Button .fas,.theme-ntos .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-ntos .Button--hasContent .fa,.theme-ntos .Button--hasContent .fas,.theme-ntos .Button--hasContent .far{margin-right:.25em}.theme-ntos .Button--hasContent.Button--iconRight .fa,.theme-ntos .Button--hasContent.Button--iconRight .fas,.theme-ntos .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-ntos .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-ntos .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-ntos .Button--circular{border-radius:50%}.theme-ntos .Button--compact{padding:0 .25em;line-height:1.333em}.theme-ntos .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-ntos .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-ntos .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--black:hover{background-color:#101010;color:#fff}.theme-ntos .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-ntos .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-ntos .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-ntos .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-ntos .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-ntos .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-ntos .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-ntos .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-ntos .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-ntos .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-ntos .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-ntos .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-ntos .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-ntos .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-ntos .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-ntos .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-ntos .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-ntos .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-ntos .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-ntos .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-ntos .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-ntos .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-ntos .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-ntos .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-ntos .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-ntos .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-ntos .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-ntos .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-ntos .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-ntos .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--color--label{background-color:#657a94;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--label:hover{background-color:#8a9aae;color:#fff}.theme-ntos .Button--color--label--translucent{background-color:rgba(101,122,148,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--label--translucent:hover{background-color:rgba(138,154,174,.5);color:#fff}.theme-ntos .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-ntos .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-ntos .Button--color--transparent{background-color:rgba(27,38,51,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--transparent:hover{background-color:rgba(44,57,73,.81);color:#fff}.theme-ntos .Button--color--default{background-color:#384e68;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--default:hover{background-color:#4f6885;color:#fff}.theme-ntos .Button--color--default--translucent{background-color:rgba(35,47,60,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--default--translucent:hover{background-color:rgba(56,69,84,.5);color:#fff}.theme-ntos .Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-ntos .Button--color--caution:hover{background-color:#f5d523;color:#000}.theme-ntos .Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-ntos .Button--color--danger{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--color--danger:hover{background-color:#d93f3f;color:#fff}.theme-ntos .Button--color--danger--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-ntos .Button--color--danger--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-ntos .Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.theme-ntos .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-ntos .Button--selected,.theme-ntos .Button--selected--translucent{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-ntos .Button--selected:hover,.theme-ntos .Button--selected--translucent:hover{background-color:#2fb94f;color:#fff}.theme-ntos .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-ntos .NumberInput--fluid{display:block}.theme-ntos .NumberInput__content{margin-left:.5em}.theme-ntos .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-ntos .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-ntos .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-ntos .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-ntos .Input--disabled{color:#777;border-color:#848484;border-color:rgba(132,132,132,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-ntos .Input--fluid{display:block;width:auto}.theme-ntos .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-ntos .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-ntos .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-ntos .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-ntos .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-ntos .TextArea--fluid{display:block;width:auto;height:auto}.theme-ntos .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-ntos .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-ntos .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-ntos .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-ntos .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-ntos .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-ntos .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-ntos .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-ntos .Knob__popupValue,.theme-ntos .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-ntos .Knob__popupValue--right{top:.25rem;right:-50%}.theme-ntos .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-ntos .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-ntos .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-ntos .Knob__ringFillPivot{transform:rotate(135deg)}.theme-ntos .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-ntos .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-ntos .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-ntos .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-ntos .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-ntos .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-ntos .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-ntos .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-ntos .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-ntos .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-ntos .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-ntos .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-ntos .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-ntos .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-ntos .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-ntos .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-ntos .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-ntos .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-ntos .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-ntos .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-ntos .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-ntos .Slider:not(.Slider__disabled){cursor:e-resize}.theme-ntos .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-ntos .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-ntos .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-ntos .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-ntos .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-ntos .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-ntos .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-ntos .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-ntos .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-ntos .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-ntos .ProgressBar--color--disabled{border:1px solid #999}.theme-ntos .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-ntos .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-ntos .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-ntos .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-ntos .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-ntos .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-ntos .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-ntos .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-ntos .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-ntos .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-ntos .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-ntos .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-ntos .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-ntos .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-ntos .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-ntos .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-ntos .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-ntos .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-ntos .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-ntos .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-ntos .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-ntos .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-ntos .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-ntos .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-ntos .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-ntos .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-ntos .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-ntos .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-ntos .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-ntos .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-ntos .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-ntos .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-ntos .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-ntos .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-ntos .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-ntos .ProgressBar--color--label{border:.0833333333em solid #657a94!important}.theme-ntos .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-ntos .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-ntos .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-ntos .Chat{color:#abc6ec}.theme-ntos .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-ntos .Chat__badge:before{content:"x"}.theme-ntos .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-ntos .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-ntos .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-ntos .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#121922}.theme-ntos .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-ntos .Chat__highlight{color:#000}.theme-ntos .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-ntos .ChatMessage{word-wrap:break-word}.theme-ntos .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-ntos .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-ntos html,.theme-ntos body{scrollbar-color:#2a3b4f #141d26}.theme-ntos .Layout,.theme-ntos .Layout *{scrollbar-base-color:#141d26;scrollbar-face-color:#2a3b4f;scrollbar-3dlight-color:#1b2633;scrollbar-highlight-color:#1b2633;scrollbar-track-color:#141d26;scrollbar-arrow-color:#7290b4;scrollbar-shadow-color:#2a3b4f}.theme-ntos .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-ntos .Layout__content--flexRow{display:flex;flex-flow:row}.theme-ntos .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-ntos .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-ntos .Layout__content--noMargin{margin:0}.theme-ntos .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#1b2633;background-image:linear-gradient(to bottom,#1b2633,#1b2633)}.theme-ntos .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-ntos .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-ntos .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-ntos .Window__contentPadding:after{height:0}.theme-ntos .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-ntos .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(50,63,78,.25);pointer-events:none}.theme-ntos .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-ntos .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-ntos .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-ntos .TitleBar{background-color:#1b2633;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-ntos .TitleBar__clickable{color:rgba(255,0,0,.5);background-color:#1b2633;transition:color .25s,background-color .25s}.theme-ntos .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-ntos .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-ntos .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-ntos .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-ntos .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-ntos .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-ntos .boxed_message{background:#1d2330}.theme-ntos .boxed_message.red_border{background:#301d1d}.theme-ntos .boxed_message.green_border{background:#1d3023}.theme-ntos .boxed_message.purple_border{background:#231d30}.theme-ntos .boxed_message.notice_border{background:#192234}.theme-syndicate .color-black{color:#1a1a1a!important}.theme-syndicate .color-white{color:#fff!important}.theme-syndicate .color-red{color:#df3e3e!important}.theme-syndicate .color-orange{color:#f37f33!important}.theme-syndicate .color-yellow{color:#fbda21!important}.theme-syndicate .color-olive{color:#cbe41c!important}.theme-syndicate .color-green{color:#25ca4c!important}.theme-syndicate .color-teal{color:#00d6cc!important}.theme-syndicate .color-blue{color:#2e93de!important}.theme-syndicate .color-violet{color:#7349cf!important}.theme-syndicate .color-purple{color:#ad45d0!important}.theme-syndicate .color-pink{color:#e34da1!important}.theme-syndicate .color-brown{color:#b97447!important}.theme-syndicate .color-grey{color:#848484!important}.theme-syndicate .color-good{color:#68c22d!important}.theme-syndicate .color-average{color:#f29a29!important}.theme-syndicate .color-bad{color:#df3e3e!important}.theme-syndicate .color-label{color:#b89797!important}.theme-syndicate .color-gold{color:#f3b22f!important}.theme-syndicate .color-bg-black{background-color:#000!important}.theme-syndicate .color-bg-white{background-color:#d9d9d9!important}.theme-syndicate .color-bg-red{background-color:#bd2020!important}.theme-syndicate .color-bg-orange{background-color:#d95e0c!important}.theme-syndicate .color-bg-yellow{background-color:#d9b804!important}.theme-syndicate .color-bg-olive{background-color:#9aad14!important}.theme-syndicate .color-bg-green{background-color:#1b9638!important}.theme-syndicate .color-bg-teal{background-color:#009a93!important}.theme-syndicate .color-bg-blue{background-color:#1c71b1!important}.theme-syndicate .color-bg-violet{background-color:#552dab!important}.theme-syndicate .color-bg-purple{background-color:#8b2baa!important}.theme-syndicate .color-bg-pink{background-color:#cf2082!important}.theme-syndicate .color-bg-brown{background-color:#8c5836!important}.theme-syndicate .color-bg-grey{background-color:#646464!important}.theme-syndicate .color-bg-good{background-color:#4d9121!important}.theme-syndicate .color-bg-average{background-color:#cd7a0d!important}.theme-syndicate .color-bg-bad{background-color:#bd2020!important}.theme-syndicate .color-bg-label{background-color:#9d6f6f!important}.theme-syndicate .color-bg-gold{background-color:#d6920c!important}.theme-syndicate .color-border-black{border-color:#1a1a1a!important}.theme-syndicate .color-border-white{border-color:#fff!important}.theme-syndicate .color-border-red{border-color:#df3e3e!important}.theme-syndicate .color-border-orange{border-color:#f37f33!important}.theme-syndicate .color-border-yellow{border-color:#fbda21!important}.theme-syndicate .color-border-olive{border-color:#cbe41c!important}.theme-syndicate .color-border-green{border-color:#25ca4c!important}.theme-syndicate .color-border-teal{border-color:#00d6cc!important}.theme-syndicate .color-border-blue{border-color:#2e93de!important}.theme-syndicate .color-border-violet{border-color:#7349cf!important}.theme-syndicate .color-border-purple{border-color:#ad45d0!important}.theme-syndicate .color-border-pink{border-color:#e34da1!important}.theme-syndicate .color-border-brown{border-color:#b97447!important}.theme-syndicate .color-border-grey{border-color:#848484!important}.theme-syndicate .color-border-good{border-color:#68c22d!important}.theme-syndicate .color-border-average{border-color:#f29a29!important}.theme-syndicate .color-border-bad{border-color:#df3e3e!important}.theme-syndicate .color-border-label{border-color:#b89797!important}.theme-syndicate .color-border-gold{border-color:#f3b22f!important}.theme-syndicate .Section{position:relative;margin-bottom:.5em;background-color:#2b0101;box-sizing:border-box}.theme-syndicate .Section:last-child{margin-bottom:0}.theme-syndicate .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #397439}.theme-syndicate .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-syndicate .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-syndicate .Section__rest{position:relative}.theme-syndicate .Section__content{padding:.66em .5em}.theme-syndicate .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-syndicate .Section--fill{display:flex;flex-direction:column;height:100%}.theme-syndicate .Section--fill>.Section__rest{flex-grow:1}.theme-syndicate .Section--fill>.Section__rest>.Section__content{height:100%}.theme-syndicate .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-syndicate .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-syndicate .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-syndicate .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-syndicate .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-syndicate .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-syndicate .Section .Section:first-child{margin-top:-.5em}.theme-syndicate .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-syndicate .Section .Section .Section .Section__titleText{font-size:1em}.theme-syndicate .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-syndicate .Button:last-child{margin-right:0;margin-bottom:0}.theme-syndicate .Button .fa,.theme-syndicate .Button .fas,.theme-syndicate .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-syndicate .Button--hasContent .fa,.theme-syndicate .Button--hasContent .fas,.theme-syndicate .Button--hasContent .far{margin-right:.25em}.theme-syndicate .Button--hasContent.Button--iconRight .fa,.theme-syndicate .Button--hasContent.Button--iconRight .fas,.theme-syndicate .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-syndicate .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-syndicate .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-syndicate .Button--circular{border-radius:50%}.theme-syndicate .Button--compact{padding:0 .25em;line-height:1.333em}.theme-syndicate .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-syndicate .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-syndicate .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--black:hover{background-color:#101010;color:#fff}.theme-syndicate .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-syndicate .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-syndicate .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-syndicate .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-syndicate .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-syndicate .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-syndicate .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-syndicate .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-syndicate .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-syndicate .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-syndicate .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-syndicate .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-syndicate .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-syndicate .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-syndicate .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-syndicate .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-syndicate .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-syndicate .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-syndicate .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-syndicate .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-syndicate .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-syndicate .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-syndicate .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-syndicate .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-syndicate .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-syndicate .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-syndicate .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-syndicate .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-syndicate .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-syndicate .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-syndicate .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-syndicate .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-syndicate .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-syndicate .Button--color--label{background-color:#9d6f6f;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--label:hover{background-color:#b89696;color:#fff}.theme-syndicate .Button--color--label--translucent{background-color:rgba(157,111,111,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--label--translucent:hover{background-color:rgba(184,150,150,.5);color:#fff}.theme-syndicate .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-syndicate .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-syndicate .Button--color--transparent{background-color:rgba(77,2,2,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--transparent:hover{background-color:rgba(103,14,14,.81);color:#fff}.theme-syndicate .Button--color--default{background-color:#397439;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--default:hover{background-color:#509350;color:#fff}.theme-syndicate .Button--color--default--translucent{background-color:rgba(88,8,8,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--default--translucent:hover{background-color:rgba(115,25,25,.5);color:#fff}.theme-syndicate .Button--color--caution{background-color:#be6209;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--caution:hover{background-color:#e67f1a;color:#fff}.theme-syndicate .Button--color--caution--translucent{background-color:rgba(190,98,9,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--caution--translucent:hover{background-color:rgba(230,127,26,.5);color:#fff}.theme-syndicate .Button--color--danger{background-color:#9a9d00;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--color--danger:hover{background-color:#bec110;color:#fff}.theme-syndicate .Button--color--danger--translucent{background-color:rgba(154,157,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-syndicate .Button--color--danger--translucent:hover{background-color:rgba(190,193,16,.5);color:#fff}.theme-syndicate .Button--disabled{background-color:#363636!important;color:rgba(255,255,255,.75)!important}.theme-syndicate .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-syndicate .Button--selected,.theme-syndicate .Button--selected--translucent{background-color:#9d0808;color:#fff;transition:color .2s,background-color .2s}.theme-syndicate .Button--selected:hover,.theme-syndicate .Button--selected--translucent:hover{background-color:#c11919;color:#fff}.theme-syndicate .NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#fff;background-color:#910101;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.theme-syndicate .NoticeBox--color--black{color:#fff;background-color:#000}.theme-syndicate .NoticeBox--color--white{color:#000;background-color:#b3b3b3}.theme-syndicate .NoticeBox--color--red{color:#fff;background-color:#701f1f}.theme-syndicate .NoticeBox--color--orange{color:#fff;background-color:#854114}.theme-syndicate .NoticeBox--color--yellow{color:#000;background-color:#83710d}.theme-syndicate .NoticeBox--color--olive{color:#000;background-color:#576015}.theme-syndicate .NoticeBox--color--green{color:#fff;background-color:#174e24}.theme-syndicate .NoticeBox--color--teal{color:#fff;background-color:#064845}.theme-syndicate .NoticeBox--color--blue{color:#fff;background-color:#1b4565}.theme-syndicate .NoticeBox--color--violet{color:#fff;background-color:#3b2864}.theme-syndicate .NoticeBox--color--purple{color:#fff;background-color:#542663}.theme-syndicate .NoticeBox--color--pink{color:#fff;background-color:#802257}.theme-syndicate .NoticeBox--color--brown{color:#fff;background-color:#4c3729}.theme-syndicate .NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.theme-syndicate .NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.theme-syndicate .NoticeBox--color--average{color:#fff;background-color:#7b4e13}.theme-syndicate .NoticeBox--color--bad{color:#fff;background-color:#701f1f}.theme-syndicate .NoticeBox--color--label{color:#fff;background-color:#635c5c}.theme-syndicate .NoticeBox--color--gold{color:#fff;background-color:#825d13}.theme-syndicate .NoticeBox--type--info{color:#fff;background-color:#235982}.theme-syndicate .NoticeBox--type--success{color:#fff;background-color:#1e662f}.theme-syndicate .NoticeBox--type--warning{color:#fff;background-color:#a95219}.theme-syndicate .NoticeBox--type--danger{color:#fff;background-color:#8f2828}.theme-syndicate .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;color:#87ce87;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-syndicate .NumberInput--fluid{display:block}.theme-syndicate .NumberInput__content{margin-left:.5em}.theme-syndicate .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-syndicate .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #87ce87;background-color:#87ce87}.theme-syndicate .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-syndicate .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;background-color:#0a0a0a;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-syndicate .Input--disabled{color:#777;border-color:#6b6b6b;border-color:rgba(107,107,107,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-syndicate .Input--fluid{display:block;width:auto}.theme-syndicate .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-syndicate .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-syndicate .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-syndicate .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-syndicate .TextArea{position:relative;display:inline-block;border:.0833333333em solid #87ce87;border:.0833333333em solid rgba(135,206,135,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-syndicate .TextArea--fluid{display:block;width:auto;height:auto}.theme-syndicate .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-syndicate .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-syndicate .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-syndicate .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-syndicate .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-syndicate .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-syndicate .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-syndicate .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-syndicate .Knob__popupValue,.theme-syndicate .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-syndicate .Knob__popupValue--right{top:.25rem;right:-50%}.theme-syndicate .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-syndicate .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-syndicate .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-syndicate .Knob__ringFillPivot{transform:rotate(135deg)}.theme-syndicate .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-syndicate .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-syndicate .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-syndicate .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-syndicate .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-syndicate .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-syndicate .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-syndicate .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-syndicate .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-syndicate .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-syndicate .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-syndicate .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-syndicate .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-syndicate .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-syndicate .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-syndicate .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-syndicate .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-syndicate .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-syndicate .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-syndicate .Knob--color--label .Knob__ringFill{stroke:#b89797}.theme-syndicate .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-syndicate .Slider:not(.Slider__disabled){cursor:e-resize}.theme-syndicate .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-syndicate .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-syndicate .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-syndicate .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-syndicate .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,.5);transition:border-color .5s}.theme-syndicate .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-syndicate .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-syndicate .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-syndicate .ProgressBar--color--default{border:.0833333333em solid #306330}.theme-syndicate .ProgressBar--color--default .ProgressBar__fill{background-color:#306330}.theme-syndicate .ProgressBar--color--disabled{border:1px solid #999}.theme-syndicate .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-syndicate .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-syndicate .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-syndicate .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-syndicate .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-syndicate .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-syndicate .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-syndicate .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-syndicate .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-syndicate .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-syndicate .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-syndicate .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-syndicate .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-syndicate .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-syndicate .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-syndicate .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-syndicate .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-syndicate .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-syndicate .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-syndicate .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-syndicate .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-syndicate .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-syndicate .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-syndicate .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-syndicate .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-syndicate .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-syndicate .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-syndicate .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-syndicate .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-syndicate .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-syndicate .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-syndicate .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-syndicate .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-syndicate .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-syndicate .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-syndicate .ProgressBar--color--label{border:.0833333333em solid #9d6f6f!important}.theme-syndicate .ProgressBar--color--label .ProgressBar__fill{background-color:#9d6f6f}.theme-syndicate .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-syndicate .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-syndicate .Chat{color:#abc6ec}.theme-syndicate .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-syndicate .Chat__badge:before{content:"x"}.theme-syndicate .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-syndicate .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-syndicate .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-syndicate .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#2b0101}.theme-syndicate .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-syndicate .Chat__highlight{color:#000}.theme-syndicate .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-syndicate .ChatMessage{word-wrap:break-word}.theme-syndicate .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-syndicate .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-syndicate html,.theme-syndicate body{scrollbar-color:#770303 #3a0202}.theme-syndicate .Layout,.theme-syndicate .Layout *{scrollbar-base-color:#3a0202;scrollbar-face-color:#770303;scrollbar-3dlight-color:#4d0202;scrollbar-highlight-color:#4d0202;scrollbar-track-color:#3a0202;scrollbar-arrow-color:#fa2d2d;scrollbar-shadow-color:#770303}.theme-syndicate .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-syndicate .Layout__content--flexRow{display:flex;flex-flow:row}.theme-syndicate .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-syndicate .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-syndicate .Layout__content--noMargin{margin:0}.theme-syndicate .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#4d0202;background-image:linear-gradient(to bottom,#4d0202,#4d0202)}.theme-syndicate .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-syndicate .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-syndicate .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-syndicate .Window__contentPadding:after{height:0}.theme-syndicate .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-syndicate .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(108,22,22,.25);pointer-events:none}.theme-syndicate .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-syndicate .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-syndicate .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-syndicate .TitleBar{background-color:#910101;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-syndicate .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#910101;transition:color .25s,background-color .25s}.theme-syndicate .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-syndicate .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-syndicate .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-syndicate .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-syndicate .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-syndicate .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-syndicate .adminooc{color:#29ccbe}.theme-syndicate .debug{color:#8f39e6}.theme-syndicate .boxed_message{background:#360a0a}.theme-syndicate .boxed_message.red_border{background:#400000}.theme-syndicate .boxed_message.green_border{background:#261a00}.theme-syndicate .boxed_message.purple_border{background:#260026}.theme-syndicate .boxed_message.notice_border{background:#260016}.theme-paradise .color-black{color:#1a1a1a!important}.theme-paradise .color-white{color:#fff!important}.theme-paradise .color-red{color:#df3e3e!important}.theme-paradise .color-orange{color:#f37f33!important}.theme-paradise .color-yellow{color:#fbda21!important}.theme-paradise .color-olive{color:#cbe41c!important}.theme-paradise .color-green{color:#25ca4c!important}.theme-paradise .color-teal{color:#00d6cc!important}.theme-paradise .color-blue{color:#2e93de!important}.theme-paradise .color-violet{color:#7349cf!important}.theme-paradise .color-purple{color:#ad45d0!important}.theme-paradise .color-pink{color:#e34da1!important}.theme-paradise .color-brown{color:#b97447!important}.theme-paradise .color-grey{color:#848484!important}.theme-paradise .color-good{color:#68c22d!important}.theme-paradise .color-average{color:#f29a29!important}.theme-paradise .color-bad{color:#df3e3e!important}.theme-paradise .color-label{color:#b8a497!important}.theme-paradise .color-gold{color:#f3b22f!important}.theme-paradise .color-bg-black{background-color:#000!important}.theme-paradise .color-bg-white{background-color:#d9d9d9!important}.theme-paradise .color-bg-red{background-color:#bd2020!important}.theme-paradise .color-bg-orange{background-color:#d95e0c!important}.theme-paradise .color-bg-yellow{background-color:#d9b804!important}.theme-paradise .color-bg-olive{background-color:#9aad14!important}.theme-paradise .color-bg-green{background-color:#1b9638!important}.theme-paradise .color-bg-teal{background-color:#009a93!important}.theme-paradise .color-bg-blue{background-color:#1c71b1!important}.theme-paradise .color-bg-violet{background-color:#552dab!important}.theme-paradise .color-bg-purple{background-color:#8b2baa!important}.theme-paradise .color-bg-pink{background-color:#cf2082!important}.theme-paradise .color-bg-brown{background-color:#8c5836!important}.theme-paradise .color-bg-grey{background-color:#646464!important}.theme-paradise .color-bg-good{background-color:#4d9121!important}.theme-paradise .color-bg-average{background-color:#cd7a0d!important}.theme-paradise .color-bg-bad{background-color:#bd2020!important}.theme-paradise .color-bg-label{background-color:#9d826f!important}.theme-paradise .color-bg-gold{background-color:#d6920c!important}.theme-paradise .color-border-black{border-color:#1a1a1a!important}.theme-paradise .color-border-white{border-color:#fff!important}.theme-paradise .color-border-red{border-color:#df3e3e!important}.theme-paradise .color-border-orange{border-color:#f37f33!important}.theme-paradise .color-border-yellow{border-color:#fbda21!important}.theme-paradise .color-border-olive{border-color:#cbe41c!important}.theme-paradise .color-border-green{border-color:#25ca4c!important}.theme-paradise .color-border-teal{border-color:#00d6cc!important}.theme-paradise .color-border-blue{border-color:#2e93de!important}.theme-paradise .color-border-violet{border-color:#7349cf!important}.theme-paradise .color-border-purple{border-color:#ad45d0!important}.theme-paradise .color-border-pink{border-color:#e34da1!important}.theme-paradise .color-border-brown{border-color:#b97447!important}.theme-paradise .color-border-grey{border-color:#848484!important}.theme-paradise .color-border-good{border-color:#68c22d!important}.theme-paradise .color-border-average{border-color:#f29a29!important}.theme-paradise .color-border-bad{border-color:#df3e3e!important}.theme-paradise .color-border-label{border-color:#b8a497!important}.theme-paradise .color-border-gold{border-color:#f3b22f!important}.theme-paradise .Section{position:relative;margin-bottom:.5em;background-color:#40071a;background-color:rgba(0,0,0,.5);box-sizing:border-box}.theme-paradise .Section:last-child{margin-bottom:0}.theme-paradise .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #208080}.theme-paradise .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-paradise .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-paradise .Section__rest{position:relative}.theme-paradise .Section__content{padding:.66em .5em}.theme-paradise .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-paradise .Section--fill{display:flex;flex-direction:column;height:100%}.theme-paradise .Section--fill>.Section__rest{flex-grow:1}.theme-paradise .Section--fill>.Section__rest>.Section__content{height:100%}.theme-paradise .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-paradise .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-paradise .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-paradise .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-paradise .Section--scrollable>.Section__rest>.Section__content{overflow-y:auto;overflow-x:hidden}.theme-paradise .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-paradise .Section .Section:first-child{margin-top:-.5em}.theme-paradise .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-paradise .Section .Section .Section .Section__titleText{font-size:1em}.theme-paradise .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-paradise .Button:last-child{margin-right:0;margin-bottom:0}.theme-paradise .Button .fa,.theme-paradise .Button .fas,.theme-paradise .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-paradise .Button--hasContent .fa,.theme-paradise .Button--hasContent .fas,.theme-paradise .Button--hasContent .far{margin-right:.25em}.theme-paradise .Button--hasContent.Button--iconRight .fa,.theme-paradise .Button--hasContent.Button--iconRight .fas,.theme-paradise .Button--hasContent.Button--iconRight .far{margin-right:0;margin-left:.25em}.theme-paradise .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-paradise .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-paradise .Button--circular{border-radius:50%}.theme-paradise .Button--compact{padding:0 .25em;line-height:1.333em}.theme-paradise .Button--multiLine{white-space:normal;word-wrap:break-word}.theme-paradise .Button--modal{float:right;z-index:1;margin-top:-.5rem}.theme-paradise .Button--color--black{background-color:#000;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--black:hover{background-color:#101010;color:#fff}.theme-paradise .Button--color--black--translucent{background-color:rgba(0,0,0,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--black--translucent:hover{background-color:rgba(16,16,16,.5);color:#fff}.theme-paradise .Button--color--white{background-color:#d9d9d9;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--white:hover{background-color:#f8f8f8;color:#000}.theme-paradise .Button--color--white--translucent{background-color:rgba(217,217,217,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--white--translucent:hover{background-color:rgba(248,248,248,.5);color:#fff}.theme-paradise .Button--color--red{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--red:hover{background-color:#d93f3f;color:#fff}.theme-paradise .Button--color--red--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--red--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-paradise .Button--color--orange{background-color:#d95e0c;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--orange:hover{background-color:#ef7e33;color:#fff}.theme-paradise .Button--color--orange--translucent{background-color:rgba(217,94,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--orange--translucent:hover{background-color:rgba(239,126,51,.5);color:#fff}.theme-paradise .Button--color--yellow{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--yellow:hover{background-color:#f5d523;color:#000}.theme-paradise .Button--color--yellow--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--yellow--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-paradise .Button--color--olive{background-color:#9aad14;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--olive:hover{background-color:#bdd327;color:#fff}.theme-paradise .Button--color--olive--translucent{background-color:rgba(154,173,20,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--olive--translucent:hover{background-color:rgba(189,211,39,.5);color:#fff}.theme-paradise .Button--color--green{background-color:#1b9638;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--green:hover{background-color:#2fb94f;color:#fff}.theme-paradise .Button--color--green--translucent{background-color:rgba(27,150,56,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--green--translucent:hover{background-color:rgba(47,185,79,.5);color:#fff}.theme-paradise .Button--color--teal{background-color:#009a93;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--teal:hover{background-color:#10bdb6;color:#fff}.theme-paradise .Button--color--teal--translucent{background-color:rgba(0,154,147,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--teal--translucent:hover{background-color:rgba(16,189,182,.5);color:#fff}.theme-paradise .Button--color--blue{background-color:#1c71b1;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--blue:hover{background-color:#308fd6;color:#fff}.theme-paradise .Button--color--blue--translucent{background-color:rgba(28,113,177,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--blue--translucent:hover{background-color:rgba(48,143,214,.5);color:#fff}.theme-paradise .Button--color--violet{background-color:#552dab;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--violet:hover{background-color:#7249ca;color:#fff}.theme-paradise .Button--color--violet--translucent{background-color:rgba(85,45,171,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--violet--translucent:hover{background-color:rgba(114,73,202,.5);color:#fff}.theme-paradise .Button--color--purple{background-color:#8b2baa;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--purple:hover{background-color:#aa46ca;color:#fff}.theme-paradise .Button--color--purple--translucent{background-color:rgba(139,43,170,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--purple--translucent:hover{background-color:rgba(170,70,202,.5);color:#fff}.theme-paradise .Button--color--pink{background-color:#cf2082;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--pink:hover{background-color:#e04ca0;color:#fff}.theme-paradise .Button--color--pink--translucent{background-color:rgba(207,32,130,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--pink--translucent:hover{background-color:rgba(224,76,160,.5);color:#fff}.theme-paradise .Button--color--brown{background-color:#8c5836;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--brown:hover{background-color:#ae724c;color:#fff}.theme-paradise .Button--color--brown--translucent{background-color:rgba(140,88,54,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--brown--translucent:hover{background-color:rgba(174,114,76,.5);color:#fff}.theme-paradise .Button--color--grey{background-color:#646464;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--grey:hover{background-color:#818181;color:#fff}.theme-paradise .Button--color--grey--translucent{background-color:rgba(100,100,100,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--grey--translucent:hover{background-color:rgba(129,129,129,.5);color:#fff}.theme-paradise .Button--color--good{background-color:#4d9121;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--good:hover{background-color:#67b335;color:#fff}.theme-paradise .Button--color--good--translucent{background-color:rgba(77,145,33,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--good--translucent:hover{background-color:rgba(103,179,53,.5);color:#fff}.theme-paradise .Button--color--average{background-color:#cd7a0d;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--average:hover{background-color:#eb972b;color:#fff}.theme-paradise .Button--color--average--translucent{background-color:rgba(205,122,13,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--average--translucent:hover{background-color:rgba(235,151,43,.5);color:#fff}.theme-paradise .Button--color--bad{background-color:#bd2020;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--bad:hover{background-color:#d93f3f;color:#fff}.theme-paradise .Button--color--bad--translucent{background-color:rgba(189,32,32,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--bad--translucent:hover{background-color:rgba(217,63,63,.5);color:#fff}.theme-paradise .Button--color--label{background-color:#9d826f;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--label:hover{background-color:#b8a396;color:#fff}.theme-paradise .Button--color--label--translucent{background-color:rgba(157,130,111,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--label--translucent:hover{background-color:rgba(184,163,150,.5);color:#fff}.theme-paradise .Button--color--gold{background-color:#d6920c;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--gold:hover{background-color:#eeaf30;color:#fff}.theme-paradise .Button--color--gold--translucent{background-color:rgba(214,146,12,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--gold--translucent:hover{background-color:rgba(238,175,48,.5);color:#fff}.theme-paradise .Button--color--transparent{background-color:rgba(128,13,51,0);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--transparent:hover{background-color:rgba(164,27,73,.81);color:#fff}.theme-paradise .Button--color--default{background-color:#208080;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--default:hover{background-color:#34a0a0;color:#fff}.theme-paradise .Button--color--default--translucent{background-color:rgba(141,20,60,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--default--translucent:hover{background-color:rgba(175,39,84,.5);color:#fff}.theme-paradise .Button--color--caution{background-color:#d9b804;color:#000;transition:color .2s,background-color .2s}.theme-paradise .Button--color--caution:hover{background-color:#f5d523;color:#000}.theme-paradise .Button--color--caution--translucent{background-color:rgba(217,184,4,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--caution--translucent:hover{background-color:rgba(245,213,35,.5);color:#fff}.theme-paradise .Button--color--danger{background-color:#8c1eff;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--color--danger:hover{background-color:#ae61ff;color:#fff}.theme-paradise .Button--color--danger--translucent{background-color:rgba(140,30,255,.33);color:rgba(255,255,255,.5);transition:color .2s,background-color .2s}.theme-paradise .Button--color--danger--translucent:hover{background-color:rgba(174,97,255,.5);color:#fff}.theme-paradise .Button--disabled{background-color:#999!important;color:rgba(255,255,255,.75)!important}.theme-paradise .Button--disabled--translucent{background-color:rgba(77,23,23,.5)!important;color:rgba(255,255,255,.5)!important}.theme-paradise .Button--selected,.theme-paradise .Button--selected--translucent{background-color:#bf6030;color:#fff;transition:color .2s,background-color .2s}.theme-paradise .Button--selected:hover,.theme-paradise .Button--selected--translucent:hover{background-color:#d4835a;color:#fff}.theme-paradise .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;color:#e65c2e;background-color:rgba(0,0,0,.25);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-paradise .NumberInput--fluid{display:block}.theme-paradise .NumberInput__content{margin-left:.5em}.theme-paradise .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-paradise .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #e65c2e;background-color:#e65c2e}.theme-paradise .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,.25);color:#fff;text-align:right}.theme-paradise .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;background-color:rgba(0,0,0,.25);color:#fff;background-color:#000;background-color:rgba(0,0,0,.75);padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible;white-space:nowrap}.theme-paradise .Input--disabled{color:#777;border-color:#4a4a4a;border-color:rgba(74,74,74,.75);background-color:#333;background-color:rgba(0,0,0,.25)}.theme-paradise .Input--fluid{display:block;width:auto}.theme-paradise .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-paradise .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-paradise .Input__input::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__textarea{border:0;width:calc(100% + 4px);font-size:1em;line-height:1.4166666667em;margin-left:-.3333333333em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit;resize:both;overflow:auto;white-space:pre-wrap}.theme-paradise .Input__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-paradise .TextArea{position:relative;display:inline-block;border:.0833333333em solid #e65c2e;border:.0833333333em solid rgba(230,92,46,.75);border-radius:.16em;background-color:rgba(0,0,0,.25);margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-paradise .TextArea--fluid{display:block;width:auto;height:auto}.theme-paradise .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-paradise .TextArea__textarea::placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-paradise .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:rgba(125,125,125,.75)}.theme-paradise .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-paradise .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-paradise .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-paradise .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-paradise .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-paradise .Knob__popupValue,.theme-paradise .Knob__popupValue--right{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-paradise .Knob__popupValue--right{top:.25rem;right:-50%}.theme-paradise .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-paradise .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-paradise .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-paradise .Knob__ringFillPivot{transform:rotate(135deg)}.theme-paradise .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-paradise .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms}.theme-paradise .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-paradise .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-paradise .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-paradise .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-paradise .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-paradise .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-paradise .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-paradise .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-paradise .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-paradise .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-paradise .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-paradise .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-paradise .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-paradise .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-paradise .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-paradise .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-paradise .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-paradise .Knob--color--label .Knob__ringFill{stroke:#b8a497}.theme-paradise .Knob--color--gold .Knob__ringFill{stroke:#f3b22f}.theme-paradise .Slider:not(.Slider__disabled){cursor:e-resize}.theme-paradise .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-paradise .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-paradise .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-paradise .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-paradise .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .5s}.theme-paradise .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-paradise .ProgressBar__fill--animated{transition:background-color .5s,width .5s}.theme-paradise .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-paradise .ProgressBar--color--default{border:.0833333333em solid #1b6d6d}.theme-paradise .ProgressBar--color--default .ProgressBar__fill{background-color:#1b6d6d}.theme-paradise .ProgressBar--color--disabled{border:1px solid #999}.theme-paradise .ProgressBar--color--disabled .ProgressBar__fill{background-color:#999}.theme-paradise .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-paradise .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-paradise .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-paradise .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-paradise .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-paradise .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-paradise .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-paradise .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-paradise .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-paradise .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-paradise .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-paradise .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-paradise .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-paradise .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-paradise .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-paradise .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-paradise .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-paradise .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-paradise .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-paradise .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-paradise .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-paradise .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-paradise .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-paradise .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-paradise .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-paradise .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-paradise .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-paradise .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-paradise .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-paradise .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-paradise .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-paradise .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-paradise .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-paradise .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-paradise .ProgressBar--color--label{border:.0833333333em solid #9d826f!important}.theme-paradise .ProgressBar--color--label .ProgressBar__fill{background-color:#9d826f}.theme-paradise .ProgressBar--color--gold{border:.0833333333em solid #d6920c!important}.theme-paradise .ProgressBar--color--gold .ProgressBar__fill{background-color:#d6920c}.theme-paradise .Chat{color:#abc6ec}.theme-paradise .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s}.theme-paradise .Chat__badge:before{content:"x"}.theme-paradise .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-paradise .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-paradise .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-paradise .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#fff;background-color:#db2828}.theme-paradise .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-paradise .Chat__highlight{color:#000}.theme-paradise .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-paradise .ChatMessage{word-wrap:break-word}.theme-paradise .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-paradise .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-paradise html,.theme-paradise body{scrollbar-color:#cb1551 #680b29}.theme-paradise .Layout,.theme-paradise .Layout *{scrollbar-base-color:#680b29;scrollbar-face-color:#99103d;scrollbar-3dlight-color:#800d33;scrollbar-highlight-color:#800d33;scrollbar-track-color:#680b29;scrollbar-arrow-color:#ea2e6c;scrollbar-shadow-color:#99103d}.theme-paradise .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.theme-paradise .Layout__content--flexRow{display:flex;flex-flow:row}.theme-paradise .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-paradise .Layout__content--scrollable{overflow-y:auto;margin-bottom:0}.theme-paradise .Layout__content--noMargin{margin:0}.theme-paradise .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#800d33;background-image:linear-gradient(to bottom,#80014b,#80460d)}.theme-paradise .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-paradise .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-paradise .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-paradise .Window__contentPadding:after{height:0}.theme-paradise .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-paradise .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(166,34,78,.25);pointer-events:none}.theme-paradise .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-paradise .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-paradise .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-paradise .TitleBar{background-color:#800d33;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-paradise .TitleBar__clickable{color:rgba(255,0,0,.5);background-color:#800d33;transition:color .25s,background-color .25s}.theme-paradise .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-paradise .TitleBar__title{position:absolute;top:0;left:46px;left:3.8333333333rem;color:rgba(255,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap}.theme-paradise .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-paradise .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-paradise .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-paradise .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-paradise .adminooc{color:#29ccbe}.theme-paradise .debug{color:#8f39e6}.theme-paradise .boxed_message{background:rgba(0,0,0,.25);border-color:rgba(223,181,159,.25)}.theme-paradise .boxed_message.red_border{background:rgba(22,3,3,.25);border-color:rgba(255,0,0,.5)}.theme-paradise .boxed_message.green_border{background:rgba(3,22,10,.25);border-color:rgba(0,255,0,.5)}.theme-paradise .boxed_message.purple_border{background:rgba(10,3,22,.25);border-color:rgba(136,77,255,.5)}.theme-paradise .boxed_message.notice_border{background:rgba(3,10,22,.25);border-color:rgba(85,126,246,.5)} diff --git a/tgui/public/tgui-panel.bundle.js b/tgui/public/tgui-panel.bundle.js index b232c5745e71..8b51192ba878 100644 --- a/tgui/public/tgui-panel.bundle.js +++ b/tgui/public/tgui-panel.bundle.js @@ -1,8 +1,8 @@ -(function(){(function(){var xn={96376:function(E,n,t){"use strict";n.__esModule=!0,n.createPopper=void 0,n.popperGenerator=g;var e=i(t(74758)),r=i(t(28811)),o=i(t(98309)),a=i(t(44896)),s=i(t(33118)),u=i(t(10579)),c=i(t(56500)),p=i(t(17633));n.detectOverflow=p.default;var d=t(75573);function i(h){return h&&h.__esModule?h:{default:h}}var v={placement:"bottom",modifiers:[],strategy:"absolute"};function l(){for(var h=arguments.length,m=new Array(h),b=0;b0&&(0,r.round)(i.width)/c.offsetWidth||1,l=c.offsetHeight>0&&(0,r.round)(i.height)/c.offsetHeight||1);var g=(0,e.isElement)(c)?(0,o.default)(c):window,f=g.visualViewport,h=!(0,a.default)()&&d,m=(i.left+(h&&f?f.offsetLeft:0))/v,b=(i.top+(h&&f?f.offsetTop:0))/l,I=i.width/v,O=i.height/l;return{width:I,height:O,top:b,right:m+I,bottom:b+O,left:m,x:m,y:b}}},49035:function(E,n,t){"use strict";n.__esModule=!0,n.default=O;var e=t(46206),r=h(t(87991)),o=h(t(79752)),a=h(t(98309)),s=h(t(44896)),u=h(t(40600)),c=h(t(16599)),p=t(75573),d=h(t(37786)),i=h(t(57819)),v=h(t(4206)),l=h(t(12972)),g=h(t(81666)),f=t(63618);function h(C){return C&&C.__esModule?C:{default:C}}function m(C,y){var S=(0,d.default)(C,!1,y==="fixed");return S.top=S.top+C.clientTop,S.left=S.left+C.clientLeft,S.bottom=S.top+C.clientHeight,S.right=S.left+C.clientWidth,S.width=C.clientWidth,S.height=C.clientHeight,S.x=S.left,S.y=S.top,S}function b(C,y,S){return y===e.viewport?(0,g.default)((0,r.default)(C,S)):(0,p.isElement)(y)?m(y,S):(0,g.default)((0,o.default)((0,u.default)(C)))}function I(C){var y=(0,a.default)((0,i.default)(C)),S=["absolute","fixed"].indexOf((0,c.default)(C).position)>=0,T=S&&(0,p.isHTMLElement)(C)?(0,s.default)(C):C;return(0,p.isElement)(T)?y.filter(function(N){return(0,p.isElement)(N)&&(0,v.default)(N,T)&&(0,l.default)(N)!=="body"}):[]}function O(C,y,S,T){var N=y==="clippingParents"?I(C):[].concat(y),M=[].concat(N,[S]),w=M[0],L=M.reduce(function(B,V){var x=b(C,V,T);return B.top=(0,f.max)(x.top,B.top),B.right=(0,f.min)(x.right,B.right),B.bottom=(0,f.min)(x.bottom,B.bottom),B.left=(0,f.max)(x.left,B.left),B},b(C,w,T));return L.width=L.right-L.left,L.height=L.bottom-L.top,L.x=L.left,L.y=L.top,L}},74758:function(E,n,t){"use strict";n.__esModule=!0,n.default=v;var e=d(t(37786)),r=d(t(13390)),o=d(t(12972)),a=t(75573),s=d(t(79697)),u=d(t(40600)),c=d(t(10798)),p=t(63618);function d(l){return l&&l.__esModule?l:{default:l}}function i(l){var g=l.getBoundingClientRect(),f=(0,p.round)(g.width)/l.offsetWidth||1,h=(0,p.round)(g.height)/l.offsetHeight||1;return f!==1||h!==1}function v(l,g,f){f===void 0&&(f=!1);var h=(0,a.isHTMLElement)(g),m=(0,a.isHTMLElement)(g)&&i(g),b=(0,u.default)(g),I=(0,e.default)(l,m,f),O={scrollLeft:0,scrollTop:0},C={x:0,y:0};return(h||!h&&!f)&&(((0,o.default)(g)!=="body"||(0,c.default)(b))&&(O=(0,r.default)(g)),(0,a.isHTMLElement)(g)?(C=(0,e.default)(g,!0),C.x+=g.clientLeft,C.y+=g.clientTop):b&&(C.x=(0,s.default)(b))),{x:I.left+O.scrollLeft-C.x,y:I.top+O.scrollTop-C.y,width:I.width,height:I.height}}},16599:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(95115));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){return(0,e.default)(a).getComputedStyle(a)}},40600:function(E,n,t){"use strict";n.__esModule=!0,n.default=r;var e=t(75573);function r(o){return(((0,e.isElement)(o)?o.ownerDocument:o.document)||window.document).documentElement}},79752:function(E,n,t){"use strict";n.__esModule=!0,n.default=c;var e=u(t(40600)),r=u(t(16599)),o=u(t(79697)),a=u(t(43750)),s=t(63618);function u(p){return p&&p.__esModule?p:{default:p}}function c(p){var d,i=(0,e.default)(p),v=(0,a.default)(p),l=(d=p.ownerDocument)==null?void 0:d.body,g=(0,s.max)(i.scrollWidth,i.clientWidth,l?l.scrollWidth:0,l?l.clientWidth:0),f=(0,s.max)(i.scrollHeight,i.clientHeight,l?l.scrollHeight:0,l?l.clientHeight:0),h=-v.scrollLeft+(0,o.default)(p),m=-v.scrollTop;return(0,r.default)(l||i).direction==="rtl"&&(h+=(0,s.max)(i.clientWidth,l?l.clientWidth:0)-g),{width:g,height:f,x:h,y:m}}},3073:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},28811:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(37786));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){var s=(0,e.default)(a),u=a.offsetWidth,c=a.offsetHeight;return Math.abs(s.width-u)<=1&&(u=s.width),Math.abs(s.height-c)<=1&&(c=s.height),{x:a.offsetLeft,y:a.offsetTop,width:u,height:c}}},12972:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return e?(e.nodeName||"").toLowerCase():null}},13390:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(43750)),r=s(t(95115)),o=t(75573),a=s(t(3073));function s(c){return c&&c.__esModule?c:{default:c}}function u(c){return c===(0,r.default)(c)||!(0,o.isHTMLElement)(c)?(0,e.default)(c):(0,a.default)(c)}},44896:function(E,n,t){"use strict";n.__esModule=!0,n.default=v;var e=p(t(95115)),r=p(t(12972)),o=p(t(16599)),a=t(75573),s=p(t(87031)),u=p(t(57819)),c=p(t(35366));function p(l){return l&&l.__esModule?l:{default:l}}function d(l){return!(0,a.isHTMLElement)(l)||(0,o.default)(l).position==="fixed"?null:l.offsetParent}function i(l){var g=/firefox/i.test((0,c.default)()),f=/Trident/i.test((0,c.default)());if(f&&(0,a.isHTMLElement)(l)){var h=(0,o.default)(l);if(h.position==="fixed")return null}var m=(0,u.default)(l);for((0,a.isShadowRoot)(m)&&(m=m.host);(0,a.isHTMLElement)(m)&&["html","body"].indexOf((0,r.default)(m))<0;){var b=(0,o.default)(m);if(b.transform!=="none"||b.perspective!=="none"||b.contain==="paint"||["transform","perspective"].indexOf(b.willChange)!==-1||g&&b.willChange==="filter"||g&&b.filter&&b.filter!=="none")return m;m=m.parentNode}return null}function v(l){for(var g=(0,e.default)(l),f=d(l);f&&(0,s.default)(f)&&(0,o.default)(f).position==="static";)f=d(f);return f&&((0,r.default)(f)==="html"||(0,r.default)(f)==="body"&&(0,o.default)(f).position==="static")?g:f||i(l)||g}},57819:function(E,n,t){"use strict";n.__esModule=!0,n.default=s;var e=a(t(12972)),r=a(t(40600)),o=t(75573);function a(u){return u&&u.__esModule?u:{default:u}}function s(u){return(0,e.default)(u)==="html"?u:u.assignedSlot||u.parentNode||((0,o.isShadowRoot)(u)?u.host:null)||(0,r.default)(u)}},24426:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(57819)),r=s(t(10798)),o=s(t(12972)),a=t(75573);function s(c){return c&&c.__esModule?c:{default:c}}function u(c){return["html","body","#document"].indexOf((0,o.default)(c))>=0?c.ownerDocument.body:(0,a.isHTMLElement)(c)&&(0,r.default)(c)?c:u((0,e.default)(c))}},87991:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(95115)),r=s(t(40600)),o=s(t(79697)),a=s(t(89331));function s(c){return c&&c.__esModule?c:{default:c}}function u(c,p){var d=(0,e.default)(c),i=(0,r.default)(c),v=d.visualViewport,l=i.clientWidth,g=i.clientHeight,f=0,h=0;if(v){l=v.width,g=v.height;var m=(0,a.default)();(m||!m&&p==="fixed")&&(f=v.offsetLeft,h=v.offsetTop)}return{width:l,height:g,x:f+(0,o.default)(c),y:h}}},95115:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var r=e.ownerDocument;return r&&r.defaultView||window}return e}},43750:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(95115));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){var s=(0,e.default)(a),u=s.pageXOffset,c=s.pageYOffset;return{scrollLeft:u,scrollTop:c}}},79697:function(E,n,t){"use strict";n.__esModule=!0,n.default=s;var e=a(t(37786)),r=a(t(40600)),o=a(t(43750));function a(u){return u&&u.__esModule?u:{default:u}}function s(u){return(0,e.default)((0,r.default)(u)).left+(0,o.default)(u).scrollLeft}},75573:function(E,n,t){"use strict";n.__esModule=!0,n.isElement=o,n.isHTMLElement=a,n.isShadowRoot=s;var e=r(t(95115));function r(u){return u&&u.__esModule?u:{default:u}}function o(u){var c=(0,e.default)(u).Element;return u instanceof c||u instanceof Element}function a(u){var c=(0,e.default)(u).HTMLElement;return u instanceof c||u instanceof HTMLElement}function s(u){if(typeof ShadowRoot=="undefined")return!1;var c=(0,e.default)(u).ShadowRoot;return u instanceof c||u instanceof ShadowRoot}},89331:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(35366));function r(a){return a&&a.__esModule?a:{default:a}}function o(){return!/^((?!chrome|android).)*safari/i.test((0,e.default)())}},10798:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(16599));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){var s=(0,e.default)(a),u=s.overflow,c=s.overflowX,p=s.overflowY;return/auto|scroll|overlay|hidden/.test(u+p+c)}},87031:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(12972));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){return["table","td","th"].indexOf((0,e.default)(a))>=0}},98309:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(24426)),r=s(t(57819)),o=s(t(95115)),a=s(t(10798));function s(c){return c&&c.__esModule?c:{default:c}}function u(c,p){var d;p===void 0&&(p=[]);var i=(0,e.default)(c),v=i===((d=c.ownerDocument)==null?void 0:d.body),l=(0,o.default)(i),g=v?[l].concat(l.visualViewport||[],(0,a.default)(i)?i:[]):i,f=p.concat(g);return v?f:f.concat(u((0,r.default)(g)))}},46206:function(E,n){"use strict";n.__esModule=!0,n.write=n.viewport=n.variationPlacements=n.top=n.start=n.right=n.reference=n.read=n.popper=n.placements=n.modifierPhases=n.main=n.left=n.end=n.clippingParents=n.bottom=n.beforeWrite=n.beforeRead=n.beforeMain=n.basePlacements=n.auto=n.afterWrite=n.afterRead=n.afterMain=void 0;var t=n.top="top",e=n.bottom="bottom",r=n.right="right",o=n.left="left",a=n.auto="auto",s=n.basePlacements=[t,e,r,o],u=n.start="start",c=n.end="end",p=n.clippingParents="clippingParents",d=n.viewport="viewport",i=n.popper="popper",v=n.reference="reference",l=n.variationPlacements=s.reduce(function(N,M){return N.concat([M+"-"+u,M+"-"+c])},[]),g=n.placements=[].concat(s,[a]).reduce(function(N,M){return N.concat([M,M+"-"+u,M+"-"+c])},[]),f=n.beforeRead="beforeRead",h=n.read="read",m=n.afterRead="afterRead",b=n.beforeMain="beforeMain",I=n.main="main",O=n.afterMain="afterMain",C=n.beforeWrite="beforeWrite",y=n.write="write",S=n.afterWrite="afterWrite",T=n.modifierPhases=[f,h,m,b,I,O,C,y,S]},95996:function(E,n,t){"use strict";n.__esModule=!0;var e={popperGenerator:!0,detectOverflow:!0,createPopperBase:!0,createPopper:!0,createPopperLite:!0};n.popperGenerator=n.detectOverflow=n.createPopperLite=n.createPopperBase=n.createPopper=void 0;var r=t(46206);Object.keys(r).forEach(function(c){c==="default"||c==="__esModule"||Object.prototype.hasOwnProperty.call(e,c)||c in n&&n[c]===r[c]||(n[c]=r[c])});var o=t(39805);Object.keys(o).forEach(function(c){c==="default"||c==="__esModule"||Object.prototype.hasOwnProperty.call(e,c)||c in n&&n[c]===o[c]||(n[c]=o[c])});var a=t(96376);n.popperGenerator=a.popperGenerator,n.detectOverflow=a.detectOverflow,n.createPopperBase=a.createPopper;var s=t(83312);n.createPopper=s.createPopper;var u=t(2473);n.createPopperLite=u.createPopper},19975:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=o(t(12972)),r=t(75573);function o(c){return c&&c.__esModule?c:{default:c}}function a(c){var p=c.state;Object.keys(p.elements).forEach(function(d){var i=p.styles[d]||{},v=p.attributes[d]||{},l=p.elements[d];!(0,r.isHTMLElement)(l)||!(0,e.default)(l)||(Object.assign(l.style,i),Object.keys(v).forEach(function(g){var f=v[g];f===!1?l.removeAttribute(g):l.setAttribute(g,f===!0?"":f)}))})}function s(c){var p=c.state,d={popper:{position:p.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(p.elements.popper.style,d.popper),p.styles=d,p.elements.arrow&&Object.assign(p.elements.arrow.style,d.arrow),function(){Object.keys(p.elements).forEach(function(i){var v=p.elements[i],l=p.attributes[i]||{},g=Object.keys(p.styles.hasOwnProperty(i)?p.styles[i]:d[i]),f=g.reduce(function(h,m){return h[m]="",h},{});!(0,r.isHTMLElement)(v)||!(0,e.default)(v)||(Object.assign(v.style,f),Object.keys(l).forEach(function(h){v.removeAttribute(h)}))})}}var u=n.default={name:"applyStyles",enabled:!0,phase:"write",fn:a,effect:s,requires:["computeStyles"]}},52744:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=i(t(83104)),r=i(t(28811)),o=i(t(4206)),a=i(t(44896)),s=i(t(41199)),u=t(28595),c=i(t(43286)),p=i(t(81447)),d=t(46206);function i(h){return h&&h.__esModule?h:{default:h}}var v=function(){function h(m,b){return m=typeof m=="function"?m(Object.assign({},b.rects,{placement:b.placement})):m,(0,c.default)(typeof m!="number"?m:(0,p.default)(m,d.basePlacements))}return h}();function l(h){var m,b=h.state,I=h.name,O=h.options,C=b.elements.arrow,y=b.modifiersData.popperOffsets,S=(0,e.default)(b.placement),T=(0,s.default)(S),N=[d.left,d.right].indexOf(S)>=0,M=N?"height":"width";if(!(!C||!y)){var w=v(O.padding,b),L=(0,r.default)(C),B=T==="y"?d.top:d.left,V=T==="y"?d.bottom:d.right,x=b.rects.reference[M]+b.rects.reference[T]-y[T]-b.rects.popper[M],$=y[T]-b.rects.reference[T],G=(0,a.default)(C),D=G?T==="y"?G.clientHeight||0:G.clientWidth||0:0,j=x/2-$/2,U=w[B],Y=D-L[M]-w[V],K=D/2-L[M]/2+j,H=(0,u.within)(U,K,Y),rt=T;b.modifiersData[I]=(m={},m[rt]=H,m.centerOffset=H-K,m)}}function g(h){var m=h.state,b=h.options,I=b.element,O=I===void 0?"[data-popper-arrow]":I;O!=null&&(typeof O=="string"&&(O=m.elements.popper.querySelector(O),!O)||(0,o.default)(m.elements.popper,O)&&(m.elements.arrow=O))}var f=n.default={name:"arrow",enabled:!0,phase:"main",fn:l,effect:g,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]}},59894:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0,n.mapToStyles=l;var e=t(46206),r=d(t(44896)),o=d(t(95115)),a=d(t(40600)),s=d(t(16599)),u=d(t(83104)),c=d(t(45)),p=t(63618);function d(h){return h&&h.__esModule?h:{default:h}}var i={top:"auto",right:"auto",bottom:"auto",left:"auto"};function v(h,m){var b=h.x,I=h.y,O=m.devicePixelRatio||1;return{x:(0,p.round)(b*O)/O||0,y:(0,p.round)(I*O)/O||0}}function l(h){var m,b=h.popper,I=h.popperRect,O=h.placement,C=h.variation,y=h.offsets,S=h.position,T=h.gpuAcceleration,N=h.adaptive,M=h.roundOffsets,w=h.isFixed,L=y.x,B=L===void 0?0:L,V=y.y,x=V===void 0?0:V,$=typeof M=="function"?M({x:B,y:x}):{x:B,y:x};B=$.x,x=$.y;var G=y.hasOwnProperty("x"),D=y.hasOwnProperty("y"),j=e.left,U=e.top,Y=window;if(N){var K=(0,r.default)(b),H="clientHeight",rt="clientWidth";if(K===(0,o.default)(b)&&(K=(0,a.default)(b),(0,s.default)(K).position!=="static"&&S==="absolute"&&(H="scrollHeight",rt="scrollWidth")),K=K,O===e.top||(O===e.left||O===e.right)&&C===e.end){U=e.bottom;var lt=w&&K===Y&&Y.visualViewport?Y.visualViewport.height:K[H];x-=lt-I.height,x*=T?1:-1}if(O===e.left||(O===e.top||O===e.bottom)&&C===e.end){j=e.right;var ct=w&&K===Y&&Y.visualViewport?Y.visualViewport.width:K[rt];B-=ct-I.width,B*=T?1:-1}}var k=Object.assign({position:S},N&&i),Q=M===!0?v({x:B,y:x},(0,o.default)(b)):{x:B,y:x};if(B=Q.x,x=Q.y,T){var it;return Object.assign({},k,(it={},it[U]=D?"0":"",it[j]=G?"0":"",it.transform=(Y.devicePixelRatio||1)<=1?"translate("+B+"px, "+x+"px)":"translate3d("+B+"px, "+x+"px, 0)",it))}return Object.assign({},k,(m={},m[U]=D?x+"px":"",m[j]=G?B+"px":"",m.transform="",m))}function g(h){var m=h.state,b=h.options,I=b.gpuAcceleration,O=I===void 0?!0:I,C=b.adaptive,y=C===void 0?!0:C,S=b.roundOffsets,T=S===void 0?!0:S,N={placement:(0,u.default)(m.placement),variation:(0,c.default)(m.placement),popper:m.elements.popper,popperRect:m.rects.popper,gpuAcceleration:O,isFixed:m.options.strategy==="fixed"};m.modifiersData.popperOffsets!=null&&(m.styles.popper=Object.assign({},m.styles.popper,l(Object.assign({},N,{offsets:m.modifiersData.popperOffsets,position:m.options.strategy,adaptive:y,roundOffsets:T})))),m.modifiersData.arrow!=null&&(m.styles.arrow=Object.assign({},m.styles.arrow,l(Object.assign({},N,{offsets:m.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:T})))),m.attributes.popper=Object.assign({},m.attributes.popper,{"data-popper-placement":m.placement})}var f=n.default={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:g,data:{}}},36692:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=r(t(95115));function r(u){return u&&u.__esModule?u:{default:u}}var o={passive:!0};function a(u){var c=u.state,p=u.instance,d=u.options,i=d.scroll,v=i===void 0?!0:i,l=d.resize,g=l===void 0?!0:l,f=(0,e.default)(c.elements.popper),h=[].concat(c.scrollParents.reference,c.scrollParents.popper);return v&&h.forEach(function(m){m.addEventListener("scroll",p.update,o)}),g&&f.addEventListener("resize",p.update,o),function(){v&&h.forEach(function(m){m.removeEventListener("scroll",p.update,o)}),g&&f.removeEventListener("resize",p.update,o)}}var s=n.default={name:"eventListeners",enabled:!0,phase:"write",fn:function(){function u(){}return u}(),effect:a,data:{}}},23798:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=p(t(71376)),r=p(t(83104)),o=p(t(86459)),a=p(t(17633)),s=p(t(9041)),u=t(46206),c=p(t(45));function p(l){return l&&l.__esModule?l:{default:l}}function d(l){if((0,r.default)(l)===u.auto)return[];var g=(0,e.default)(l);return[(0,o.default)(l),g,(0,o.default)(g)]}function i(l){var g=l.state,f=l.options,h=l.name;if(!g.modifiersData[h]._skip){for(var m=f.mainAxis,b=m===void 0?!0:m,I=f.altAxis,O=I===void 0?!0:I,C=f.fallbackPlacements,y=f.padding,S=f.boundary,T=f.rootBoundary,N=f.altBoundary,M=f.flipVariations,w=M===void 0?!0:M,L=f.allowedAutoPlacements,B=g.options.placement,V=(0,r.default)(B),x=V===B,$=C||(x||!w?[(0,e.default)(B)]:d(B)),G=[B].concat($).reduce(function(nt,z){return nt.concat((0,r.default)(z)===u.auto?(0,s.default)(g,{placement:z,boundary:S,rootBoundary:T,padding:y,flipVariations:w,allowedAutoPlacements:L}):z)},[]),D=g.rects.reference,j=g.rects.popper,U=new Map,Y=!0,K=G[0],H=0;H=0,Q=k?"width":"height",it=(0,a.default)(g,{placement:rt,boundary:S,rootBoundary:T,altBoundary:N,padding:y}),vt=k?ct?u.right:u.left:ct?u.bottom:u.top;D[Q]>j[Q]&&(vt=(0,e.default)(vt));var ft=(0,e.default)(vt),J=[];if(b&&J.push(it[lt]<=0),O&&J.push(it[vt]<=0,it[ft]<=0),J.every(function(nt){return nt})){K=rt,Y=!1;break}U.set(rt,J)}if(Y)for(var at=w?3:1,st=function(){function nt(z){var Z=G.find(function(et){var ht=U.get(et);if(ht)return ht.slice(0,z).every(function(St){return St})});if(Z)return K=Z,"break"}return nt}(),mt=at;mt>0;mt--){var ot=st(mt);if(ot==="break")break}g.placement!==K&&(g.modifiersData[h]._skip=!0,g.placement=K,g.reset=!0)}}var v=n.default={name:"flip",enabled:!0,phase:"main",fn:i,requiresIfExists:["offset"],data:{_skip:!1}}},83761:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=t(46206),r=o(t(17633));function o(p){return p&&p.__esModule?p:{default:p}}function a(p,d,i){return i===void 0&&(i={x:0,y:0}),{top:p.top-d.height-i.y,right:p.right-d.width+i.x,bottom:p.bottom-d.height+i.y,left:p.left-d.width-i.x}}function s(p){return[e.top,e.right,e.bottom,e.left].some(function(d){return p[d]>=0})}function u(p){var d=p.state,i=p.name,v=d.rects.reference,l=d.rects.popper,g=d.modifiersData.preventOverflow,f=(0,r.default)(d,{elementContext:"reference"}),h=(0,r.default)(d,{altBoundary:!0}),m=a(f,v),b=a(h,l,g),I=s(m),O=s(b);d.modifiersData[i]={referenceClippingOffsets:m,popperEscapeOffsets:b,isReferenceHidden:I,hasPopperEscaped:O},d.attributes.popper=Object.assign({},d.attributes.popper,{"data-popper-reference-hidden":I,"data-popper-escaped":O})}var c=n.default={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:u}},39805:function(E,n,t){"use strict";n.__esModule=!0,n.preventOverflow=n.popperOffsets=n.offset=n.hide=n.flip=n.eventListeners=n.computeStyles=n.arrow=n.applyStyles=void 0;var e=i(t(19975));n.applyStyles=e.default;var r=i(t(52744));n.arrow=r.default;var o=i(t(59894));n.computeStyles=o.default;var a=i(t(36692));n.eventListeners=a.default;var s=i(t(23798));n.flip=s.default;var u=i(t(83761));n.hide=u.default;var c=i(t(61410));n.offset=c.default;var p=i(t(40107));n.popperOffsets=p.default;var d=i(t(75137));n.preventOverflow=d.default;function i(v){return v&&v.__esModule?v:{default:v}}},61410:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0,n.distanceAndSkiddingToXY=a;var e=o(t(83104)),r=t(46206);function o(c){return c&&c.__esModule?c:{default:c}}function a(c,p,d){var i=(0,e.default)(c),v=[r.left,r.top].indexOf(i)>=0?-1:1,l=typeof d=="function"?d(Object.assign({},p,{placement:c})):d,g=l[0],f=l[1];return g=g||0,f=(f||0)*v,[r.left,r.right].indexOf(i)>=0?{x:f,y:g}:{x:g,y:f}}function s(c){var p=c.state,d=c.options,i=c.name,v=d.offset,l=v===void 0?[0,0]:v,g=r.placements.reduce(function(b,I){return b[I]=a(I,p.rects,l),b},{}),f=g[p.placement],h=f.x,m=f.y;p.modifiersData.popperOffsets!=null&&(p.modifiersData.popperOffsets.x+=h,p.modifiersData.popperOffsets.y+=m),p.modifiersData[i]=g}var u=n.default={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:s}},40107:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=r(t(89951));function r(s){return s&&s.__esModule?s:{default:s}}function o(s){var u=s.state,c=s.name;u.modifiersData[c]=(0,e.default)({reference:u.rects.reference,element:u.rects.popper,strategy:"absolute",placement:u.placement})}var a=n.default={name:"popperOffsets",enabled:!0,phase:"read",fn:o,data:{}}},75137:function(E,n,t){"use strict";n.__esModule=!0,n.default=void 0;var e=t(46206),r=l(t(83104)),o=l(t(41199)),a=l(t(28066)),s=t(28595),u=l(t(28811)),c=l(t(44896)),p=l(t(17633)),d=l(t(45)),i=l(t(34780)),v=t(63618);function l(h){return h&&h.__esModule?h:{default:h}}function g(h){var m=h.state,b=h.options,I=h.name,O=b.mainAxis,C=O===void 0?!0:O,y=b.altAxis,S=y===void 0?!1:y,T=b.boundary,N=b.rootBoundary,M=b.altBoundary,w=b.padding,L=b.tether,B=L===void 0?!0:L,V=b.tetherOffset,x=V===void 0?0:V,$=(0,p.default)(m,{boundary:T,rootBoundary:N,padding:w,altBoundary:M}),G=(0,r.default)(m.placement),D=(0,d.default)(m.placement),j=!D,U=(0,o.default)(G),Y=(0,a.default)(U),K=m.modifiersData.popperOffsets,H=m.rects.reference,rt=m.rects.popper,lt=typeof x=="function"?x(Object.assign({},m.rects,{placement:m.placement})):x,ct=typeof lt=="number"?{mainAxis:lt,altAxis:lt}:Object.assign({mainAxis:0,altAxis:0},lt),k=m.modifiersData.offset?m.modifiersData.offset[m.placement]:null,Q={x:0,y:0};if(K){if(C){var it,vt=U==="y"?e.top:e.left,ft=U==="y"?e.bottom:e.right,J=U==="y"?"height":"width",at=K[U],st=at+$[vt],mt=at-$[ft],ot=B?-rt[J]/2:0,nt=D===e.start?H[J]:rt[J],z=D===e.start?-rt[J]:-H[J],Z=m.elements.arrow,et=B&&Z?(0,u.default)(Z):{width:0,height:0},ht=m.modifiersData["arrow#persistent"]?m.modifiersData["arrow#persistent"].padding:(0,i.default)(),St=ht[vt],ut=ht[ft],yt=(0,s.within)(0,H[J],et[J]),Pt=j?H[J]/2-ot-yt-St-ct.mainAxis:nt-yt-St-ct.mainAxis,_=j?-H[J]/2+ot+yt+ut+ct.mainAxis:z+yt+ut+ct.mainAxis,pt=m.elements.arrow&&(0,c.default)(m.elements.arrow),Ct=pt?U==="y"?pt.clientTop||0:pt.clientLeft||0:0,At=(it=k==null?void 0:k[U])!=null?it:0,Dt=at+Pt-At-Ct,jt=at+_-At,It=(0,s.within)(B?(0,v.min)(st,Dt):st,at,B?(0,v.max)(mt,jt):mt);K[U]=It,Q[U]=It-at}if(S){var gt,Et=U==="x"?e.top:e.left,Ot=U==="x"?e.bottom:e.right,bt=K[Y],Nt=Y==="y"?"height":"width",Ft=bt+$[Et],Vt=bt-$[Ot],$t=[e.top,e.left].indexOf(G)!==-1,Wt=(gt=k==null?void 0:k[Y])!=null?gt:0,Gt=$t?Ft:bt-H[Nt]-rt[Nt]-Wt+ct.altAxis,Ht=$t?bt+H[Nt]+rt[Nt]-Wt-ct.altAxis:Vt,Jt=B&&$t?(0,s.withinMaxClamp)(Gt,bt,Ht):(0,s.within)(B?Gt:Ft,bt,B?Ht:Vt);K[Y]=Jt,Q[Y]=Jt-bt}m.modifiersData[I]=Q}}var f=n.default={name:"preventOverflow",enabled:!0,phase:"main",fn:g,requiresIfExists:["offset"]}},2473:function(E,n,t){"use strict";n.__esModule=!0,n.defaultModifiers=n.createPopper=void 0;var e=t(96376);n.popperGenerator=e.popperGenerator,n.detectOverflow=e.detectOverflow;var r=u(t(36692)),o=u(t(40107)),a=u(t(59894)),s=u(t(19975));function u(d){return d&&d.__esModule?d:{default:d}}var c=n.defaultModifiers=[r.default,o.default,a.default,s.default],p=n.createPopper=(0,e.popperGenerator)({defaultModifiers:c})},83312:function(E,n,t){"use strict";n.__esModule=!0;var e={createPopper:!0,createPopperLite:!0,defaultModifiers:!0,popperGenerator:!0,detectOverflow:!0};n.defaultModifiers=n.createPopperLite=n.createPopper=void 0;var r=t(96376);n.popperGenerator=r.popperGenerator,n.detectOverflow=r.detectOverflow;var o=f(t(36692)),a=f(t(40107)),s=f(t(59894)),u=f(t(19975)),c=f(t(61410)),p=f(t(23798)),d=f(t(75137)),i=f(t(52744)),v=f(t(83761)),l=t(2473);n.createPopperLite=l.createPopper;var g=t(39805);Object.keys(g).forEach(function(b){b==="default"||b==="__esModule"||Object.prototype.hasOwnProperty.call(e,b)||b in n&&n[b]===g[b]||(n[b]=g[b])});function f(b){return b&&b.__esModule?b:{default:b}}var h=n.defaultModifiers=[o.default,a.default,s.default,u.default,c.default,p.default,d.default,i.default,v.default],m=n.createPopperLite=n.createPopper=(0,r.popperGenerator)({defaultModifiers:h})},9041:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(45)),r=t(46206),o=s(t(17633)),a=s(t(83104));function s(c){return c&&c.__esModule?c:{default:c}}function u(c,p){p===void 0&&(p={});var d=p,i=d.placement,v=d.boundary,l=d.rootBoundary,g=d.padding,f=d.flipVariations,h=d.allowedAutoPlacements,m=h===void 0?r.placements:h,b=(0,e.default)(i),I=b?f?r.variationPlacements:r.variationPlacements.filter(function(y){return(0,e.default)(y)===b}):r.basePlacements,O=I.filter(function(y){return m.indexOf(y)>=0});O.length===0&&(O=I);var C=O.reduce(function(y,S){return y[S]=(0,o.default)(c,{placement:S,boundary:v,rootBoundary:l,padding:g})[(0,a.default)(S)],y},{});return Object.keys(C).sort(function(y,S){return C[y]-C[S]})}},89951:function(E,n,t){"use strict";n.__esModule=!0,n.default=u;var e=s(t(83104)),r=s(t(45)),o=s(t(41199)),a=t(46206);function s(c){return c&&c.__esModule?c:{default:c}}function u(c){var p=c.reference,d=c.element,i=c.placement,v=i?(0,e.default)(i):null,l=i?(0,r.default)(i):null,g=p.x+p.width/2-d.width/2,f=p.y+p.height/2-d.height/2,h;switch(v){case a.top:h={x:g,y:p.y-d.height};break;case a.bottom:h={x:g,y:p.y+p.height};break;case a.right:h={x:p.x+p.width,y:f};break;case a.left:h={x:p.x-d.width,y:f};break;default:h={x:p.x,y:p.y}}var m=v?(0,o.default)(v):null;if(m!=null){var b=m==="y"?"height":"width";switch(l){case a.start:h[m]=h[m]-(p[b]/2-d[b]/2);break;case a.end:h[m]=h[m]+(p[b]/2-d[b]/2);break;default:}}return h}},10579:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){var r;return function(){return r||(r=new Promise(function(o){Promise.resolve().then(function(){r=void 0,o(e())})})),r}}},17633:function(E,n,t){"use strict";n.__esModule=!0,n.default=v;var e=i(t(49035)),r=i(t(40600)),o=i(t(37786)),a=i(t(89951)),s=i(t(81666)),u=t(46206),c=t(75573),p=i(t(43286)),d=i(t(81447));function i(l){return l&&l.__esModule?l:{default:l}}function v(l,g){g===void 0&&(g={});var f=g,h=f.placement,m=h===void 0?l.placement:h,b=f.strategy,I=b===void 0?l.strategy:b,O=f.boundary,C=O===void 0?u.clippingParents:O,y=f.rootBoundary,S=y===void 0?u.viewport:y,T=f.elementContext,N=T===void 0?u.popper:T,M=f.altBoundary,w=M===void 0?!1:M,L=f.padding,B=L===void 0?0:L,V=(0,p.default)(typeof B!="number"?B:(0,d.default)(B,u.basePlacements)),x=N===u.popper?u.reference:u.popper,$=l.rects.popper,G=l.elements[w?x:N],D=(0,e.default)((0,c.isElement)(G)?G:G.contextElement||(0,r.default)(l.elements.popper),C,S,I),j=(0,o.default)(l.elements.reference),U=(0,a.default)({reference:j,element:$,strategy:"absolute",placement:m}),Y=(0,s.default)(Object.assign({},$,U)),K=N===u.popper?Y:j,H={top:D.top-K.top+V.top,bottom:K.bottom-D.bottom+V.bottom,left:D.left-K.left+V.left,right:K.right-D.right+V.right},rt=l.modifiersData.offset;if(N===u.popper&&rt){var lt=rt[m];Object.keys(H).forEach(function(ct){var k=[u.right,u.bottom].indexOf(ct)>=0?1:-1,Q=[u.top,u.bottom].indexOf(ct)>=0?"y":"x";H[ct]+=lt[Q]*k})}return H}},81447:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e,r){return r.reduce(function(o,a){return o[a]=e,o},{})}},28066:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return e==="x"?"y":"x"}},83104:function(E,n,t){"use strict";n.__esModule=!0,n.default=r;var e=t(46206);function r(o){return o.split("-")[0]}},34780:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(){return{top:0,right:0,bottom:0,left:0}}},41199:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}},71376:function(E,n){"use strict";n.__esModule=!0,n.default=e;var t={left:"right",right:"left",bottom:"top",top:"bottom"};function e(r){return r.replace(/left|right|bottom|top/g,function(o){return t[o]})}},86459:function(E,n){"use strict";n.__esModule=!0,n.default=e;var t={start:"end",end:"start"};function e(r){return r.replace(/start|end/g,function(o){return t[o]})}},45:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return e.split("-")[1]}},63618:function(E,n){"use strict";n.__esModule=!0,n.round=n.min=n.max=void 0;var t=n.max=Math.max,e=n.min=Math.min,r=n.round=Math.round},56500:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){var r=e.reduce(function(o,a){var s=o[a.name];return o[a.name]=s?Object.assign({},s,a,{options:Object.assign({},s.options,a.options),data:Object.assign({},s.data,a.data)}):a,o},{});return Object.keys(r).map(function(o){return r[o]})}},43286:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=r(t(34780));function r(a){return a&&a.__esModule?a:{default:a}}function o(a){return Object.assign({},(0,e.default)(),a)}},33118:function(E,n,t){"use strict";n.__esModule=!0,n.default=o;var e=t(46206);function r(a){var s=new Map,u=new Set,c=[];a.forEach(function(d){s.set(d.name,d)});function p(d){u.add(d.name);var i=[].concat(d.requires||[],d.requiresIfExists||[]);i.forEach(function(v){if(!u.has(v)){var l=s.get(v);l&&p(l)}}),c.push(d)}return a.forEach(function(d){u.has(d.name)||p(d)}),c}function o(a){var s=r(a);return e.modifierPhases.reduce(function(u,c){return u.concat(s.filter(function(p){return p.phase===c}))},[])}},81666:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},35366:function(E,n){"use strict";n.__esModule=!0,n.default=t;function t(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(r){return r.brand+"/"+r.version}).join(" "):navigator.userAgent}},28595:function(E,n,t){"use strict";n.__esModule=!0,n.within=r,n.withinMaxClamp=o;var e=t(63618);function r(a,s,u){return(0,e.max)(a,(0,e.min)(s,u))}function o(a,s,u){var c=r(a,s,u);return c>u?u:c}},22734:function(E){"use strict";/*! @license DOMPurify 2.5.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.5.0/LICENSE */(function(n,t){E.exports=t()})(void 0,function(){"use strict";function n(_){"@babel/helpers - typeof";return n=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(pt){return typeof pt}:function(pt){return pt&&typeof Symbol=="function"&&pt.constructor===Symbol&&pt!==Symbol.prototype?"symbol":typeof pt},n(_)}function t(_,pt){return t=Object.setPrototypeOf||function(){function Ct(At,Dt){return At.__proto__=Dt,At}return Ct}(),t(_,pt)}function e(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(_){return!1}}function r(_,pt,Ct){return e()?r=Reflect.construct:r=function(){function At(Dt,jt,It){var gt=[null];gt.push.apply(gt,jt);var Et=Function.bind.apply(Dt,gt),Ot=new Et;return It&&t(Ot,It.prototype),Ot}return At}(),r.apply(null,arguments)}function o(_){return a(_)||s(_)||u(_)||p()}function a(_){if(Array.isArray(_))return c(_)}function s(_){if(typeof Symbol!="undefined"&&_[Symbol.iterator]!=null||_["@@iterator"]!=null)return Array.from(_)}function u(_,pt){if(_){if(typeof _=="string")return c(_,pt);var Ct=Object.prototype.toString.call(_).slice(8,-1);if(Ct==="Object"&&_.constructor&&(Ct=_.constructor.name),Ct==="Map"||Ct==="Set")return Array.from(_);if(Ct==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ct))return c(_,pt)}}function c(_,pt){(pt==null||pt>_.length)&&(pt=_.length);for(var Ct=0,At=new Array(pt);Ct1?Ct-1:0),Dt=1;Dt/gm),st=h(/\${[\w\W]*}/gm),mt=h(/^data-[\-\w.\u00B7-\uFFFF]/),ot=h(/^aria-[\-\w]+$/),nt=h(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z=h(/^(?:\w+script|data):/i),Z=h(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),et=h(/^html$/i),ht=h(/^[a-z][.\w]*(-[.\w]+)+$/i),St=function(){function _(){return typeof window=="undefined"?null:window}return _}(),ut=function(){function _(pt,Ct){if(n(pt)!=="object"||typeof pt.createPolicy!="function")return null;var At=null,Dt="data-tt-policy-suffix";Ct.currentScript&&Ct.currentScript.hasAttribute(Dt)&&(At=Ct.currentScript.getAttribute(Dt));var jt="dompurify"+(At?"#"+At:"");try{return pt.createPolicy(jt,{createHTML:function(){function It(gt){return gt}return It}(),createScriptURL:function(){function It(gt){return gt}return It}()})}catch(It){return null}}return _}();function yt(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:St(),pt=function(){function A(P){return yt(P)}return A}();if(pt.version="2.5.0",pt.removed=[],!_||!_.document||_.document.nodeType!==9)return pt.isSupported=!1,pt;var Ct=_.document,At=_.document,Dt=_.DocumentFragment,jt=_.HTMLTemplateElement,It=_.Node,gt=_.Element,Et=_.NodeFilter,Ot=_.NamedNodeMap,bt=Ot===void 0?_.NamedNodeMap||_.MozNamedAttrMap:Ot,Nt=_.HTMLFormElement,Ft=_.DOMParser,Vt=_.trustedTypes,$t=gt.prototype,Wt=U($t,"cloneNode"),Gt=U($t,"nextSibling"),Ht=U($t,"childNodes"),Jt=U($t,"parentNode");if(typeof jt=="function"){var Le=At.createElement("template");Le.content&&Le.content.ownerDocument&&(At=Le.content.ownerDocument)}var qt=ut(Vt,Ct),Pe=qt?qt.createHTML(""):"",Ne=At,me=Ne.implementation,ye=Ne.createNodeIterator,an=Ne.createDocumentFragment,un=Ne.getElementsByTagName,Tn=Ct.importNode,Ye={};try{Ye=j(At).documentMode?At.documentMode:{}}catch(A){}var re={};pt.isSupported=typeof Jt=="function"&&me&&me.createHTMLDocument!==void 0&&Ye!==9;var Ke=J,He=at,Be=st,sn=mt,In=ot,cn=z,ln=Z,On=ht,Se=nt,zt=null,te=D({},[].concat(o(Y),o(K),o(H),o(lt),o(k))),Yt=null,Ee=D({},[].concat(o(Q),o(it),o(vt),o(ft))),kt=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),le=null,Ce=null,We=!0,ze=!0,fn=!1,dn=!0,be=!1,De=!0,fe=!1,Fe=!1,xe=!1,de=!1,Xt=!1,Ve=!1,vn=!0,ke=!1,hn="user-content-",ue=!0,Me=!1,Te={},Ie=null,Xe=D({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Qe=null,pn=D({},["audio","video","img","source","image","track"]),je=null,gn=D({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ee="http://www.w3.org/1998/Math/MathML",Ue="http://www.w3.org/2000/svg",se="http://www.w3.org/1999/xhtml",Oe=se,Ze=!1,Je=null,An=D({},[ee,Ue,se],N),ce,Pn=["application/xhtml+xml","text/html"],mn="text/html",Qt,Ae=null,Nn=At.createElement("form"),yn=function(){function A(P){return P instanceof RegExp||P instanceof Function}return A}(),_e=function(){function A(P){Ae&&Ae===P||((!P||n(P)!=="object")&&(P={}),P=j(P),ce=Pn.indexOf(P.PARSER_MEDIA_TYPE)===-1?ce=mn:ce=P.PARSER_MEDIA_TYPE,Qt=ce==="application/xhtml+xml"?N:T,zt="ALLOWED_TAGS"in P?D({},P.ALLOWED_TAGS,Qt):te,Yt="ALLOWED_ATTR"in P?D({},P.ALLOWED_ATTR,Qt):Ee,Je="ALLOWED_NAMESPACES"in P?D({},P.ALLOWED_NAMESPACES,N):An,je="ADD_URI_SAFE_ATTR"in P?D(j(gn),P.ADD_URI_SAFE_ATTR,Qt):gn,Qe="ADD_DATA_URI_TAGS"in P?D(j(pn),P.ADD_DATA_URI_TAGS,Qt):pn,Ie="FORBID_CONTENTS"in P?D({},P.FORBID_CONTENTS,Qt):Xe,le="FORBID_TAGS"in P?D({},P.FORBID_TAGS,Qt):{},Ce="FORBID_ATTR"in P?D({},P.FORBID_ATTR,Qt):{},Te="USE_PROFILES"in P?P.USE_PROFILES:!1,We=P.ALLOW_ARIA_ATTR!==!1,ze=P.ALLOW_DATA_ATTR!==!1,fn=P.ALLOW_UNKNOWN_PROTOCOLS||!1,dn=P.ALLOW_SELF_CLOSE_IN_ATTR!==!1,be=P.SAFE_FOR_TEMPLATES||!1,De=P.SAFE_FOR_XML!==!1,fe=P.WHOLE_DOCUMENT||!1,de=P.RETURN_DOM||!1,Xt=P.RETURN_DOM_FRAGMENT||!1,Ve=P.RETURN_TRUSTED_TYPE||!1,xe=P.FORCE_BODY||!1,vn=P.SANITIZE_DOM!==!1,ke=P.SANITIZE_NAMED_PROPS||!1,ue=P.KEEP_CONTENT!==!1,Me=P.IN_PLACE||!1,Se=P.ALLOWED_URI_REGEXP||Se,Oe=P.NAMESPACE||se,kt=P.CUSTOM_ELEMENT_HANDLING||{},P.CUSTOM_ELEMENT_HANDLING&&yn(P.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(kt.tagNameCheck=P.CUSTOM_ELEMENT_HANDLING.tagNameCheck),P.CUSTOM_ELEMENT_HANDLING&&yn(P.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(kt.attributeNameCheck=P.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),P.CUSTOM_ELEMENT_HANDLING&&typeof P.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(kt.allowCustomizedBuiltInElements=P.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),be&&(ze=!1),Xt&&(de=!0),Te&&(zt=D({},o(k)),Yt=[],Te.html===!0&&(D(zt,Y),D(Yt,Q)),Te.svg===!0&&(D(zt,K),D(Yt,it),D(Yt,ft)),Te.svgFilters===!0&&(D(zt,H),D(Yt,it),D(Yt,ft)),Te.mathMl===!0&&(D(zt,lt),D(Yt,vt),D(Yt,ft))),P.ADD_TAGS&&(zt===te&&(zt=j(zt)),D(zt,P.ADD_TAGS,Qt)),P.ADD_ATTR&&(Yt===Ee&&(Yt=j(Yt)),D(Yt,P.ADD_ATTR,Qt)),P.ADD_URI_SAFE_ATTR&&D(je,P.ADD_URI_SAFE_ATTR,Qt),P.FORBID_CONTENTS&&(Ie===Xe&&(Ie=j(Ie)),D(Ie,P.FORBID_CONTENTS,Qt)),ue&&(zt["#text"]=!0),fe&&D(zt,["html","head","body"]),zt.table&&(D(zt,["tbody"]),delete le.tbody),f&&f(P),Ae=P)}return A}(),Sn=D({},["mi","mo","mn","ms","mtext"]),oe=D({},["foreignobject","desc","title","annotation-xml"]),$e=D({},["title","style","font","a","script"]),we=D({},K);D(we,H),D(we,rt);var qe=D({},lt);D(qe,ct);var Mn=function(){function A(P){var R=Jt(P);(!R||!R.tagName)&&(R={namespaceURI:Oe,tagName:"template"});var F=T(P.tagName),W=T(R.tagName);return Je[P.namespaceURI]?P.namespaceURI===Ue?R.namespaceURI===se?F==="svg":R.namespaceURI===ee?F==="svg"&&(W==="annotation-xml"||Sn[W]):!!we[F]:P.namespaceURI===ee?R.namespaceURI===se?F==="math":R.namespaceURI===Ue?F==="math"&&oe[W]:!!qe[F]:P.namespaceURI===se?R.namespaceURI===Ue&&!oe[W]||R.namespaceURI===ee&&!Sn[W]?!1:!qe[F]&&($e[F]||!we[F]):!!(ce==="application/xhtml+xml"&&Je[P.namespaceURI]):!1}return A}(),ne=function(){function A(P){S(pt.removed,{element:P});try{P.parentNode.removeChild(P)}catch(R){try{P.outerHTML=Pe}catch(F){P.remove()}}}return A}(),Ge=function(){function A(P,R){try{S(pt.removed,{attribute:R.getAttributeNode(P),from:R})}catch(F){S(pt.removed,{attribute:null,from:R})}if(R.removeAttribute(P),P==="is"&&!Yt[P])if(de||Xt)try{ne(R)}catch(F){}else try{R.setAttribute(P,"")}catch(F){}}return A}(),En=function(){function A(P){var R,F;if(xe)P=""+P;else{var W=M(P,/^[\r\n\t ]+/);F=W&&W[0]}ce==="application/xhtml+xml"&&Oe===se&&(P=''+P+"");var q=qt?qt.createHTML(P):P;if(Oe===se)try{R=new Ft().parseFromString(q,ce)}catch(dt){}if(!R||!R.documentElement){R=me.createDocument(Oe,"template",null);try{R.documentElement.innerHTML=Ze?Pe:q}catch(dt){}}var tt=R.body||R.documentElement;return P&&F&&tt.insertBefore(At.createTextNode(F),tt.childNodes[0]||null),Oe===se?un.call(R,fe?"html":"body")[0]:fe?R.documentElement:tt}return A}(),Re=function(){function A(P){return ye.call(P.ownerDocument||P,P,Et.SHOW_ELEMENT|Et.SHOW_COMMENT|Et.SHOW_TEXT|Et.SHOW_PROCESSING_INSTRUCTION|Et.SHOW_CDATA_SECTION,null,!1)}return A}(),wn=function(){function A(P){return P instanceof Nt&&(typeof P.nodeName!="string"||typeof P.textContent!="string"||typeof P.removeChild!="function"||!(P.attributes instanceof bt)||typeof P.removeAttribute!="function"||typeof P.setAttribute!="function"||typeof P.namespaceURI!="string"||typeof P.insertBefore!="function"||typeof P.hasChildNodes!="function")}return A}(),he=function(){function A(P){return n(It)==="object"?P instanceof It:P&&n(P)==="object"&&typeof P.nodeType=="number"&&typeof P.nodeName=="string"}return A}(),ae=function(){function A(P,R,F){re[P]&&C(re[P],function(W){W.call(pt,R,F,Ae)})}return A}(),Cn=function(){function A(P){var R;if(ae("beforeSanitizeElements",P,null),wn(P)||V(/[\u0080-\uFFFF]/,P.nodeName))return ne(P),!0;var F=Qt(P.nodeName);if(ae("uponSanitizeElement",P,{tagName:F,allowedTags:zt}),P.hasChildNodes()&&!he(P.firstElementChild)&&(!he(P.content)||!he(P.content.firstElementChild))&&V(/<[/\w]/g,P.innerHTML)&&V(/<[/\w]/g,P.textContent)||F==="select"&&V(/